Skip to content

Commit c6de350

Browse files
committed
[Loads] Check loop-varying pointer in isDereferenceableAndAlignedInLoop.
If the load executes in a successor of the header, check if the loop-varying pointer is dereferenceable and aligned the branch in the header. This is stricter than necessary and we could instead look for any block in the loop that executes unconditionally and post-dominates the block with the access. Also moves up the assumption check to make sure it is done for each pointer in the chain.
1 parent 3ba46dd commit c6de350

File tree

2 files changed

+63
-101
lines changed

2 files changed

+63
-101
lines changed

llvm/lib/Analysis/Loads.cpp

Lines changed: 38 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,31 @@ static bool isDereferenceableAndAlignedPointer(
4747
if (!Visited.insert(V).second)
4848
return false;
4949

50+
if (CtxI) {
51+
/// Look through assumes to see if both dereferencability and alignment can
52+
/// be proven by an assume if needed.
53+
RetainedKnowledge AlignRK;
54+
RetainedKnowledge DerefRK;
55+
bool IsAligned = V->getPointerAlignment(DL) >= Alignment;
56+
if (getKnowledgeForValue(
57+
V, {Attribute::Dereferenceable, Attribute::Alignment}, AC,
58+
[&](RetainedKnowledge RK, Instruction *Assume, auto) {
59+
if (!isValidAssumeForContext(Assume, CtxI, DT))
60+
return false;
61+
if (RK.AttrKind == Attribute::Alignment)
62+
AlignRK = std::max(AlignRK, RK);
63+
if (RK.AttrKind == Attribute::Dereferenceable)
64+
DerefRK = std::max(DerefRK, RK);
65+
IsAligned |= AlignRK && AlignRK.ArgValue >= Alignment.value();
66+
if (IsAligned && DerefRK &&
67+
DerefRK.ArgValue >= Size.getZExtValue())
68+
return true; // We have found what we needed so we stop looking
69+
return false; // Other assumes may have better information. so
70+
// keep looking
71+
}))
72+
return true;
73+
}
74+
5075
// Note that it is not safe to speculate into a malloc'd region because
5176
// malloc may return null.
5277

@@ -168,31 +193,6 @@ static bool isDereferenceableAndAlignedPointer(
168193
Size, DL, CtxI, AC, DT, TLI,
169194
Visited, MaxDepth);
170195

171-
if (CtxI) {
172-
/// Look through assumes to see if both dereferencability and alignment can
173-
/// be proven by an assume if needed.
174-
RetainedKnowledge AlignRK;
175-
RetainedKnowledge DerefRK;
176-
bool IsAligned = V->getPointerAlignment(DL) >= Alignment;
177-
if (getKnowledgeForValue(
178-
V, {Attribute::Dereferenceable, Attribute::Alignment}, AC,
179-
[&](RetainedKnowledge RK, Instruction *Assume, auto) {
180-
if (!isValidAssumeForContext(Assume, CtxI, DT))
181-
return false;
182-
if (RK.AttrKind == Attribute::Alignment)
183-
AlignRK = std::max(AlignRK, RK);
184-
if (RK.AttrKind == Attribute::Dereferenceable)
185-
DerefRK = std::max(DerefRK, RK);
186-
IsAligned |= AlignRK && AlignRK.ArgValue >= Alignment.value();
187-
if (IsAligned && DerefRK &&
188-
DerefRK.ArgValue >= Size.getZExtValue())
189-
return true; // We have found what we needed so we stop looking
190-
return false; // Other assumes may have better information. so
191-
// keep looking
192-
}))
193-
return true;
194-
}
195-
196196
// If we don't know, assume the worst.
197197
return false;
198198
}
@@ -290,6 +290,19 @@ bool llvm::isDereferenceableAndAlignedInLoop(
290290
return isDereferenceableAndAlignedPointer(Ptr, Alignment, EltSize, DL,
291291
HeaderFirstNonPHI, AC, &DT);
292292

293+
// If the load executes in a successor of the header, check if the
294+
// loop-varying pointer is dereferenceable and aligned at the branch in the
295+
// header. This is stricter than necessary and we could instead look for any
296+
// block in the loop that executes unconditionally and post-dominates the
297+
// block with the access.
298+
if (LI->getParent() != L->getHeader() &&
299+
L->getExitingBlock() == L->getLoopLatch() &&
300+
isDereferenceableAndAlignedPointer(Ptr, Alignment, EltSize, DL,
301+
L->getHeader()->getTerminator(), AC,
302+
&DT)) {
303+
return true;
304+
}
305+
293306
// Otherwise, check to see if we have a repeating access pattern where we can
294307
// prove that all accesses are well aligned and dereferenceable.
295308
auto *AddRec = dyn_cast<SCEVAddRecExpr>(SE.getSCEV(Ptr));

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

Lines changed: 25 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ define void @deref_assumption_in_header_constant_trip_count(ptr noalias %a, ptr
1111
; CHECK: [[VECTOR_PH]]:
1212
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
1313
; CHECK: [[VECTOR_BODY]]:
14-
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]
15-
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2]] ]
14+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
15+
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
1616
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0
1717
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[A]], <2 x i64> [[VEC_IND]]
1818
; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0
@@ -23,25 +23,8 @@ define void @deref_assumption_in_header_constant_trip_count(ptr noalias %a, ptr
2323
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[TMP6]], i32 0
2424
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP7]], align 4
2525
; CHECK-NEXT: [[TMP9:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer
26-
; CHECK-NEXT: [[TMP10:%.*]] = xor <2 x i1> [[TMP9]], splat (i1 true)
27-
; CHECK-NEXT: [[TMP8:%.*]] = extractelement <2 x i1> [[TMP10]], i32 0
28-
; CHECK-NEXT: br i1 [[TMP8]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
29-
; CHECK: [[PRED_LOAD_IF]]:
30-
; CHECK-NEXT: [[TMP21:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0
31-
; CHECK-NEXT: [[TMP22:%.*]] = load i32, ptr [[TMP21]], align 4
32-
; CHECK-NEXT: [[TMP11:%.*]] = insertelement <2 x i32> poison, i32 [[TMP22]], i32 0
33-
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
34-
; CHECK: [[PRED_LOAD_CONTINUE]]:
35-
; CHECK-NEXT: [[TMP12:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP11]], %[[PRED_LOAD_IF]] ]
36-
; CHECK-NEXT: [[TMP13:%.*]] = extractelement <2 x i1> [[TMP10]], i32 1
37-
; CHECK-NEXT: br i1 [[TMP13]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
38-
; CHECK: [[PRED_LOAD_IF1]]:
39-
; CHECK-NEXT: [[TMP26:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1
40-
; CHECK-NEXT: [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 4
41-
; CHECK-NEXT: [[TMP16:%.*]] = insertelement <2 x i32> [[TMP12]], i32 [[TMP27]], i32 1
42-
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
43-
; CHECK: [[PRED_LOAD_CONTINUE2]]:
44-
; CHECK-NEXT: [[TMP17:%.*]] = phi <2 x i32> [ [[TMP12]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP16]], %[[PRED_LOAD_IF1]] ]
26+
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i32, ptr [[TMP4]], i32 0
27+
; CHECK-NEXT: [[TMP17:%.*]] = load <2 x i32>, ptr [[TMP8]], align 4
4528
; CHECK-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP9]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[TMP17]]
4629
; CHECK-NEXT: [[TMP30:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]
4730
; CHECK-NEXT: [[TMP31:%.*]] = getelementptr inbounds i32, ptr [[TMP30]], i32 0
@@ -290,8 +273,8 @@ define void @deref_assumption_in_header_constant_trip_count_align_1(ptr noalias
290273
; CHECK: [[VECTOR_PH]]:
291274
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
292275
; CHECK: [[VECTOR_BODY]]:
293-
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]
294-
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2]] ]
276+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
277+
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
295278
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0
296279
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[A]], <2 x i64> [[VEC_IND]]
297280
; CHECK-NEXT: [[TMP2:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0
@@ -302,25 +285,8 @@ define void @deref_assumption_in_header_constant_trip_count_align_1(ptr noalias
302285
; CHECK-NEXT: [[TMP5:%.*]] = getelementptr inbounds i32, ptr [[TMP4]], i32 0
303286
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP5]], align 4
304287
; CHECK-NEXT: [[TMP6:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer
305-
; CHECK-NEXT: [[TMP7:%.*]] = xor <2 x i1> [[TMP6]], splat (i1 true)
306-
; CHECK-NEXT: [[TMP8:%.*]] = extractelement <2 x i1> [[TMP7]], i32 0
307-
; CHECK-NEXT: br i1 [[TMP8]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
308-
; CHECK: [[PRED_LOAD_IF]]:
309-
; CHECK-NEXT: [[TMP9:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0
310-
; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[TMP9]], align 1
311-
; CHECK-NEXT: [[TMP11:%.*]] = insertelement <2 x i32> poison, i32 [[TMP10]], i32 0
312-
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
313-
; CHECK: [[PRED_LOAD_CONTINUE]]:
314-
; CHECK-NEXT: [[TMP12:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP11]], %[[PRED_LOAD_IF]] ]
315-
; CHECK-NEXT: [[TMP13:%.*]] = extractelement <2 x i1> [[TMP7]], i32 1
316-
; CHECK-NEXT: br i1 [[TMP13]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
317-
; CHECK: [[PRED_LOAD_IF1]]:
318-
; CHECK-NEXT: [[TMP14:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1
319-
; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[TMP14]], align 1
320-
; CHECK-NEXT: [[TMP16:%.*]] = insertelement <2 x i32> [[TMP12]], i32 [[TMP15]], i32 1
321-
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
322-
; CHECK: [[PRED_LOAD_CONTINUE2]]:
323-
; CHECK-NEXT: [[TMP17:%.*]] = phi <2 x i32> [ [[TMP12]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP16]], %[[PRED_LOAD_IF1]] ]
288+
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr i32, ptr [[TMP2]], i32 0
289+
; CHECK-NEXT: [[TMP17:%.*]] = load <2 x i32>, ptr [[TMP7]], align 1
324290
; CHECK-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP6]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[TMP17]]
325291
; CHECK-NEXT: [[TMP18:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]
326292
; CHECK-NEXT: [[TMP19:%.*]] = getelementptr inbounds i32, ptr [[TMP18]], i32 0
@@ -606,17 +572,17 @@ define void @deref_assumption_in_then_constant_trip_count(ptr noalias %a, ptr no
606572
; CHECK-NEXT: br i1 [[TMP6]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
607573
; CHECK: [[PRED_LOAD_IF]]:
608574
; CHECK-NEXT: [[TMP17:%.*]] = extractelement <2 x ptr> [[TMP5]], i32 0
609-
; CHECK-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4
610-
; CHECK-NEXT: [[TMP9:%.*]] = insertelement <2 x i32> poison, i32 [[TMP18]], i32 0
575+
; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP17]], align 4
576+
; CHECK-NEXT: [[TMP9:%.*]] = insertelement <2 x i32> poison, i32 [[TMP8]], i32 0
611577
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
612578
; CHECK: [[PRED_LOAD_CONTINUE]]:
613579
; CHECK-NEXT: [[TMP10:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP9]], %[[PRED_LOAD_IF]] ]
614580
; CHECK-NEXT: [[TMP11:%.*]] = extractelement <2 x i1> [[TMP4]], i32 1
615581
; CHECK-NEXT: br i1 [[TMP11]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
616582
; CHECK: [[PRED_LOAD_IF1]]:
617-
; CHECK-NEXT: [[TMP22:%.*]] = extractelement <2 x ptr> [[TMP5]], i32 1
618-
; CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4
619-
; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i32> [[TMP10]], i32 [[TMP23]], i32 1
583+
; CHECK-NEXT: [[TMP12:%.*]] = extractelement <2 x ptr> [[TMP5]], i32 1
584+
; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4
585+
; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i32> [[TMP10]], i32 [[TMP13]], i32 1
620586
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
621587
; CHECK: [[PRED_LOAD_CONTINUE2]]:
622588
; CHECK-NEXT: [[TMP15:%.*]] = phi <2 x i32> [ [[TMP10]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], %[[PRED_LOAD_IF1]] ]
@@ -703,24 +669,24 @@ define void @deref_assumption_in_latch_constant_trip_count(ptr noalias %a, ptr n
703669
; CHECK-NEXT: br i1 [[TMP6]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
704670
; CHECK: [[PRED_LOAD_IF]]:
705671
; CHECK-NEXT: [[TMP17:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0
706-
; CHECK-NEXT: [[TMP18:%.*]] = load i32, ptr [[TMP17]], align 4
707-
; CHECK-NEXT: [[TMP9:%.*]] = insertelement <2 x i32> poison, i32 [[TMP18]], i32 0
672+
; CHECK-NEXT: [[TMP8:%.*]] = load i32, ptr [[TMP17]], align 4
673+
; CHECK-NEXT: [[TMP9:%.*]] = insertelement <2 x i32> poison, i32 [[TMP8]], i32 0
708674
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
709675
; CHECK: [[PRED_LOAD_CONTINUE]]:
710676
; CHECK-NEXT: [[TMP10:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP9]], %[[PRED_LOAD_IF]] ]
711677
; CHECK-NEXT: [[TMP11:%.*]] = extractelement <2 x i1> [[TMP5]], i32 1
712678
; CHECK-NEXT: br i1 [[TMP11]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
713679
; CHECK: [[PRED_LOAD_IF1]]:
714-
; CHECK-NEXT: [[TMP22:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1
715-
; CHECK-NEXT: [[TMP23:%.*]] = load i32, ptr [[TMP22]], align 4
716-
; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i32> [[TMP10]], i32 [[TMP23]], i32 1
680+
; CHECK-NEXT: [[TMP12:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1
681+
; CHECK-NEXT: [[TMP13:%.*]] = load i32, ptr [[TMP12]], align 4
682+
; CHECK-NEXT: [[TMP14:%.*]] = insertelement <2 x i32> [[TMP10]], i32 [[TMP13]], i32 1
717683
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
718684
; CHECK: [[PRED_LOAD_CONTINUE2]]:
719685
; CHECK-NEXT: [[TMP15:%.*]] = phi <2 x i32> [ [[TMP10]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP14]], %[[PRED_LOAD_IF1]] ]
720686
; CHECK-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP4]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[TMP15]]
721-
; CHECK-NEXT: [[TMP28:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0
722-
; CHECK-NEXT: [[TMP20:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0
723-
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[TMP28]], i64 4), "dereferenceable"(ptr [[TMP20]], i64 4) ]
687+
; CHECK-NEXT: [[TMP16:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0
688+
; CHECK-NEXT: [[TMP18:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0
689+
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[TMP16]], i64 4), "dereferenceable"(ptr [[TMP18]], i64 4) ]
724690
; CHECK-NEXT: [[TMP29:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1
725691
; CHECK-NEXT: [[TMP19:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1
726692
; CHECK-NEXT: call void @llvm.assume(i1 true) [ "align"(ptr [[TMP29]], i64 4), "dereferenceable"(ptr [[TMP19]], i64 4) ]
@@ -796,8 +762,8 @@ define void @deref_assumption_in_header_variable_trip_count(ptr noalias %a, ptr
796762
; CHECK-NEXT: [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
797763
; CHECK-NEXT: br label %[[VECTOR_BODY:.*]]
798764
; CHECK: [[VECTOR_BODY]]:
799-
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2:.*]] ]
800-
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[PRED_LOAD_CONTINUE2]] ]
765+
; CHECK-NEXT: [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
766+
; CHECK-NEXT: [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
801767
; CHECK-NEXT: [[TMP0:%.*]] = add i64 [[INDEX]], 0
802768
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[A]], <2 x i64> [[VEC_IND]]
803769
; CHECK-NEXT: [[TMP4:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0
@@ -808,25 +774,8 @@ define void @deref_assumption_in_header_variable_trip_count(ptr noalias %a, ptr
808774
; CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds i32, ptr [[TMP6]], i32 0
809775
; CHECK-NEXT: [[WIDE_LOAD:%.*]] = load <2 x i32>, ptr [[TMP7]], align 4
810776
; CHECK-NEXT: [[TMP9:%.*]] = icmp sge <2 x i32> [[WIDE_LOAD]], zeroinitializer
811-
; CHECK-NEXT: [[TMP10:%.*]] = xor <2 x i1> [[TMP9]], splat (i1 true)
812-
; CHECK-NEXT: [[TMP8:%.*]] = extractelement <2 x i1> [[TMP10]], i32 0
813-
; CHECK-NEXT: br i1 [[TMP8]], label %[[PRED_LOAD_IF:.*]], label %[[PRED_LOAD_CONTINUE:.*]]
814-
; CHECK: [[PRED_LOAD_IF]]:
815-
; CHECK-NEXT: [[TMP21:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 0
816-
; CHECK-NEXT: [[TMP22:%.*]] = load i32, ptr [[TMP21]], align 4
817-
; CHECK-NEXT: [[TMP11:%.*]] = insertelement <2 x i32> poison, i32 [[TMP22]], i32 0
818-
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE]]
819-
; CHECK: [[PRED_LOAD_CONTINUE]]:
820-
; CHECK-NEXT: [[TMP12:%.*]] = phi <2 x i32> [ poison, %[[VECTOR_BODY]] ], [ [[TMP11]], %[[PRED_LOAD_IF]] ]
821-
; CHECK-NEXT: [[TMP13:%.*]] = extractelement <2 x i1> [[TMP10]], i32 1
822-
; CHECK-NEXT: br i1 [[TMP13]], label %[[PRED_LOAD_IF1:.*]], label %[[PRED_LOAD_CONTINUE2]]
823-
; CHECK: [[PRED_LOAD_IF1]]:
824-
; CHECK-NEXT: [[TMP26:%.*]] = extractelement <2 x ptr> [[TMP1]], i32 1
825-
; CHECK-NEXT: [[TMP27:%.*]] = load i32, ptr [[TMP26]], align 4
826-
; CHECK-NEXT: [[TMP16:%.*]] = insertelement <2 x i32> [[TMP12]], i32 [[TMP27]], i32 1
827-
; CHECK-NEXT: br label %[[PRED_LOAD_CONTINUE2]]
828-
; CHECK: [[PRED_LOAD_CONTINUE2]]:
829-
; CHECK-NEXT: [[TMP17:%.*]] = phi <2 x i32> [ [[TMP12]], %[[PRED_LOAD_CONTINUE]] ], [ [[TMP16]], %[[PRED_LOAD_IF1]] ]
777+
; CHECK-NEXT: [[TMP8:%.*]] = getelementptr i32, ptr [[TMP4]], i32 0
778+
; CHECK-NEXT: [[TMP17:%.*]] = load <2 x i32>, ptr [[TMP8]], align 4
830779
; CHECK-NEXT: [[PREDPHI:%.*]] = select <2 x i1> [[TMP9]], <2 x i32> [[WIDE_LOAD]], <2 x i32> [[TMP17]]
831780
; CHECK-NEXT: [[TMP30:%.*]] = getelementptr inbounds i32, ptr [[C]], i64 [[TMP0]]
832781
; CHECK-NEXT: [[TMP31:%.*]] = getelementptr inbounds i32, ptr [[TMP30]], i32 0

0 commit comments

Comments
 (0)