Skip to content

Commit 6fa704f

Browse files
committed
Revert "[IndVarsSimplify] sinkUnusedInvariants is skipping instructions while sinking. (llvm#135205)"
This reverts commit 7f107c3.
1 parent 6feee51 commit 6fa704f

File tree

13 files changed

+106
-94
lines changed

13 files changed

+106
-94
lines changed

llvm/lib/Transforms/Scalar/IndVarSimplify.cpp

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

10911091
bool MadeAnyChanges = false;
1092-
for (Instruction &I : llvm::make_early_inc_range(llvm::reverse(*Preheader))) {
1093-
1094-
// Skip BB Terminator.
1095-
if (Preheader->getTerminator() == &I)
1096-
continue;
1097-
1092+
BasicBlock::iterator InsertPt = ExitBlock->getFirstInsertionPt();
1093+
BasicBlock::iterator I(Preheader->getTerminator());
1094+
while (I != Preheader->begin()) {
1095+
--I;
10981096
// New instructions were inserted at the end of the preheader.
10991097
if (isa<PHINode>(I))
11001098
break;
@@ -1105,28 +1103,28 @@ bool IndVarSimplify::sinkUnusedInvariants(Loop *L) {
11051103
// memory. Note that it's okay if the instruction might have undefined
11061104
// behavior: LoopSimplify guarantees that the preheader dominates the exit
11071105
// block.
1108-
if (I.mayHaveSideEffects() || I.mayReadFromMemory())
1106+
if (I->mayHaveSideEffects() || I->mayReadFromMemory())
11091107
continue;
11101108

1111-
// Skip debug or pseudo instructions.
1112-
if (I.isDebugOrPseudoInst())
1109+
// Skip debug info intrinsics.
1110+
if (isa<DbgInfoIntrinsic>(I))
11131111
continue;
11141112

11151113
// Skip eh pad instructions.
1116-
if (I.isEHPad())
1114+
if (I->isEHPad())
11171115
continue;
11181116

11191117
// Don't sink alloca: we never want to sink static alloca's out of the
11201118
// entry block, and correctly sinking dynamic alloca's requires
11211119
// checks for stacksave/stackrestore intrinsics.
11221120
// FIXME: Refactor this check somehow?
1123-
if (isa<AllocaInst>(&I))
1121+
if (isa<AllocaInst>(I))
11241122
continue;
11251123

11261124
// Determine if there is a use in or before the loop (direct or
11271125
// otherwise).
11281126
bool UsedInLoop = false;
1129-
for (Use &U : I.uses()) {
1127+
for (Use &U : I->uses()) {
11301128
Instruction *User = cast<Instruction>(U.getUser());
11311129
BasicBlock *UseBB = User->getParent();
11321130
if (PHINode *P = dyn_cast<PHINode>(User)) {
@@ -1145,9 +1143,26 @@ bool IndVarSimplify::sinkUnusedInvariants(Loop *L) {
11451143
continue;
11461144

11471145
// Otherwise, sink it to the exit block.
1148-
I.moveBefore(ExitBlock->getFirstInsertionPt());
1149-
SE->forgetValue(&I);
1146+
Instruction *ToMove = &*I;
1147+
bool Done = false;
1148+
1149+
if (I != Preheader->begin()) {
1150+
// Skip debug info intrinsics.
1151+
do {
1152+
--I;
1153+
} while (I->isDebugOrPseudoInst() && I != Preheader->begin());
1154+
1155+
if (I->isDebugOrPseudoInst() && I == Preheader->begin())
1156+
Done = true;
1157+
} else {
1158+
Done = true;
1159+
}
1160+
11501161
MadeAnyChanges = true;
1162+
ToMove->moveBefore(*ExitBlock, InsertPt);
1163+
SE->forgetValue(ToMove);
1164+
if (Done) break;
1165+
InsertPt = ToMove->getIterator();
11511166
}
11521167

11531168
return MadeAnyChanges;

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

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

55
define i32 @remove_loop(i32 %size) #0 {
66
; CHECK-V8M-LABEL: @remove_loop(
7-
; CHECK-V8M-SAME: i32 [[SIZE:%.*]]) #[[ATTR0:[0-9]+]] {
87
; CHECK-V8M-NEXT: entry:
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
8+
; CHECK-V8M-NEXT: [[TMP0:%.*]] = add i32 [[SIZE:%.*]], 31
149
; CHECK-V8M-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[SIZE]], i32 31)
1510
; CHECK-V8M-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], [[UMIN]]
1611
; CHECK-V8M-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 5
1712
; 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:
1817
; CHECK-V8M-NEXT: [[TMP4:%.*]] = sub i32 [[SIZE]], [[TMP3]]
1918
; CHECK-V8M-NEXT: ret i32 [[TMP4]]
2019
;
2120
; CHECK-V8A-LABEL: @remove_loop(
22-
; CHECK-V8A-SAME: i32 [[SIZE:%.*]]) #[[ATTR0:[0-9]+]] {
2321
; CHECK-V8A-NEXT: entry:
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
22+
; CHECK-V8A-NEXT: [[TMP0:%.*]] = add i32 [[SIZE:%.*]], 31
2923
; CHECK-V8A-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[SIZE]], i32 31)
3024
; CHECK-V8A-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], [[UMIN]]
3125
; CHECK-V8A-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 5
3226
; 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:
3331
; CHECK-V8A-NEXT: [[TMP4:%.*]] = sub i32 [[SIZE]], [[TMP3]]
3432
; CHECK-V8A-NEXT: ret i32 [[TMP4]]
3533
;

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,6 +77,7 @@ 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]]
8081
; CHECK-NEXT: br label [[FOR_BODY29:%.*]]
8182
; CHECK: for.body29:
8283
; CHECK-NEXT: [[J_184:%.*]] = phi i32 [ [[INC:%.*]], [[FOR_BODY29]] ], [ [[J_0_LCSSA]], [[FOR_BODY29_PREHEADER]] ]
@@ -100,7 +101,6 @@ define dso_local arm_aapcscc void @test(ptr nocapture %pDest, ptr nocapture read
100101
; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INC]], [[ADD25]]
101102
; CHECK-NEXT: br i1 [[EXITCOND]], label [[FOR_END40_LOOPEXIT:%.*]], label [[FOR_BODY29]]
102103
; 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:%.*]]
78
; CHECK-NEXT: br label [[LOOP:%.*]]
89
; CHECK: loop:
910
; CHECK-NEXT: br i1 false, label [[LOOP]], label [[EXIT:%.*]]
1011
; 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:%.*]]
3132
; CHECK-NEXT: br label [[LOOP:%.*]]
3233
; CHECK: loop:
3334
; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[LOOP]]
3435
; 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]])
5558
; CHECK-NEXT: br label [[LOOP:%.*]]
5659
; CHECK: loop:
5760
; CHECK-NEXT: br i1 false, label [[LOOP]], label [[EXIT:%.*]]
5861
; 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]])
8386
; CHECK-NEXT: br label [[LOOP:%.*]]
8487
; CHECK: loop:
8588
; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[LOOP]]
8689
; 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
78
; CHECK: [[LABEL:^[a-zA-Z0-9_.]+]]:
89
; 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:%.*]] = trunc i16 254 to i8
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
936938
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
937939
; CHECK: for.body:
938940
; CHECK-NEXT: [[IV:%.*]] = phi i8 [ [[IV_NEXT:%.*]], [[FOR_BODY]] ], [ [[START]], [[ENTRY:%.*]] ]
939941
; CHECK-NEXT: [[IV_NEXT]] = add i8 [[IV]], 1
940-
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[IV_NEXT]], [[TMP0]]
942+
; CHECK-NEXT: [[CMP:%.*]] = icmp ult i8 [[IV_NEXT]], [[TMP2]]
941943
; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]]
942944
; CHECK: for.end:
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)
945+
; CHECK-NEXT: [[UMAX:%.*]] = call i16 @llvm.umax.i16(i16 [[TMP1]], 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]]:
117
; CHECK-NEXT: [[XOR:%.*]] = xor i32 0, 3
128
; CHECK-NEXT: [[MUL:%.*]] = mul i32 [[XOR]], 329
139
; CHECK-NEXT: [[CONV:%.*]] = trunc i32 [[MUL]] to i16
1410
; CHECK-NEXT: [[SEXT:%.*]] = shl i16 [[CONV]], 8
1511
; 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
1921
; CHECK-NEXT: br label [[LOOP:%.*]]
2022
; CHECK: loop:
2123
; CHECK-NEXT: br i1 true, label [[EXIT:%.*]], label [[LOOP]]
2224
; 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: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,20 @@
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: 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
7+
; CHECK-LABEL: @remove_loop(
8+
; CHECK-NEXT: entry:
9+
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[SIZE:%.*]], 31
1810
; CHECK-NEXT: [[UMIN:%.*]] = call i32 @llvm.umin.i32(i32 [[SIZE]], i32 31)
1911
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 [[TMP0]], [[UMIN]]
2012
; CHECK-NEXT: [[TMP2:%.*]] = lshr i32 [[TMP1]], 5
2113
; 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:
2221
; CHECK-NEXT: [[TMP4:%.*]] = sub i32 [[SIZE]], [[TMP3]]
2322
; CHECK-NEXT: ret i32 [[TMP4]]
2423
;

