Skip to content

Commit 4f49035

Browse files
authored
[IndVarsSimplify] sinkUnusedInvariants is skipping instructions while… (llvm#2497)
While sinking instructions (that are loop invariant) from preheader to the exit block, we are skipping instructions due to decrementing instruction iterator twice. (cherry picked from commit 7f107c3) Co-authored-by: Sirish Pande <[email protected]>
1 parent 34e6e84 commit 4f49035

File tree

12 files changed

+91
-103
lines changed

12 files changed

+91
-103
lines changed

llvm/lib/Transforms/Scalar/IndVarSimplify.cpp

Lines changed: 14 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,10 +1096,12 @@ bool IndVarSimplify::sinkUnusedInvariants(Loop *L) {
10961096
if (!Preheader) return false;
10971097

10981098
bool MadeAnyChanges = false;
1099-
BasicBlock::iterator InsertPt = ExitBlock->getFirstInsertionPt();
1100-
BasicBlock::iterator I(Preheader->getTerminator());
1101-
while (I != Preheader->begin()) {
1102-
--I;
1099+
for (Instruction &I : llvm::make_early_inc_range(llvm::reverse(*Preheader))) {
1100+
1101+
// Skip BB Terminator.
1102+
if (Preheader->getTerminator() == &I)
1103+
continue;
1104+
11031105
// New instructions were inserted at the end of the preheader.
11041106
if (isa<PHINode>(I))
11051107
break;
@@ -1110,28 +1112,28 @@ bool IndVarSimplify::sinkUnusedInvariants(Loop *L) {
11101112
// memory. Note that it's okay if the instruction might have undefined
11111113
// behavior: LoopSimplify guarantees that the preheader dominates the exit
11121114
// block.
1113-
if (I->mayHaveSideEffects() || I->mayReadFromMemory())
1115+
if (I.mayHaveSideEffects() || I.mayReadFromMemory())
11141116
continue;
11151117

1116-
// Skip debug info intrinsics.
1117-
if (isa<DbgInfoIntrinsic>(I))
1118+
// Skip debug or pseudo instructions.
1119+
if (I.isDebugOrPseudoInst())
11181120
continue;
11191121

11201122
// Skip eh pad instructions.
1121-
if (I->isEHPad())
1123+
if (I.isEHPad())
11221124
continue;
11231125

11241126
// Don't sink alloca: we never want to sink static alloca's out of the
11251127
// entry block, and correctly sinking dynamic alloca's requires
11261128
// checks for stacksave/stackrestore intrinsics.
11271129
// FIXME: Refactor this check somehow?
1128-
if (isa<AllocaInst>(I))
1130+
if (isa<AllocaInst>(&I))
11291131
continue;
11301132

11311133
// Determine if there is a use in or before the loop (direct or
11321134
// otherwise).
11331135
bool UsedInLoop = false;
1134-
for (Use &U : I->uses()) {
1136+
for (Use &U : I.uses()) {
11351137
Instruction *User = cast<Instruction>(U.getUser());
11361138
BasicBlock *UseBB = User->getParent();
11371139
if (PHINode *P = dyn_cast<PHINode>(User)) {
@@ -1150,26 +1152,9 @@ bool IndVarSimplify::sinkUnusedInvariants(Loop *L) {
11501152
continue;
11511153

11521154
// Otherwise, sink it to the exit block.
1153-
Instruction *ToMove = &*I;
1154-
bool Done = false;
1155-
1156-
if (I != Preheader->begin()) {
1157-
// Skip debug info intrinsics.
1158-
do {
1159-
--I;
1160-
} while (I->isDebugOrPseudoInst() && I != Preheader->begin());
1161-
1162-
if (I->isDebugOrPseudoInst() && I == Preheader->begin())
1163-
Done = true;
1164-
} else {
1165-
Done = true;
1166-
}
1167-
1155+
I.moveBefore(ExitBlock->getFirstInsertionPt());
1156+
SE->forgetValue(&I);
11681157
MadeAnyChanges = true;
1169-
ToMove->moveBefore(*ExitBlock, InsertPt);
1170-
SE->forgetValue(ToMove);
1171-
if (Done) break;
1172-
InsertPt = ToMove->getIterator();
11731158
}
11741159

11751160
return MadeAnyChanges;

llvm/test/Transforms/IndVarSimplify/ARM/code-size.ll

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,30 +4,32 @@
44

55
define i32 @remove_loop(i32 %size) #0 {
66
; CHECK-V8M-LABEL: @remove_loop(
7+
; CHECK-V8M-SAME: i32 [[SIZE:%.*]]) #[[ATTR0:[0-9]+]] {
78
; CHECK-V8M-NEXT: entry:
8-
; CHECK-V8M-NEXT: [[TMP0:%.*]] = add i32 [[SIZE:%.*]], 31
9+
; CHECK-V8M-NEXT: br label %[[WHILE_COND:.*]]
10+
; CHECK-V8M: while.cond:
11+
; CHECK-V8M-NEXT: br i1 false, label %[[WHILE_COND]], label %[[WHILE_END:.*]]
12+
; CHECK-V8M: while.end:
13+
; CHECK-V8M-NEXT: [[TMP0:%.*]] = add i32 [[SIZE]], 31
914
; CHECK-V8M-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[SIZE]], i32 31)
1015
; CHECK-V8M-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], [[UMIN]]
1116
; CHECK-V8M-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 5
1217
; CHECK-V8M-NEXT: [[TMP3:%.*]] = shl nuw i32 [[TMP2]], 5
13-
; CHECK-V8M-NEXT: br label [[WHILE_COND:%.*]]
14-
; CHECK-V8M: while.cond:
15-
; CHECK-V8M-NEXT: br i1 false, label [[WHILE_COND]], label [[WHILE_END:%.*]]
16-
; CHECK-V8M: while.end:
1718
; CHECK-V8M-NEXT: [[TMP4:%.*]] = sub i32 [[SIZE]], [[TMP3]]
1819
; CHECK-V8M-NEXT: ret i32 [[TMP4]]
1920
;
2021
; CHECK-V8A-LABEL: @remove_loop(
22+
; CHECK-V8A-SAME: i32 [[SIZE:%.*]]) #[[ATTR0:[0-9]+]] {
2123
; CHECK-V8A-NEXT: entry:
22-
; CHECK-V8A-NEXT: [[TMP0:%.*]] = add i32 [[SIZE:%.*]], 31
24+
; CHECK-V8A-NEXT: br label %[[WHILE_COND:.*]]
25+
; CHECK-V8A: while.cond:
26+
; CHECK-V8A-NEXT: br i1 false, label %[[WHILE_COND]], label %[[WHILE_END:.*]]
27+
; CHECK-V8A: while.end:
28+
; CHECK-V8A-NEXT: [[TMP0:%.*]] = add i32 [[SIZE]], 31
2329
; CHECK-V8A-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[SIZE]], i32 31)
2430
; CHECK-V8A-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], [[UMIN]]
2531
; CHECK-V8A-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 5
2632
; CHECK-V8A-NEXT: [[TMP3:%.*]] = shl nuw i32 [[TMP2]], 5
27-
; CHECK-V8A-NEXT: br label [[WHILE_COND:%.*]]
28-
; CHECK-V8A: while.cond:
29-
; CHECK-V8A-NEXT: br i1 false, label [[WHILE_COND]], label [[WHILE_END:%.*]]
30-
; CHECK-V8A: while.end:
3133
; CHECK-V8A-NEXT: [[TMP4:%.*]] = sub i32 [[SIZE]], [[TMP3]]
3234
; CHECK-V8A-NEXT: ret i32 [[TMP4]]
3335
;

llvm/test/Transforms/IndVarSimplify/ARM/indvar-unroll-imm-cost.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@ define dso_local arm_aapcscc void @test(ptr nocapture %pDest, ptr nocapture read
7777
; CHECK-NEXT: [[CMP2780:%.*]] = icmp ugt i32 [[ADD25]], [[J_0_LCSSA]]
7878
; CHECK-NEXT: br i1 [[CMP2780]], label [[FOR_BODY29_PREHEADER:%.*]], label [[FOR_END40]]
7979
; CHECK: for.body29.preheader:
80-
; CHECK-NEXT: [[TMP10:%.*]] = sub nsw i32 [[ADD25]], [[J_0_LCSSA]]
8180
; CHECK-NEXT: br label [[FOR_BODY29:%.*]]
8281
; CHECK: for.body29:
8382
; CHECK-NEXT: [[J_184:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY29]] ], [ [[J_0_LCSSA]], [[FOR_BODY29_PREHEADER]] ]
@@ -101,6 +100,7 @@ define dso_local arm_aapcscc void @test(ptr nocapture %pDest, ptr nocapture read
101100
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], [[ADD25]]
102101
; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END40_LOOPEXIT:%.*]], label [[FOR_BODY29]]
103102
; CHECK: for.end40.loopexit:
103+
; CHECK-NEXT: [[TMP10:%.*]] = sub nsw i32 [[ADD25]], [[J_0_LCSSA]]
104104
; CHECK-NEXT: [[SCEVGEP93:%.*]] = getelementptr i16, ptr [[PSRCB_ADDR_1_LCSSA]], i32 [[TMP10]]
105105
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i16, ptr [[PSRCA_ADDR_1_LCSSA]], i32 [[TMP10]]
106106
; CHECK-NEXT: [[SCEVGEP94:%.*]] = getelementptr i32, ptr [[PDEST_ADDR_1_LCSSA]], i32 [[TMP10]]

