Skip to content

Commit 11dccf8

Browse files
committed
Recommit "[SCEV] Look through single value PHIs."
This commit was originally because it was suspected to cause a crash, but a reproducer did not surface. A crash that was exposed by this change was fixed in 1d8f2e5. This reverts the revert commit 0581c0b.
1 parent 2d76274 commit 11dccf8

File tree

4 files changed

+22
-43
lines changed

4 files changed

+22
-43
lines changed

llvm/lib/Analysis/ScalarEvolution.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5114,13 +5114,8 @@ const SCEV *ScalarEvolution::createNodeForPHI(PHINode *PN) {
51145114
if (const SCEV *S = createNodeFromSelectLikePHI(PN))
51155115
return S;
51165116

5117-
// If the PHI has a single incoming value, follow that value, unless the
5118-
// PHI's incoming blocks are in a different loop, in which case doing so
5119-
// risks breaking LCSSA form. Instcombine would normally zap these, but
5120-
// it doesn't have DominatorTree information, so it may miss cases.
51215117
if (Value *V = SimplifyInstruction(PN, {getDataLayout(), &TLI, &DT, &AC}))
5122-
if (LI.replacementPreservesLCSSAForm(PN, V))
5123-
return getSCEV(V);
5118+
return getSCEV(V);
51245119

51255120
// If it's not a loop phi, we can't handle it yet.
51265121
return getUnknown(PN);

llvm/test/Analysis/ScalarEvolution/solve-quadratic-i1.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ b2: ; preds = %b1
5858
; CHECK-NEXT: %v6 = add nuw nsw i32 %v1, 1
5959
; CHECK-NEXT: --> {4,+,1}<nuw><nsw><%b1> U: [4,7) S: [4,7) Exits: 6 LoopDispositions: { %b1: Computable }
6060
; CHECK-NEXT: %v7 = phi i32 [ %v1, %b1 ]
61-
; CHECK-NEXT: --> %v7 U: [3,6) S: [3,6)
61+
; CHECK-NEXT: --> {3,+,1}<nuw><nsw><%b1> U: [3,6) S: [3,6) --> 5 U: [5,6) S: [5,6)
6262
; CHECK-NEXT: %v8 = phi i16 [ %v3, %b1 ]
63-
; CHECK-NEXT: --> %v8 U: full-set S: full-set
63+
; CHECK-NEXT: --> {3,+,4,+,1}<%b1> U: full-set S: full-set --> 12 U: [12,13) S: [12,13)
6464
; CHECK-NEXT: Determining loop execution counts for: @f1
6565
; CHECK-NEXT: Loop %b3: <multiple exits> Unpredictable backedge-taken count.
6666
; CHECK-NEXT: Loop %b3: Unpredictable max backedge-taken count.

llvm/test/Analysis/ScalarEvolution/solve-quadratic-overflow.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
; CHECK-NEXT: %v3 = mul i16 %v2, %v2
1414
; CHECK-NEXT: --> {1,+,3,+,2}<%b1> U: full-set S: full-set Exits: 0 LoopDispositions: { %b1: Computable }
1515
; CHECK-NEXT: %v5 = phi i16 [ %v2, %b1 ]
16-
; CHECK-NEXT: --> %v5 U: [-256,0) S: [-256,0)
16+
; CHECK-NEXT: --> {-1,+,-1}<%b1> U: [-256,0) S: [-256,0) --> -256 U: [-256,-255) S: [-256,-255)
1717
; CHECK-NEXT: %v6 = phi i16 [ %v3, %b1 ]
18-
; CHECK-NEXT: --> %v6 U: full-set S: full-set
18+
; CHECK-NEXT: --> {1,+,3,+,2}<%b1> U: full-set S: full-set --> 0 U: [0,1) S: [0,1)
1919
; CHECK-NEXT: %v7 = sext i16 %v5 to i32
20-
; CHECK-NEXT: --> (sext i16 %v5 to i32) U: [-256,0) S: [-256,0)
20+
; CHECK-NEXT: --> {-1,+,-1}<nsw><%b1> U: [-256,0) S: [-256,0) --> -256 U: [-256,-255) S: [-256,-255)
2121
; CHECK-NEXT: Determining loop execution counts for: @f0
2222
; CHECK-NEXT: Loop %b1: backedge-taken count is 255
2323
; CHECK-NEXT: Loop %b1: max backedge-taken count is 255

llvm/test/Transforms/LoopStrengthReduce/funclet.ll

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -15,25 +15,21 @@ define void @f() personality i32 (...)* @_except_handler3 {
1515
; CHECK-NEXT: entry:
1616
; CHECK-NEXT: br label [[THROW:%.*]]
1717
; CHECK: throw:
18-
; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
1918
; CHECK-NEXT: invoke void @reserve()
2019
; CHECK-NEXT: to label [[THROW]] unwind label [[PAD:%.*]]
2120
; CHECK: pad:
22-
; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[THROW]] ]
2321
; CHECK-NEXT: [[CS:%.*]] = catchswitch within none [label %unreachable] unwind label [[BLAH2:%.*]]
2422
; CHECK: unreachable:
2523
; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
2624
; CHECK-NEXT: unreachable
2725
; CHECK: blah2:
2826
; CHECK-NEXT: [[CLEANUPPADI4_I_I_I:%.*]] = cleanuppad within none []
29-
; CHECK-NEXT: [[PHI21:%.*]] = ptrtoint i8* [[PHI2]] to i32
30-
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 1, [[PHI21]]
31-
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, i8* undef, i32 [[TMP1]]
3227
; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
3328
; CHECK: loop_body:
34-
; CHECK-NEXT: [[LSR_IV:%.*]] = phi i8* [ [[SCEVGEP2:%.*]], [[ITER:%.*]] ], [ [[SCEVGEP]], [[BLAH2]] ]
35-
; CHECK-NEXT: [[SCEVGEP2]] = getelementptr i8, i8* [[LSR_IV]], i32 -1
36-
; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[SCEVGEP2]], null
29+
; CHECK-NEXT: [[LSR_IV:%.*]] = phi i32 [ [[LSR_IV_NEXT:%.*]], [[ITER:%.*]] ], [ 0, [[BLAH2]] ]
30+
; CHECK-NEXT: [[LSR_IV_NEXT]] = add nuw nsw i32 [[LSR_IV]], -1
31+
; CHECK-NEXT: [[LSR_IV_NEXT1:%.*]] = inttoptr i32 [[LSR_IV_NEXT]] to i8*
32+
; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[LSR_IV_NEXT1]], null
3733
; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
3834
; CHECK: iter:
3935
; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
@@ -78,29 +74,25 @@ define void @g() personality i32 (...)* @_except_handler3 {
7874
; CHECK-NEXT: entry:
7975
; CHECK-NEXT: br label [[THROW:%.*]]
8076
; CHECK: throw:
81-
; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
8277
; CHECK-NEXT: invoke void @reserve()
8378
; CHECK-NEXT: to label [[THROW]] unwind label [[PAD:%.*]]
8479
; CHECK: pad:
85-
; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[THROW]] ]
8680
; CHECK-NEXT: [[CS:%.*]] = catchswitch within none [label [[UNREACHABLE:%.*]], label %blah] unwind to caller
8781
; CHECK: unreachable:
8882
; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
8983
; CHECK-NEXT: unreachable
9084
; CHECK: blah:
9185
; CHECK-NEXT: [[CATCHPAD:%.*]] = catchpad within [[CS]] []
92-
; CHECK-NEXT: [[PHI21:%.*]] = ptrtoint i8* [[PHI2]] to i32
93-
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 1, [[PHI21]]
94-
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, i8* undef, i32 [[TMP1]]
9586
; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
9687
; CHECK: unwind_out:
9788
; CHECK-NEXT: catchret from [[CATCHPAD]] to label [[LEAVE:%.*]]
9889
; CHECK: leave:
9990
; CHECK-NEXT: ret void
10091
; CHECK: loop_body:
101-
; CHECK-NEXT: [[LSR_IV:%.*]] = phi i8* [ [[SCEVGEP2:%.*]], [[ITER:%.*]] ], [ [[SCEVGEP]], [[BLAH:%.*]] ]
102-
; CHECK-NEXT: [[SCEVGEP2]] = getelementptr i8, i8* [[LSR_IV]], i32 -1
103-
; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[SCEVGEP2]], null
92+
; CHECK-NEXT: [[LSR_IV:%.*]] = phi i32 [ [[LSR_IV_NEXT:%.*]], [[ITER:%.*]] ], [ 0, [[BLAH:%.*]] ]
93+
; CHECK-NEXT: [[LSR_IV_NEXT]] = add nuw nsw i32 [[LSR_IV]], -1
94+
; CHECK-NEXT: [[LSR_IV_NEXT1:%.*]] = inttoptr i32 [[LSR_IV_NEXT]] to i8*
95+
; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[LSR_IV_NEXT1]], null
10496
; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
10597
; CHECK: iter:
10698
; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
@@ -146,7 +138,6 @@ define void @h() personality i32 (...)* @_except_handler3 {
146138
; CHECK-NEXT: entry:
147139
; CHECK-NEXT: br label [[THROW:%.*]]
148140
; CHECK: throw:
149-
; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
150141
; CHECK-NEXT: invoke void @reserve()
151142
; CHECK-NEXT: to label [[THROW]] unwind label [[PAD:%.*]]
152143
; CHECK: pad:
@@ -155,20 +146,17 @@ define void @h() personality i32 (...)* @_except_handler3 {
155146
; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
156147
; CHECK-NEXT: unreachable
157148
; CHECK: blug:
158-
; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[PAD]] ]
159149
; CHECK-NEXT: [[CATCHPAD:%.*]] = catchpad within [[CS]] []
160-
; CHECK-NEXT: [[PHI21:%.*]] = ptrtoint i8* [[PHI2]] to i32
161-
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 1, [[PHI21]]
162-
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, i8* undef, i32 [[TMP1]]
163150
; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
164151
; CHECK: unwind_out:
165152
; CHECK-NEXT: catchret from [[CATCHPAD]] to label [[LEAVE:%.*]]
166153
; CHECK: leave:
167154
; CHECK-NEXT: ret void
168155
; CHECK: loop_body:
169-
; CHECK-NEXT: [[LSR_IV:%.*]] = phi i8* [ [[SCEVGEP2:%.*]], [[ITER:%.*]] ], [ [[SCEVGEP]], [[BLUG:%.*]] ]
170-
; CHECK-NEXT: [[SCEVGEP2]] = getelementptr i8, i8* [[LSR_IV]], i32 -1
171-
; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[SCEVGEP2]], null
156+
; CHECK-NEXT: [[LSR_IV:%.*]] = phi i32 [ [[LSR_IV_NEXT:%.*]], [[ITER:%.*]] ], [ 0, [[BLUG:%.*]] ]
157+
; CHECK-NEXT: [[LSR_IV_NEXT]] = add nuw nsw i32 [[LSR_IV]], -1
158+
; CHECK-NEXT: [[LSR_IV_NEXT1:%.*]] = inttoptr i32 [[LSR_IV_NEXT]] to i8*
159+
; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[LSR_IV_NEXT1]], null
172160
; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
173161
; CHECK: iter:
174162
; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]
@@ -214,11 +202,9 @@ define void @i() personality i32 (...)* @_except_handler3 {
214202
; CHECK-NEXT: entry:
215203
; CHECK-NEXT: br label [[THROW:%.*]]
216204
; CHECK: throw:
217-
; CHECK-NEXT: [[TMP96:%.*]] = getelementptr inbounds i8, i8* undef, i32 1
218205
; CHECK-NEXT: invoke void @reserve()
219206
; CHECK-NEXT: to label [[THROW]] unwind label [[CATCHPAD:%.*]]
220207
; CHECK: catchpad:
221-
; CHECK-NEXT: [[PHI2:%.*]] = phi i8* [ [[TMP96]], [[THROW]] ]
222208
; CHECK-NEXT: [[CS:%.*]] = catchswitch within none [label %cp_body] unwind label [[CLEANUPPAD:%.*]]
223209
; CHECK: cp_body:
224210
; CHECK-NEXT: [[TMP0:%.*]] = catchpad within [[CS]] []
@@ -227,14 +213,12 @@ define void @i() personality i32 (...)* @_except_handler3 {
227213
; CHECK-NEXT: [[TMP1:%.*]] = cleanuppad within none []
228214
; CHECK-NEXT: br label [[LOOP_HEAD]]
229215
; CHECK: loop_head:
230-
; CHECK-NEXT: [[PHI21:%.*]] = ptrtoint i8* [[PHI2]] to i32
231-
; CHECK-NEXT: [[TMP2:%.*]] = sub i32 1, [[PHI21]]
232-
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, i8* undef, i32 [[TMP2]]
233216
; CHECK-NEXT: br label [[LOOP_BODY:%.*]]
234217
; CHECK: loop_body:
235-
; CHECK-NEXT: [[LSR_IV:%.*]] = phi i8* [ [[SCEVGEP2:%.*]], [[ITER:%.*]] ], [ [[SCEVGEP]], [[LOOP_HEAD]] ]
236-
; CHECK-NEXT: [[SCEVGEP2]] = getelementptr i8, i8* [[LSR_IV]], i32 -1
237-
; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[SCEVGEP2]], null
218+
; CHECK-NEXT: [[LSR_IV:%.*]] = phi i32 [ [[LSR_IV_NEXT:%.*]], [[ITER:%.*]] ], [ 0, [[LOOP_HEAD]] ]
219+
; CHECK-NEXT: [[LSR_IV_NEXT]] = add nuw nsw i32 [[LSR_IV]], -1
220+
; CHECK-NEXT: [[LSR_IV_NEXT1:%.*]] = inttoptr i32 [[LSR_IV_NEXT]] to i8*
221+
; CHECK-NEXT: [[TMP100:%.*]] = icmp eq i8* [[LSR_IV_NEXT1]], null
238222
; CHECK-NEXT: br i1 [[TMP100]], label [[UNWIND_OUT:%.*]], label [[ITER]]
239223
; CHECK: iter:
240224
; CHECK-NEXT: br i1 true, label [[UNWIND_OUT]], label [[LOOP_BODY]]

0 commit comments

Comments
 (0)