Skip to content

Commit 4d5792e

Browse files
committed
!fixup after rebase
1 parent 136e369 commit 4d5792e

File tree

4 files changed

+71
-53
lines changed

4 files changed

+71
-53
lines changed

llvm/include/llvm/Analysis/AssumeBundleQueries.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,12 @@ struct RetainedKnowledge {
104104
uint64_t ArgValue = 0;
105105
Value *IRArgValue = nullptr;
106106
Value *WasOn = nullptr;
107+
RetainedKnowledge(Attribute::AttrKind AttrKind = Attribute::None,
108+
uint64_t ArgValue = 0, Value *WasOn = nullptr)
109+
: AttrKind(AttrKind), ArgValue(ArgValue), WasOn(WasOn) {}
107110
bool operator==(RetainedKnowledge Other) const {
108111
return AttrKind == Other.AttrKind && WasOn == Other.WasOn &&
109-
ArgValue == Other.ArgValue;
112+
ArgValue == Other.ArgValue && IRArgValue == Other.IRArgValue;
110113
}
111114
bool operator!=(RetainedKnowledge Other) const { return !(*this == Other); }
112115
/// This is only intended for use in std::min/std::max between attribute that

llvm/lib/Analysis/AssumeBundleQueries.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,9 @@ llvm::getKnowledgeFromBundle(AssumeInst &Assume,
114114
};
115115
if (BOI.End - BOI.Begin > ABA_Argument)
116116
Result.ArgValue = GetArgOr1(0);
117-
Result.IRArgValue = getValueFromBundleOpInfo(Assume, BOI, ABA_Argument);
117+
Result.IRArgValue = bundleHasArgument(BOI, ABA_Argument)
118+
? getValueFromBundleOpInfo(Assume, BOI, ABA_Argument)
119+
: nullptr;
118120
if (Result.AttrKind == Attribute::Alignment)
119121
if (BOI.End - BOI.Begin > ABA_Argument + 1)
120122
Result.ArgValue = MinAlign(Result.ArgValue, GetArgOr1(1));

llvm/lib/Analysis/Loads.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ static bool isDereferenceableAndAlignedPointerViaAssumption(
4949
RetainedKnowledge DerefRK;
5050
bool IsAligned = Ptr->getPointerAlignment(DL) >= Alignment;
5151
return getKnowledgeForValue(
52-
Ptr, {Attribute::Dereferenceable, Attribute::Alignment}, AC,
52+
Ptr, {Attribute::Dereferenceable, Attribute::Alignment}, *AC,
5353
[&](RetainedKnowledge RK, Instruction *Assume, auto) {
5454
if (!isValidAssumeForContext(Assume, CtxI, DT))
5555
return false;
@@ -203,12 +203,12 @@ static bool isDereferenceableAndAlignedPointer(
203203
Size, DL, CtxI, AC, DT, TLI,
204204
Visited, MaxDepth);
205205

206-
return isDereferenceableAndAlignedPointerViaAssumption(
207-
V, Alignment,
208-
[Size](const RetainedKnowledge &RK) {
209-
return RK.ArgValue >= Size.getZExtValue();
210-
},
211-
DL, CtxI, AC, DT);
206+
return AC && isDereferenceableAndAlignedPointerViaAssumption(
207+
V, Alignment,
208+
[Size](const RetainedKnowledge &RK) {
209+
return RK.ArgValue >= Size.getZExtValue();
210+
},
211+
DL, CtxI, AC, DT);
212212
}
213213

214214
bool llvm::isDereferenceableAndAlignedPointer(

llvm/test/Transforms/LoopVectorize/dereferenceable-info-from-assumption-variable-size.ll

Lines changed: 57 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,14 @@ define void @deref_assumption_in_preheader_non_constant_trip_count_access_i8(ptr
1616
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
1717
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
1818
; CHECK: [[VECTOR_BODY]]:
19-
; CHECK-NEXT: [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]
19+
; CHECK-NEXT: [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
20+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP0]]
2021
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP0]]
2122
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i8, ptr [[TMP2]], i32 0
2223
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i8>, ptr [[TMP3]], align 1
2324
; CHECK-NEXT: [[TMP4:%.*]] = icmp sge <2 x i8> [[WIDE_LOAD]], zeroinitializer
24-
; CHECK-NEXT: [[TMP15:%.*]] = xor <2 x i1> [[TMP4]], splat (i1 true)
25-
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i1> [[TMP15]], i32 0
26-
; CHECK-NEXT: br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
27-
; CHECK: [[PRED_LOAD_IF]]:
28-
; CHECK-NEXT: [[TMP19:%.*]] = add i64 [[TMP0]], 0
29-
; CHECK-NEXT: [[TMP16:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP19]]
30-
; CHECK-NEXT: [[TMP17:%.*]] = load i8, ptr [[TMP16]], align 1
31-
; CHECK-NEXT: [[TMP18:%.*]] = insertelement <2 x i8> poison, i8 [[TMP17]], i32 0
32-
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
33-
; CHECK: [[PRED_LOAD_CONTINUE]]:
34-
; CHECK-NEXT: [[TMP9:%.*]] = phi <2 x i8> [ poison, %[[VECTOR_BODY]] ], [ [[TMP18]], %[[PRED_LOAD_IF]] ]
35-
; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x i1> [[TMP15]], i32 1
36-
; CHECK-NEXT: br i1 [[TMP10]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
37-
; CHECK: [[PRED_LOAD_IF1]]:
38-
; CHECK-NEXT: [[TMP11:%.*]] = add i64 [[TMP0]], 1
39-
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP11]]
40-
; CHECK-NEXT: [[TMP13:%.*]] = load i8, ptr [[TMP12]], align 1
41-
; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i8> [[TMP9]], i8 [[TMP13]], i32 1
42-
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
43-
; CHECK: [[PRED_LOAD_CONTINUE2]]:
44-
; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = phi <2 x i8> [ [[TMP9]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], %[[PRED_LOAD_IF1]] ]
25+
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[TMP1]], i32 0
26+
; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <2 x i8>, ptr [[TMP5]], align 1
4527
; CHECK-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP4]], <2 x i8> [[WIDE_LOAD]], <2 x i8> [[WIDE_LOAD1]]
4628
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i8, ptr [[C]], i64 [[TMP0]]
4729
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i8, ptr [[TMP6]], i32 0
@@ -117,32 +99,14 @@ define void @deref_assumption_in_preheader_non_constant_trip_count_access_i32(pt
11799
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
118100
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
119101
; CHECK: [[VECTOR_BODY]]:
120-
; CHECK-NEXT: [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]
102+
; CHECK-NEXT: [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
103+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[A]], i64 [[TMP0]]
121104
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]
122105
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 0
123106
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP3]], align 1
124107
; CHECK-NEXT: [[TMP4:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer
125-
; CHECK-NEXT: [[TMP15:%.*]] = xor <2 x i1> [[TMP4]], splat (i1 true)
126-
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i1> [[TMP15]], i32 0
127-
; CHECK-NEXT: br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
128-
; CHECK: [[PRED_LOAD_IF]]:
129-
; CHECK-NEXT: [[TMP19:%.*]] = add i64 [[TMP0]], 0
130-
; CHECK-NEXT: [[TMP16:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP19]]
131-
; CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 1
132-
; CHECK-NEXT: [[TMP18:%.*]] = insertelement <2 x i32> poison, i32 [[TMP17]], i32 0
133-
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
134-
; CHECK: [[PRED_LOAD_CONTINUE]]:
135-
; CHECK-NEXT: [[TMP9:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP18]], %[[PRED_LOAD_IF]] ]
136-
; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x i1> [[TMP15]], i32 1
137-
; CHECK-NEXT: br i1 [[TMP10]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
138-
; CHECK: [[PRED_LOAD_IF1]]:
139-
; CHECK-NEXT: [[TMP11:%.*]] = add i64 [[TMP0]], 1
140-
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP11]]
141-
; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 1
142-
; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i32> [[TMP9]], i32 [[TMP13]], i32 1
143-
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
144-
; CHECK: [[PRED_LOAD_CONTINUE2]]:
145-
; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = phi <2 x i32> [ [[TMP9]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], %[[PRED_LOAD_IF1]] ]
108+
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i32, ptr [[TMP1]], i32 0
109+
; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = load <2 x i32>, ptr [[TMP5]], align 1
146110
; CHECK-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP4]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[WIDE_LOAD1]]
147111
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]
148112
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[TMP6]], i32 0
@@ -219,6 +183,34 @@ define void @deref_assumption_in_preheader_too_small_non_constant_trip_count_acc
219183
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
220184
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
221185
; CHECK: [[VECTOR_BODY]]:
186+
; CHECK-NEXT: [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]
187+
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]
188+
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 0
189+
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP3]], align 1
190+
; CHECK-NEXT: [[TMP4:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer
191+
; CHECK-NEXT: [[TMP15:%.*]] = xor <2 x i1> [[TMP4]], splat (i1 true)
192+
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i1> [[TMP15]], i32 0
193+
; CHECK-NEXT: br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
194+
; CHECK: [[PRED_LOAD_IF]]:
195+
; CHECK-NEXT: [[TMP19:%.*]] = add i64 [[TMP0]], 0
196+
; CHECK-NEXT: [[TMP16:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP19]]
197+
; CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 1
198+
; CHECK-NEXT: [[TMP18:%.*]] = insertelement <2 x i32> poison, i32 [[TMP17]], i32 0
199+
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
200+
; CHECK: [[PRED_LOAD_CONTINUE]]:
201+
; CHECK-NEXT: [[TMP9:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP18]], %[[PRED_LOAD_IF]] ]
202+
; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x i1> [[TMP15]], i32 1
203+
; CHECK-NEXT: br i1 [[TMP10]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
204+
; CHECK: [[PRED_LOAD_IF1]]:
205+
; CHECK-NEXT: [[TMP11:%.*]] = add i64 [[TMP0]], 1
206+
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP11]]
207+
; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 1
208+
; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i32> [[TMP9]], i32 [[TMP13]], i32 1
209+
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
210+
; CHECK: [[PRED_LOAD_CONTINUE2]]:
211+
; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = phi <2 x i32> [ [[TMP9]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], %[[PRED_LOAD_IF1]] ]
212+
; CHECK-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP4]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[WIDE_LOAD1]]
213+
; CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]
222214
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[TMP6]], i32 0
223215
; CHECK-NEXT: store <2 x i32> [[PREDPHI]], ptr [[TMP7]], align 1
224216
; CHECK-NEXT: [[INDEX_NEXT]] = add nuw i64 [[TMP0]], 2
@@ -291,8 +283,29 @@ define void @deref_assumption_in_preheader_too_small2_non_constant_trip_count_ac
291283
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
292284
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
293285
; CHECK: [[VECTOR_BODY]]:
286+
; CHECK-NEXT: [[TMP0:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]
287+
; CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds i32, ptr [[B]], i64 [[TMP0]]
288+
; CHECK-NEXT: [[TMP3:%.*]] = getelementptr inbounds i32, ptr [[TMP2]], i32 0
289+
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP3]], align 1
290+
; CHECK-NEXT: [[TMP4:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer
291+
; CHECK-NEXT: [[TMP15:%.*]] = xor <2 x i1> [[TMP4]], splat (i1 true)
292+
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <2 x i1> [[TMP15]], i32 0
294293
; CHECK-NEXT: br i1 [[TMP5]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
295294
; CHECK: [[PRED_LOAD_IF]]:
295+
; CHECK-NEXT: [[TMP19:%.*]] = add i64 [[TMP0]], 0
296+
; CHECK-NEXT: [[TMP16:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP19]]
297+
; CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[TMP16]], align 1
298+
; CHECK-NEXT: [[TMP18:%.*]] = insertelement <2 x i32> poison, i32 [[TMP17]], i32 0
299+
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
300+
; CHECK: [[PRED_LOAD_CONTINUE]]:
301+
; CHECK-NEXT: [[TMP9:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP18]], %[[PRED_LOAD_IF]] ]
302+
; CHECK-NEXT: [[TMP10:%.*]] = extractelement <2 x i1> [[TMP15]], i32 1
303+
; CHECK-NEXT: br i1 [[TMP10]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
304+
; CHECK: [[PRED_LOAD_IF1]]:
305+
; CHECK-NEXT: [[TMP11:%.*]] = add i64 [[TMP0]], 1
306+
; CHECK-NEXT: [[TMP12:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 [[TMP11]]
307+
; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 1
308+
; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i32> [[TMP9]], i32 [[TMP13]], i32 1
296309
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
297310
; CHECK: [[PRED_LOAD_CONTINUE2]]:
298311
; CHECK-NEXT: [[WIDE_LOAD1:%.*]] = phi <2 x i32> [ [[TMP9]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], %[[PRED_LOAD_IF1]] ]

0 commit comments

Comments
 (0)