llvm/test/Transforms/IndVarSimplify/exit-count-select.ll

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
define i32 @logical_and_2ops(i32 %n, i32 %m) {
55
; CHECK-LABEL: @logical_and_2ops(
66
; CHECK-NEXT: entry:
7-
; CHECK-NEXT: [[TMP0:%.*]] = freeze i32 [[M:%.*]]
87
; CHECK-NEXT: br label [[LOOP:%.*]]
98
; CHECK: loop:
109
; CHECK-NEXT: br i1 false, label [[LOOP]], label [[EXIT:%.*]]
1110
; CHECK: exit:
11+
; CHECK-NEXT: [[TMP0:%.*]] = freeze i32 [[M:%.*]]
1212
; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[TMP0]], i32 [[N:%.*]])
1313
; CHECK-NEXT: ret i32 [[UMIN]]
1414
;
@@ -28,11 +28,11 @@ exit:
2828
define i32 @logical_or_2ops(i32 %n, i32 %m) {
2929
; CHECK-LABEL: @logical_or_2ops(
3030
; CHECK-NEXT: entry:
31-
; CHECK-NEXT: [[TMP0:%.*]] = freeze i32 [[M:%.*]]
3231
; CHECK-NEXT: br label [[LOOP:%.*]]
3332
; CHECK: loop:
3433
; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[LOOP]]
3534
; CHECK: exit:
35+
; CHECK-NEXT: [[TMP0:%.*]] = freeze i32 [[M:%.*]]
3636
; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[TMP0]], i32 [[N:%.*]])
3737
; CHECK-NEXT: ret i32 [[UMIN]]
3838
;
@@ -52,13 +52,13 @@ exit:
5252
define i32 @logical_and_3ops(i32 %n, i32 %m, i32 %k) {
5353
; CHECK-LABEL: @logical_and_3ops(
5454
; CHECK-NEXT: entry:
55-
; CHECK-NEXT: [[TMP0:%.*]] = freeze i32 [[K:%.*]]
56-
; CHECK-NEXT: [[TMP1:%.*]] = freeze i32 [[M:%.*]]
57-
; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[TMP0]], i32 [[TMP1]])
5855
; CHECK-NEXT: br label [[LOOP:%.*]]
5956
; CHECK: loop:
6057
; CHECK-NEXT: br i1 false, label [[LOOP]], label [[EXIT:%.*]]
6158
; CHECK: exit:
59+
; CHECK-NEXT: [[TMP0:%.*]] = freeze i32 [[K:%.*]]
60+
; CHECK-NEXT: [[TMP1:%.*]] = freeze i32 [[M:%.*]]
61+
; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[TMP0]], i32 [[TMP1]])
6262
; CHECK-NEXT: [[UMIN1:%.*]] = call i32 @llvm.umin.i32(i32 [[UMIN]], i32 [[N:%.*]])
6363
; CHECK-NEXT: ret i32 [[UMIN1]]
6464
;
@@ -80,13 +80,13 @@ exit:
8080
define i32 @logical_or_3ops(i32 %n, i32 %m, i32 %k) {
8181
; CHECK-LABEL: @logical_or_3ops(
8282
; CHECK-NEXT: entry:
83-
; CHECK-NEXT: [[TMP0:%.*]] = freeze i32 [[K:%.*]]
84-
; CHECK-NEXT: [[TMP1:%.*]] = freeze i32 [[M:%.*]]
85-
; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[TMP0]], i32 [[TMP1]])
8683
; CHECK-NEXT: br label [[LOOP:%.*]]
8784
; CHECK: loop:
8885
; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[LOOP]]
8986
; CHECK: exit:
87+
; CHECK-NEXT: [[TMP0:%.*]] = freeze i32 [[K:%.*]]
88+
; CHECK-NEXT: [[TMP1:%.*]] = freeze i32 [[M:%.*]]
89+
; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[TMP0]], i32 [[TMP1]])
9090
; CHECK-NEXT: [[UMIN1:%.*]] = call i32 @llvm.umin.i32(i32 [[UMIN]], i32 [[N:%.*]])
9191
; CHECK-NEXT: ret i32 [[UMIN1]]
9292
;