llvm/test/Transforms/IndVarSimplify/rewrite-loop-exit-values-phi.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,9 @@ define i64 @narow_canonical_iv_wide_multiplied_iv(i32 %x, i64 %y, ptr %0) {
7676
; CHECK-LABEL: @narow_canonical_iv_wide_multiplied_iv(
7777
; CHECK-NEXT: entry:
7878
; CHECK-NEXT: [[SMAX:%.*]] = tail call i32 @llvm.smax.i32(i32 [[X:%.*]], i32 1)
79+
; CHECK-NEXT: [[TMP1:%.*]] = zext nneg i32 [[SMAX]] to i64
80+
; CHECK-NEXT: [[TMP2:%.*]] = mul i64 [[Y:%.*]], [[TMP1]]
81+
; CHECK-NEXT: [[TMP3:%.*]] = shl i64 [[TMP2]], 1
7982
; CHECK-NEXT: br label [[LOOP:%.*]]
8083
; CHECK: loop:
8184
; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ]
@@ -84,9 +87,6 @@ define i64 @narow_canonical_iv_wide_multiplied_iv(i32 %x, i64 %y, ptr %0) {
8487
; CHECK-NEXT: [[EC:%.*]] = icmp ne i32 [[IV_NEXT]], [[SMAX]]
8588
; CHECK-NEXT: br i1 [[EC]], label [[LOOP]], label [[EXIT:%.*]]
8689
; CHECK: exit:
87-
; CHECK-NEXT: [[TMP1:%.*]] = zext nneg i32 [[SMAX]] to i64
88-
; CHECK-NEXT: [[TMP2:%.*]] = mul i64 [[Y:%.*]], [[TMP1]]
89-
; CHECK-NEXT: [[TMP3:%.*]] = shl i64 [[TMP2]], 1
9090
; CHECK-NEXT: [[TMP6:%.*]] = add nuw nsw i64 [[TMP3]], 1
9191
; CHECK-NEXT: ret i64 [[TMP6]]
9292
;

0 commit comments

Comments
 (0)