Skip to content

Commit a7f35d5

Browse files
authored
[SCEV] Extend isImpliedCondOperandsViaRanges to independent predicates (#71110)
As far as I can tell, there's nothing in this code which actually assumes the two predicates in (FoundLHS FoundPred FoundRHS) => (LHS Pred RHS) are the same. Noticed while investigating something else, this is purely an oppurtunistic optimization while I'm looking at the code. Unfortunately, this doesn't solve my original problem. :)
1 parent 27156dd commit a7f35d5

File tree

10 files changed

+138
-78
lines changed

10 files changed

+138
-78
lines changed

llvm/include/llvm/Analysis/ScalarEvolution.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1942,7 +1942,9 @@ class ScalarEvolution {
19421942
/// true. Utility function used by isImpliedCondOperands. Tries to get
19431943
/// cases like "X `sgt` 0 => X - 1 `sgt` -1".
19441944
bool isImpliedCondOperandsViaRanges(ICmpInst::Predicate Pred, const SCEV *LHS,
1945-
const SCEV *RHS, const SCEV *FoundLHS,
1945+
const SCEV *RHS,
1946+
ICmpInst::Predicate FoundPred,
1947+
const SCEV *FoundLHS,
19461948
const SCEV *FoundRHS);
19471949

19481950
/// Return true if the condition denoted by \p LHS \p Pred \p RHS is implied

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11742,6 +11742,9 @@ bool ScalarEvolution::isImpliedCondBalancedTypes(
1174211742
if (isImpliedCondOperands(FoundPred, LHS, RHS, FoundLHS, FoundRHS, CtxI))
1174311743
return true;
1174411744

11745+
if (isImpliedCondOperandsViaRanges(Pred, LHS, RHS, FoundPred, FoundLHS, FoundRHS))
11746+
return true;
11747+
1174511748
// Otherwise assume the worst.
1174611749
return false;
1174711750
}
@@ -11999,7 +12002,7 @@ bool ScalarEvolution::isImpliedViaMerge(ICmpInst::Predicate Pred,
1199912002

1200012003
auto ProvedEasily = [&](const SCEV *S1, const SCEV *S2) {
1200112004
return isKnownViaNonRecursiveReasoning(Pred, S1, S2) ||
12002-
isImpliedCondOperandsViaRanges(Pred, S1, S2, FoundLHS, FoundRHS) ||
12005+
isImpliedCondOperandsViaRanges(Pred, S1, S2, Pred, FoundLHS, FoundRHS) ||
1200312006
isImpliedViaOperations(Pred, S1, S2, FoundLHS, FoundRHS, Depth);
1200412007
};
1200512008

@@ -12101,7 +12104,7 @@ bool ScalarEvolution::isImpliedCondOperands(ICmpInst::Predicate Pred,
1210112104
const SCEV *FoundLHS,
1210212105
const SCEV *FoundRHS,
1210312106
const Instruction *CtxI) {
12104-
if (isImpliedCondOperandsViaRanges(Pred, LHS, RHS, FoundLHS, FoundRHS))
12107+
if (isImpliedCondOperandsViaRanges(Pred, LHS, RHS, Pred, FoundLHS, FoundRHS))
1210512108
return true;
1210612109

1210712110
if (isImpliedCondOperandsViaNoOverflow(Pred, LHS, RHS, FoundLHS, FoundRHS))
@@ -12453,6 +12456,7 @@ ScalarEvolution::isImpliedCondOperandsHelper(ICmpInst::Predicate Pred,
1245312456
bool ScalarEvolution::isImpliedCondOperandsViaRanges(ICmpInst::Predicate Pred,
1245412457
const SCEV *LHS,
1245512458
const SCEV *RHS,
12459+
ICmpInst::Predicate FoundPred,
1245612460
const SCEV *FoundLHS,
1245712461
const SCEV *FoundRHS) {
1245812462
if (!isa<SCEVConstant>(RHS) || !isa<SCEVConstant>(FoundRHS))
@@ -12467,9 +12471,9 @@ bool ScalarEvolution::isImpliedCondOperandsViaRanges(ICmpInst::Predicate Pred,
1246712471
const APInt &ConstFoundRHS = cast<SCEVConstant>(FoundRHS)->getAPInt();
1246812472

1246912473
// `FoundLHSRange` is the range we know `FoundLHS` to be in by virtue of the
12470-
// antecedent "`FoundLHS` `Pred` `FoundRHS`".
12474+
// antecedent "`FoundLHS` `FoundPred` `FoundRHS`".
1247112475
ConstantRange FoundLHSRange =
12472-
ConstantRange::makeExactICmpRegion(Pred, ConstFoundRHS);
12476+
ConstantRange::makeExactICmpRegion(FoundPred, ConstFoundRHS);
1247312477

1247412478
// Since `LHS` is `FoundLHS` + `Addend`, we can compute a range for `LHS`:
1247512479
ConstantRange LHSRange = FoundLHSRange.add(ConstantRange(*Addend));

llvm/test/Analysis/ScalarEvolution/trip-count-negative-stride.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -601,10 +601,10 @@ declare void @llvm.assume(i1)
601601
define void @step_is_neg_addrec_slt_8(i64 %n) {
602602
; CHECK-LABEL: 'step_is_neg_addrec_slt_8'
603603
; CHECK-NEXT: Determining loop execution counts for: @step_is_neg_addrec_slt_8
604-
; CHECK-NEXT: Loop %inner: backedge-taken count is (7 /u {0,+,-1}<nuw><nsw><%outer.header>)
604+
; CHECK-NEXT: Loop %inner: backedge-taken count is (7 /u {0,+,-1}<%outer.header>)
605605
; CHECK-NEXT: Loop %inner: constant max backedge-taken count is 8
606-
; CHECK-NEXT: Loop %inner: symbolic max backedge-taken count is (7 /u {0,+,-1}<nuw><nsw><%outer.header>)
607-
; CHECK-NEXT: Loop %inner: Predicated backedge-taken count is (7 /u {0,+,-1}<nuw><nsw><%outer.header>)
606+
; CHECK-NEXT: Loop %inner: symbolic max backedge-taken count is (7 /u {0,+,-1}<%outer.header>)
607+
; CHECK-NEXT: Loop %inner: Predicated backedge-taken count is (7 /u {0,+,-1}<%outer.header>)
608608
; CHECK-NEXT: Predicates:
609609
; CHECK-NEXT: Loop %inner: Trip multiple is 1
610610
; CHECK-NEXT: Loop %outer.header: backedge-taken count is 0

llvm/test/CodeGen/BPF/loop-exit-cond.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ define dso_local i32 @test(i32 %len, ptr %data) #0 {
4444
; CHECK-NEXT: call void @foo(ptr nonnull @.str, i32 [[I_05]], ptr nonnull [[D]]) #[[ATTR3]]
4545
; CHECK-NEXT: call void @llvm.lifetime.end.p0(i64 8, ptr nonnull [[D]]) #[[ATTR3]]
4646
; CHECK-NEXT: [[INC]] = add nuw nsw i32 [[I_05]], 1
47-
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[INC]], [[LEN]]
48-
; CHECK-NEXT: br i1 [[CMP1]], label [[FOR_BODY]], label [[IF_END]], !llvm.loop [[LOOP8:![0-9]+]]
47+
; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[INC]], [[LEN]]
48+
; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label [[IF_END]], label [[FOR_BODY]], !llvm.loop [[LOOP8:![0-9]+]]
4949
; CHECK: if.end:
5050
; CHECK-NEXT: ret i32 0
5151
;

llvm/test/Transforms/HardwareLoops/ARM/fp-emulation.ll

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,11 @@ define void @test_fptosi(i32 %n, ptr %g, ptr %d) {
88
; CHECK-FP-NEXT: entry:
99
; CHECK-FP-NEXT: [[N_OFF:%.*]] = add i32 [[N]], -1
1010
; CHECK-FP-NEXT: [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500
11-
; CHECK-FP-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[N]], i32 1)
1211
; CHECK-FP-NEXT: br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]
1312
; CHECK-FP: while.body.lr.ph:
1413
; CHECK-FP-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D]], align 4
1514
; CHECK-FP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G]], align 4
16-
; CHECK-FP-NEXT: [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[UMAX]])
15+
; CHECK-FP-NEXT: [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]])
1716
; CHECK-FP-NEXT: br label [[WHILE_BODY:%.*]]
1817
; CHECK-FP: while.body:
1918
; CHECK-FP-NEXT: [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]
@@ -111,12 +110,11 @@ define void @test_fptoui(i32 %n, ptr %g, ptr %d) {
111110
; CHECK-FP-NEXT: entry:
112111
; CHECK-FP-NEXT: [[N_OFF:%.*]] = add i32 [[N]], -1
113112
; CHECK-FP-NEXT: [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500
114-
; CHECK-FP-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[N]], i32 1)
115113
; CHECK-FP-NEXT: br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]
116114
; CHECK-FP: while.body.lr.ph:
117115
; CHECK-FP-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D]], align 4
118116
; CHECK-FP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G]], align 4
119-
; CHECK-FP-NEXT: [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[UMAX]])
117+
; CHECK-FP-NEXT: [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]])
120118
; CHECK-FP-NEXT: br label [[WHILE_BODY:%.*]]
121119
; CHECK-FP: while.body:
122120
; CHECK-FP-NEXT: [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]
@@ -214,12 +212,11 @@ define void @load_store_float(i32 %n, ptr %d, ptr %g) {
214212
; CHECK-NEXT: entry:
215213
; CHECK-NEXT: [[N_OFF:%.*]] = add i32 [[N]], -1
216214
; CHECK-NEXT: [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500
217-
; CHECK-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[N]], i32 1)
218215
; CHECK-NEXT: br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]
219216
; CHECK: while.body.lr.ph:
220217
; CHECK-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D]], align 4
221218
; CHECK-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G]], align 4
222-
; CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[UMAX]])
219+
; CHECK-NEXT: [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]])
223220
; CHECK-NEXT: br label [[WHILE_BODY:%.*]]
224221
; CHECK: while.body:
225222
; CHECK-NEXT: [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]
@@ -284,12 +281,11 @@ define void @fp_add(i32 %n, ptr %d, ptr %g) {
284281
; CHECK-FP-NEXT: entry:
285282
; CHECK-FP-NEXT: [[N_OFF:%.*]] = add i32 [[N]], -1
286283
; CHECK-FP-NEXT: [[TMP0:%.*]] = icmp ult i32 [[N_OFF]], 500
287-
; CHECK-FP-NEXT: [[UMAX:%.*]] = call i32 @llvm.umax.i32(i32 [[N]], i32 1)
288284
; CHECK-FP-NEXT: br i1 [[TMP0]], label [[WHILE_BODY_LR_PH:%.*]], label [[CLEANUP:%.*]]
289285
; CHECK-FP: while.body.lr.ph:
290286
; CHECK-FP-NEXT: [[TMP1:%.*]] = load ptr, ptr [[D]], align 4
291287
; CHECK-FP-NEXT: [[TMP2:%.*]] = load ptr, ptr [[G]], align 4
292-
; CHECK-FP-NEXT: [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[UMAX]])
288+
; CHECK-FP-NEXT: [[TMP3:%.*]] = call i32 @llvm.start.loop.iterations.i32(i32 [[N]])
293289
; CHECK-FP-NEXT: br label [[WHILE_BODY:%.*]]
294290
; CHECK-FP: while.body:
295291
; CHECK-FP-NEXT: [[I_012:%.*]] = phi i32 [ 0, [[WHILE_BODY_LR_PH]] ], [ [[INC:%.*]], [[IF_END4:%.*]] ]