llvm/test/Transforms/IndVarSimplify/exit_value_test3.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
; is high because the loop can be deleted after the exit value rewrite.
55
;
66
; CHECK-LABEL: @_Z3fooPKcjj(
7-
; CHECK: udiv
87
; CHECK: [[LABEL:^[a-zA-Z0-9_.]+]]:
98
; CHECK-NOT: br {{.*}} [[LABEL]]
9+
; CHECK: udiv
1010

1111
define i32 @_Z3fooPKcjj(ptr nocapture readnone %s, i32 %len, i32 %c) #0 {
1212
entry:

llvm/test/Transforms/IndVarSimplify/finite-exit-comparisons.ll

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -932,17 +932,17 @@ for.end: ; preds = %for.body, %entry
932932
define i16 @ult_multiuse_profit(i16 %n.raw, i8 %start) mustprogress {
933933
; CHECK-LABEL: @ult_multiuse_profit(
934934
; CHECK-NEXT: entry:
935-
; CHECK-NEXT: [[TMP0:%.*]] = add i8 [[START:%.*]], 1
936-
; CHECK-NEXT: [[TMP1:%.*]] = zext i8 [[TMP0]] to i16
937-
; CHECK-NEXT: [[TMP2:%.*]] = trunc i16 254 to i8
935+
; CHECK-NEXT: [[TMP0:%.*]] = trunc i16 254 to i8
938936
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
939937
; CHECK: for.body:
940938
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ [[START]], [[ENTRY:%.*]] ]
941939
; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
942-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[IV_NEXT]], [[TMP2]]
940+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[IV_NEXT]], [[TMP0]]
943941
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
944942
; CHECK: for.end:
945-
; CHECK-NEXT: [[UMAX:%.*]] = call i16 @llvm.umax.i16(i16 [[TMP1]], i16 254)
943+
; CHECK-NEXT: [[TMP1:%.*]] = add i8 [[START:%.*]], 1
944+
; CHECK-NEXT: [[TMP2:%.*]] = zext i8 [[TMP1]] to i16
945+
; CHECK-NEXT: [[UMAX:%.*]] = call i16 @llvm.umax.i16(i16 [[TMP2]], i16 254)
946946
; CHECK-NEXT: ret i16 [[UMAX]]
947947
;
948948
entry:

llvm/test/Transforms/IndVarSimplify/pr116483.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@
44
define i32 @test() {
55
; CHECK-LABEL: define i32 @test() {
66
; CHECK-NEXT: [[ENTRY:.*:]]
7+
; CHECK-NEXT: br label %[[LOOP_BODY:.*]]
8+
; CHECK: [[LOOP_BODY]]:
9+
; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[LOOP_BODY]]
10+
; CHECK: [[EXIT]]:
711
; CHECK-NEXT: [[XOR:%.*]] = xor i32 0, 3
812
; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[XOR]], 329
913
; CHECK-NEXT: [[CONV:%.*]] = trunc i32 [[MUL]] to i16
1014
; CHECK-NEXT: [[SEXT:%.*]] = shl i16 [[CONV]], 8
1115
; CHECK-NEXT: [[CONV1:%.*]] = ashr i16 [[SEXT]], 8
12-
; CHECK-NEXT: br label %[[LOOP_BODY:.*]]
13-
; CHECK: [[LOOP_BODY]]:
14-
; CHECK-NEXT: br i1 true, label %[[EXIT:.*]], label %[[LOOP_BODY]]
15-
; CHECK: [[EXIT]]:
1616
; CHECK-NEXT: [[CONV3:%.*]] = zext i16 [[CONV1]] to i32
1717
; CHECK-NEXT: ret i32 [[CONV3]]
1818
;