llvm/test/Transforms/IRCE/variable-loop-bounds.ll

Lines changed: 86 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -942,39 +942,115 @@ for.inc: ; preds = %for.body, %if.else
942942
br i1 %cmp, label %for.body, label %for.cond.cleanup
943943
}
944944

945-
;; Negative test
946945
define void @signed_var_imm_dec_eq(ptr nocapture %a, ptr nocapture readonly %b, ptr nocapture readonly %c, i32 %M) {
947946
; CHECK-LABEL: define void @signed_var_imm_dec_eq(
948947
; CHECK-SAME: ptr nocapture [[A:%.*]], ptr nocapture readonly [[B:%.*]], ptr nocapture readonly [[C:%.*]], i32 [[M:%.*]]) {
949948
; CHECK-NEXT: entry:
950949
; CHECK-NEXT: [[CMP14:%.*]] = icmp slt i32 [[M]], 1024
951950
; CHECK-NEXT: br i1 [[CMP14]], label [[FOR_BODY_PREHEADER:%.*]], label [[FOR_COND_CLEANUP:%.*]]
952951
; CHECK: for.body.preheader:
953-
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
952+
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[M]], 1
953+
; CHECK-NEXT: [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[TMP0]], i32 1024)
954+
; CHECK-NEXT: [[EXIT_PRELOOP_AT:%.*]] = add nsw i32 [[SMAX]], -1
955+
; CHECK-NEXT: [[SMAX1:%.*]] = call i32 @llvm.smax.i32(i32 [[TMP0]], i32 0)
956+
; CHECK-NEXT: [[EXIT_MAINLOOP_AT:%.*]] = add nsw i32 [[SMAX1]], -1
957+
; CHECK-NEXT: [[TMP1:%.*]] = icmp sgt i32 1024, [[EXIT_PRELOOP_AT]]
958+
; CHECK-NEXT: br i1 [[TMP1]], label [[FOR_BODY_PRELOOP_PREHEADER:%.*]], label [[PRELOOP_PSEUDO_EXIT:%.*]]
959+
; CHECK: for.body.preloop.preheader:
960+
; CHECK-NEXT: br label [[FOR_BODY_PRELOOP:%.*]]
961+
; CHECK: for.cond.cleanup.loopexit.loopexit:
962+
; CHECK-NEXT: br label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]]
954963
; CHECK: for.cond.cleanup.loopexit:
955964
; CHECK-NEXT: br label [[FOR_COND_CLEANUP]]
956965
; CHECK: for.cond.cleanup:
957966
; CHECK-NEXT: ret void
967+
; CHECK: mainloop:
968+
; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt i32 [[INDVAR_END:%.*]], [[EXIT_MAINLOOP_AT]]
969+
; CHECK-NEXT: br i1 [[TMP2]], label [[FOR_BODY_PREHEADER3:%.*]], label [[MAIN_PSEUDO_EXIT:%.*]]
970+
; CHECK: for.body.preheader3:
971+
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
958972
; CHECK: for.body:
959-
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[DEC:%.*]], [[FOR_INC:%.*]] ], [ 1024, [[FOR_BODY_PREHEADER]] ]
973+
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[DEC:%.*]], [[FOR_INC:%.*]] ], [ [[IV_PRELOOP_COPY:%.*]], [[FOR_BODY_PREHEADER3]] ]
960974
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[IV]], 1024
961975
; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[IV]]
962-
; CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
976+
; CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[ARRAYIDX]], align 4
963977
; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i32, ptr [[C]], i32 [[IV]]
964-
; CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[ARRAYIDX2]], align 4
965-
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP1]], [[TMP0]]
978+
; CHECK-NEXT: [[TMP4:%.*]] = load i32, ptr [[ARRAYIDX2]], align 4
979+
; CHECK-NEXT: [[MUL:%.*]] = mul nsw i32 [[TMP4]], [[TMP3]]
966980
; CHECK-NEXT: [[ARRAYIDX3:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[IV]]
967-
; CHECK-NEXT: br i1 [[CMP1]], label [[FOR_INC]], label [[IF_ELSE:%.*]]
981+
; CHECK-NEXT: br i1 true, label [[FOR_INC]], label [[IF_ELSE:%.*]]
968982
; CHECK: if.else:
969-
; CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
970-
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP2]], [[MUL]]
983+
; CHECK-NEXT: [[TMP5:%.*]] = load i32, ptr [[ARRAYIDX3]], align 4
984+
; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP5]], [[MUL]]
971985
; CHECK-NEXT: br label [[FOR_INC]]
972986
; CHECK: for.inc:
973987
; CHECK-NEXT: [[STOREMERGE:%.*]] = phi i32 [ [[ADD]], [[IF_ELSE]] ], [ [[MUL]], [[FOR_BODY]] ]
974988
; CHECK-NEXT: store i32 [[STOREMERGE]], ptr [[ARRAYIDX3]], align 4
975989
; CHECK-NEXT: [[DEC]] = add nsw i32 [[IV]], -1
976990
; CHECK-NEXT: [[CMP:%.*]] = icmp eq i32 [[DEC]], [[M]]
977-
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_COND_CLEANUP_LOOPEXIT:%.*]], label [[FOR_BODY]]
991+
; CHECK-NEXT: [[TMP6:%.*]] = icmp sgt i32 [[DEC]], [[EXIT_MAINLOOP_AT]]
992+
; CHECK-NEXT: [[TMP7:%.*]] = xor i1 [[TMP6]], true
993+
; CHECK-NEXT: br i1 [[TMP7]], label [[MAIN_EXIT_SELECTOR:%.*]], label [[FOR_BODY]]
994+
; CHECK: main.exit.selector:
995+
; CHECK-NEXT: [[DEC_LCSSA:%.*]] = phi i32 [ [[DEC]], [[FOR_INC]] ]
996+
; CHECK-NEXT: [[TMP8:%.*]] = icmp sgt i32 [[DEC_LCSSA]], [[M]]
997+
; CHECK-NEXT: br i1 [[TMP8]], label [[MAIN_PSEUDO_EXIT]], label [[FOR_COND_CLEANUP_LOOPEXIT]]
998+
; CHECK: main.pseudo.exit:
999+
; CHECK-NEXT: [[IV_COPY:%.*]] = phi i32 [ [[IV_PRELOOP_COPY]], [[MAINLOOP:%.*]] ], [ [[DEC_LCSSA]], [[MAIN_EXIT_SELECTOR]] ]
1000+
; CHECK-NEXT: [[INDVAR_END2:%.*]] = phi i32 [ [[INDVAR_END]], [[MAINLOOP]] ], [ [[DEC_LCSSA]], [[MAIN_EXIT_SELECTOR]] ]
1001+
; CHECK-NEXT: br label [[POSTLOOP:%.*]]
1002+
; CHECK: for.body.preloop:
1003+
; CHECK-NEXT: [[IV_PRELOOP:%.*]] = phi i32 [ [[DEC_PRELOOP:%.*]], [[FOR_INC_PRELOOP:%.*]] ], [ 1024, [[FOR_BODY_PRELOOP_PREHEADER]] ]
1004+
; CHECK-NEXT: [[CMP1_PRELOOP:%.*]] = icmp slt i32 [[IV_PRELOOP]], 1024
1005+
; CHECK-NEXT: [[ARRAYIDX_PRELOOP:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[IV_PRELOOP]]
1006+
; CHECK-NEXT: [[TMP9:%.*]] = load i32, ptr [[ARRAYIDX_PRELOOP]], align 4
1007+
; CHECK-NEXT: [[ARRAYIDX2_PRELOOP:%.*]] = getelementptr inbounds i32, ptr [[C]], i32 [[IV_PRELOOP]]
1008+
; CHECK-NEXT: [[TMP10:%.*]] = load i32, ptr [[ARRAYIDX2_PRELOOP]], align 4
1009+
; CHECK-NEXT: [[MUL_PRELOOP:%.*]] = mul nsw i32 [[TMP10]], [[TMP9]]
1010+
; CHECK-NEXT: [[ARRAYIDX3_PRELOOP:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[IV_PRELOOP]]
1011+
; CHECK-NEXT: br i1 [[CMP1_PRELOOP]], label [[FOR_INC_PRELOOP]], label [[IF_ELSE_PRELOOP:%.*]]
1012+
; CHECK: if.else.preloop:
1013+
; CHECK-NEXT: [[TMP11:%.*]] = load i32, ptr [[ARRAYIDX3_PRELOOP]], align 4
1014+
; CHECK-NEXT: [[ADD_PRELOOP:%.*]] = add nsw i32 [[TMP11]], [[MUL_PRELOOP]]
1015+
; CHECK-NEXT: br label [[FOR_INC_PRELOOP]]
1016+
; CHECK: for.inc.preloop:
1017+
; CHECK-NEXT: [[STOREMERGE_PRELOOP:%.*]] = phi i32 [ [[ADD_PRELOOP]], [[IF_ELSE_PRELOOP]] ], [ [[MUL_PRELOOP]], [[FOR_BODY_PRELOOP]] ]
1018+
; CHECK-NEXT: store i32 [[STOREMERGE_PRELOOP]], ptr [[ARRAYIDX3_PRELOOP]], align 4
1019+
; CHECK-NEXT: [[DEC_PRELOOP]] = add nsw i32 [[IV_PRELOOP]], -1
1020+
; CHECK-NEXT: [[CMP_PRELOOP:%.*]] = icmp eq i32 [[DEC_PRELOOP]], [[M]]
1021+
; CHECK-NEXT: [[TMP12:%.*]] = icmp sgt i32 [[DEC_PRELOOP]], [[EXIT_PRELOOP_AT]]
1022+
; CHECK-NEXT: [[TMP13:%.*]] = xor i1 [[TMP12]], true
1023+
; CHECK-NEXT: br i1 [[TMP13]], label [[PRELOOP_EXIT_SELECTOR:%.*]], label [[FOR_BODY_PRELOOP]], !llvm.loop [[LOOP15:![0-9]+]], !loop_constrainer.loop.clone !5
1024+
; CHECK: preloop.exit.selector:
1025+
; CHECK-NEXT: [[DEC_PRELOOP_LCSSA:%.*]] = phi i32 [ [[DEC_PRELOOP]], [[FOR_INC_PRELOOP]] ]
1026+
; CHECK-NEXT: [[TMP14:%.*]] = icmp sgt i32 [[DEC_PRELOOP_LCSSA]], [[M]]
1027+
; CHECK-NEXT: br i1 [[TMP14]], label [[PRELOOP_PSEUDO_EXIT]], label [[FOR_COND_CLEANUP_LOOPEXIT]]
1028+
; CHECK: preloop.pseudo.exit:
1029+
; CHECK-NEXT: [[IV_PRELOOP_COPY]] = phi i32 [ 1024, [[FOR_BODY_PREHEADER]] ], [ [[DEC_PRELOOP_LCSSA]], [[PRELOOP_EXIT_SELECTOR]] ]
1030+
; CHECK-NEXT: [[INDVAR_END]] = phi i32 [ 1024, [[FOR_BODY_PREHEADER]] ], [ [[DEC_PRELOOP_LCSSA]], [[PRELOOP_EXIT_SELECTOR]] ]
1031+
; CHECK-NEXT: br label [[MAINLOOP]]
1032+
; CHECK: postloop:
1033+
; CHECK-NEXT: br label [[FOR_BODY_POSTLOOP:%.*]]
1034+
; CHECK: for.body.postloop:
1035+
; CHECK-NEXT: [[IV_POSTLOOP:%.*]] = phi i32 [ [[DEC_POSTLOOP:%.*]], [[FOR_INC_POSTLOOP:%.*]] ], [ [[IV_COPY]], [[POSTLOOP]] ]
1036+
; CHECK-NEXT: [[CMP1_POSTLOOP:%.*]] = icmp slt i32 [[IV_POSTLOOP]], 1024
1037+
; CHECK-NEXT: [[ARRAYIDX_POSTLOOP:%.*]] = getelementptr inbounds i32, ptr [[B]], i32 [[IV_POSTLOOP]]
1038+
; CHECK-NEXT: [[TMP15:%.*]] = load i32, ptr [[ARRAYIDX_POSTLOOP]], align 4
1039+
; CHECK-NEXT: [[ARRAYIDX2_POSTLOOP:%.*]] = getelementptr inbounds i32, ptr [[C]], i32 [[IV_POSTLOOP]]
1040+
; CHECK-NEXT: [[TMP16:%.*]] = load i32, ptr [[ARRAYIDX2_POSTLOOP]], align 4
1041+
; CHECK-NEXT: [[MUL_POSTLOOP:%.*]] = mul nsw i32 [[TMP16]], [[TMP15]]
1042+
; CHECK-NEXT: [[ARRAYIDX3_POSTLOOP:%.*]] = getelementptr inbounds i32, ptr [[A]], i32 [[IV_POSTLOOP]]
1043+
; CHECK-NEXT: br i1 [[CMP1_POSTLOOP]], label [[FOR_INC_POSTLOOP]], label [[IF_ELSE_POSTLOOP:%.*]]
1044+
; CHECK: if.else.postloop:
1045+
; CHECK-NEXT: [[TMP17:%.*]] = load i32, ptr [[ARRAYIDX3_POSTLOOP]], align 4
1046+
; CHECK-NEXT: [[ADD_POSTLOOP:%.*]] = add nsw i32 [[TMP17]], [[MUL_POSTLOOP]]
1047+
; CHECK-NEXT: br label [[FOR_INC_POSTLOOP]]
1048+
; CHECK: for.inc.postloop:
1049+
; CHECK-NEXT: [[STOREMERGE_POSTLOOP:%.*]] = phi i32 [ [[ADD_POSTLOOP]], [[IF_ELSE_POSTLOOP]] ], [ [[MUL_POSTLOOP]], [[FOR_BODY_POSTLOOP]] ]
1050+
; CHECK-NEXT: store i32 [[STOREMERGE_POSTLOOP]], ptr [[ARRAYIDX3_POSTLOOP]], align 4
1051+
; CHECK-NEXT: [[DEC_POSTLOOP]] = add nsw i32 [[IV_POSTLOOP]], -1
1052+
; CHECK-NEXT: [[CMP_POSTLOOP:%.*]] = icmp eq i32 [[DEC_POSTLOOP]], [[M]]
1053+
; CHECK-NEXT: br i1 [[CMP_POSTLOOP]], label [[FOR_COND_CLEANUP_LOOPEXIT_LOOPEXIT:%.*]], label [[FOR_BODY_POSTLOOP]], !llvm.loop [[LOOP16:![0-9]+]], !loop_constrainer.loop.clone !5
9781054
;
9791055
entry:
9801056
%cmp14 = icmp slt i32 %M, 1024

0 commit comments

Comments
 (0)