llvm/test/Transforms/IndVarSimplify/pr63763.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ define i32 @test(i1 %c) {
1616
; CHECK-NEXT: [[CONV2:%.*]] = ashr exact i32 [[SEXT]], 24
1717
; CHECK-NEXT: [[INVARIANT_OP:%.*]] = sub nsw i32 7, [[CONV2]]
1818
; CHECK-NEXT: call void @use(i32 [[INVARIANT_OP]])
19-
; CHECK-NEXT: [[SEXT_US:%.*]] = shl i32 [[SEL]], 24
20-
; CHECK-NEXT: [[CONV2_US:%.*]] = ashr exact i32 [[SEXT_US]], 24
2119
; CHECK-NEXT: br label [[LOOP:%.*]]
2220
; CHECK: loop:
2321
; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[LOOP]]
2422
; CHECK: exit:
23+
; CHECK-NEXT: [[SEXT_US:%.*]] = shl i32 [[SEL]], 24
24+
; CHECK-NEXT: [[CONV2_US:%.*]] = ashr exact i32 [[SEXT_US]], 24
2525
; CHECK-NEXT: [[INVARIANT_OP_US:%.*]] = sub nsw i32 7, [[CONV2_US]]
2626
; CHECK-NEXT: ret i32 [[INVARIANT_OP_US]]
2727
;

llvm/test/Transforms/IndVarSimplify/replace-loop-exit-folds.ll

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,21 @@
44
target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
55

66
define i32 @remove_loop(i32 %size) {
7-
; CHECK-LABEL: @remove_loop(
8-
; CHECK-NEXT: entry:
9-
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[SIZE:%.*]], 31
7+
; CHECK-LABEL: define i32 @remove_loop(
8+
; CHECK-SAME: i32 [[SIZE:%.*]]) {
9+
; CHECK-NEXT: [[ENTRY:.*]]:
10+
; CHECK-NEXT: br label %[[WHILE_COND:.*]]
11+
; CHECK: [[WHILE_COND]]:
12+
; CHECK-NEXT: [[SIZE_ADDR_0:%.*]] = phi i32 [ [[SIZE]], %[[ENTRY]] ], [ [[SUB:%.*]], %[[WHILE_COND]] ]
13+
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[SIZE_ADDR_0]], 31
14+
; CHECK-NEXT: [[SUB]] = add i32 [[SIZE_ADDR_0]], -32
15+
; CHECK-NEXT: br i1 [[CMP]], label %[[WHILE_COND]], label %[[WHILE_END:.*]]
16+
; CHECK: [[WHILE_END]]:
17+
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[SIZE]], 31
1018
; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[SIZE]], i32 31)
1119
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], [[UMIN]]
1220
; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 5
1321
; CHECK-NEXT: [[TMP3:%.*]] = shl nuw i32 [[TMP2]], 5
14-
; CHECK-NEXT: br label [[WHILE_COND:%.*]]
15-
; CHECK: while.cond:
16-
; CHECK-NEXT: [[SIZE_ADDR_0:%.*]] = phi i32 [ [[SIZE]], [[ENTRY:%.*]] ], [ [[SUB:%.*]], [[WHILE_COND]] ]
17-
; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[SIZE_ADDR_0]], 31
18-
; CHECK-NEXT: [[SUB]] = add i32 [[SIZE_ADDR_0]], -32
19-
; CHECK-NEXT: br i1 [[CMP]], label [[WHILE_COND]], label [[WHILE_END:%.*]]
20-
; CHECK: while.end:
2122
; CHECK-NEXT: [[TMP4:%.*]] = sub i32 [[SIZE]], [[TMP3]]
2223
; CHECK-NEXT: ret i32 [[TMP4]]
2324
;

llvm/test/Transforms/IndVarSimplify/sentinel.ll

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@ define void @test(i1 %arg) personality ptr @snork {
1010
; CHECK-NEXT: br label [[BB4:%.*]]
1111
; CHECK: bb1:
1212
; CHECK-NEXT: [[INDVARS_IV_NEXT:%.*]] = add i32 [[INDVARS_IV:%.*]], 1
13-
; CHECK-NEXT: [[TMP0:%.*]] = sub i32 [[TMP1:%.*]], [[SMAX:%.*]]
13+
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[TMP6:%.*]], [[INDVARS_IV]]
14+
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], [[SMAX:%.*]]
1415
; CHECK-NEXT: br i1 [[ARG:%.*]], label [[BB2:%.*]], label [[BB4]]
1516
; CHECK: bb2:
16-
; CHECK-NEXT: [[TMP3:%.*]] = phi i32 [ [[TMP0]], [[BB1:%.*]] ]
17+
; CHECK-NEXT: [[TMP3:%.*]] = phi i32 [ [[TMP1]], [[BB1:%.*]] ]
1718
; CHECK-NEXT: ret void
1819
; CHECK: bb4:
1920
; CHECK-NEXT: [[INDVARS_IV]] = phi i32 [ [[INDVARS_IV_NEXT]], [[BB1]] ], [ undef, [[BB:%.*]] ]
2021
; CHECK-NEXT: [[SMAX]] = call i32 @llvm.smax.i32(i32 [[INDVARS_IV]], i32 36)
21-
; CHECK-NEXT: [[TMP6:%.*]] = invoke i32 @quux() [ "deopt"(i32 0, i32 0, i32 0, i32 180, i32 0, i32 25, i32 0, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null, i32 3, i32 [[INDVARS_IV]], i32 3, i32 undef, i32 7, ptr null, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 4, double undef, i32 7, ptr null, i32 4, i64 undef, i32 7, ptr null, i32 0, ptr addrspace(1) undef, i32 3, i32 undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 7, ptr null) ]
22+
; CHECK-NEXT: [[TMP6]] = invoke i32 @quux() [ "deopt"(i32 0, i32 0, i32 0, i32 180, i32 0, i32 25, i32 0, i32 7, ptr null, i32 7, ptr null, i32 7, ptr null, i32 3, i32 [[INDVARS_IV]], i32 3, i32 undef, i32 7, ptr null, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 3, i32 undef, i32 4, double undef, i32 7, ptr null, i32 4, i64 undef, i32 7, ptr null, i32 0, ptr addrspace(1) undef, i32 3, i32 undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 0, ptr addrspace(1) undef, i32 7, ptr null) ]
2223
; CHECK-NEXT: to label [[BB7:%.*]] unwind label [[BB15:%.*]]
2324
; CHECK: bb7:
24-
; CHECK-NEXT: [[TMP1]] = add i32 [[TMP6]], [[INDVARS_IV]]
2525
; CHECK-NEXT: br label [[BB9:%.*]]
2626
; CHECK: bb9:
2727
; CHECK-NEXT: br i1 true, label [[BB1]], label [[BB9]]

0 commit comments

Comments
 (0)