Skip to content

Commit 6dc23b7

Browse files
authored
[SCEVExpander] Don't try to reuse SCEVUnknown values (#115141)
The expansion of a SCEVUnknown is trivial (it's just the wrapped value). If we try to reuse an existing value it might be a more complex expression that simplifies to the SCEVUnknown. This is inspired by #114879, because SCEVExpander replacing a constant with a phi node is just silly. (I don't consider this a fix for that issue though.)
1 parent 8f9dbb0 commit 6dc23b7

File tree

4 files changed

+9
-9
lines changed

4 files changed

+9
-9
lines changed

llvm/lib/Transforms/Utils/ScalarEvolutionExpander.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1467,8 +1467,8 @@ Value *SCEVExpander::FindValueInExprValueMap(
14671467
if (!CanonicalMode && SE.containsAddRecurrence(S))
14681468
return nullptr;
14691469

1470-
// If S is a constant, it may be worse to reuse an existing Value.
1471-
if (isa<SCEVConstant>(S))
1470+
// If S is a constant or unknown, it may be worse to reuse an existing Value.
1471+
if (isa<SCEVConstant>(S) || isa<SCEVUnknown>(S))
14721472
return nullptr;
14731473

14741474
for (Value *V : SE.getSCEVValues(S)) {

llvm/test/Transforms/LoopStrengthReduce/Power/incomplete-phi.ll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,10 @@ define void @foo(ptr %arg) {
2121
; CHECK-LABEL: define void @foo(
2222
; CHECK-SAME: ptr [[ARG:%.*]]) {
2323
; CHECK-NEXT: bb:
24-
; CHECK-NEXT: [[I:%.*]] = getelementptr [0 x %0], ptr [[ARG]], i64 0, i64 -1
25-
; CHECK-NEXT: [[I2:%.*]] = getelementptr i8, ptr [[I]], i64 4
2624
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[ARG]], i64 396
2725
; CHECK-NEXT: br label [[BB3:%.*]]
2826
; CHECK: bb3:
29-
; CHECK-NEXT: [[LSR_IV7:%.*]] = phi ptr [ [[SCEVGEP8:%.*]], [[BB18:%.*]] ], [ [[I2]], [[BB:%.*]] ]
27+
; CHECK-NEXT: [[LSR_IV7:%.*]] = phi ptr [ [[SCEVGEP8:%.*]], [[BB18:%.*]] ], [ [[ARG]], [[BB:%.*]] ]
3028
; CHECK-NEXT: [[LSR_IV5:%.*]] = phi i64 [ [[LSR_IV_NEXT6:%.*]], [[BB18]] ], [ 4, [[BB]] ]
3129
; CHECK-NEXT: [[LSR_IV1:%.*]] = phi ptr [ [[SCEVGEP2:%.*]], [[BB18]] ], [ [[SCEVGEP]], [[BB]] ]
3230
; CHECK-NEXT: br i1 true, label [[BB22_PREHEADER:%.*]], label [[BB9_PREHEADER:%.*]]

llvm/test/Transforms/LoopStrengthReduce/lsr-term-fold.ll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,15 +113,15 @@ for.end: ; preds = %for.body
113113
define void @ptr_of_ptr_addrec(ptr %ptrptr, i32 %length) {
114114
; CHECK-LABEL: @ptr_of_ptr_addrec(
115115
; CHECK-NEXT: entry:
116-
; CHECK-NEXT: [[START_PTRPTR:%.*]] = getelementptr ptr, ptr [[PTRPTR:%.*]]
116+
; CHECK-NEXT: [[START_PTRPTR1:%.*]] = getelementptr inbounds ptr, ptr [[START_PTRPTR:%.*]]
117117
; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[LENGTH:%.*]], -1
118118
; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64
119119
; CHECK-NEXT: [[TMP2:%.*]] = shl nuw nsw i64 [[TMP1]], 3
120120
; CHECK-NEXT: [[TMP3:%.*]] = add nuw nsw i64 [[TMP2]], 8
121121
; CHECK-NEXT: [[SCEVGEP:%.*]] = getelementptr i8, ptr [[START_PTRPTR]], i64 [[TMP3]]
122122
; CHECK-NEXT: br label [[FOR_BODY:%.*]]
123123
; CHECK: for.body:
124-
; CHECK-NEXT: [[IT_04:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[START_PTRPTR]], [[ENTRY:%.*]] ]
124+
; CHECK-NEXT: [[IT_04:%.*]] = phi ptr [ [[INCDEC_PTR:%.*]], [[FOR_BODY]] ], [ [[START_PTRPTR1]], [[ENTRY:%.*]] ]
125125
; CHECK-NEXT: [[TMP4:%.*]] = load ptr, ptr [[IT_04]], align 8
126126
; CHECK-NEXT: tail call void @foo(ptr [[TMP4]])
127127
; CHECK-NEXT: [[INCDEC_PTR]] = getelementptr ptr, ptr [[IT_04]], i64 1

llvm/test/Transforms/LoopVectorize/pr45259.ll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@ define i8 @widget(ptr %arr, i8 %t9) {
1414
; CHECK-NEXT: br i1 [[C]], label [[FOR_PREHEADER:%.*]], label [[BB6]]
1515
; CHECK: for.preheader:
1616
; CHECK-NEXT: [[T1_0_LCSSA:%.*]] = phi ptr [ [[T1_0]], [[BB6]] ]
17+
; CHECK-NEXT: [[T1_0_LCSSA4:%.*]] = phi ptr [ [[T1_0]], [[BB6]] ]
18+
; CHECK-NEXT: [[T1_0_LCSSA1:%.*]] = phi ptr [ [[T1_0]], [[BB6]] ]
1719
; CHECK-NEXT: [[TMP0:%.*]] = trunc i64 [[ARR1]] to i32
1820
; CHECK-NEXT: [[TMP1:%.*]] = sub i32 0, [[TMP0]]
1921
; CHECK-NEXT: [[T1_0_LCSSA3:%.*]] = ptrtoint ptr [[T1_0_LCSSA]] to i64
2022
; CHECK-NEXT: [[TMP2:%.*]] = trunc i64 [[T1_0_LCSSA3]] to i32
2123
; CHECK-NEXT: [[TMP3:%.*]] = add i32 [[TMP1]], [[TMP2]]
22-
; CHECK-NEXT: [[T1_0_LCSSA2:%.*]] = ptrtoint ptr [[T1_0_LCSSA]] to i64
24+
; CHECK-NEXT: [[T1_0_LCSSA2:%.*]] = ptrtoint ptr [[T1_0_LCSSA4]] to i64
2325
; CHECK-NEXT: [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[TMP3]], 4
2426
; CHECK-NEXT: br i1 [[MIN_ITERS_CHECK]], label [[SCALAR_PH:%.*]], label [[VECTOR_SCEVCHECK:%.*]]
2527
; CHECK: vector.scevcheck:
@@ -65,7 +67,7 @@ define i8 @widget(ptr %arr, i8 %t9) {
6567
; CHECK-NEXT: [[T3_I:%.*]] = icmp slt i8 [[IV_NEXT]], [[T9]]
6668
; CHECK-NEXT: [[T3_I8:%.*]] = zext i1 [[T3_I]] to i8
6769
; CHECK-NEXT: store i8 [[T3_I8]], ptr [[PTR]], align 1
68-
; CHECK-NEXT: [[EC:%.*]] = icmp eq ptr [[T1_0_LCSSA]], [[PTR]]
70+
; CHECK-NEXT: [[EC:%.*]] = icmp eq ptr [[T1_0_LCSSA1]], [[PTR]]
6971
; CHECK-NEXT: br i1 [[EC]], label [[FOR_EXIT]], label [[FOR_BODY]], !llvm.loop [[LOOP3:![0-9]+]]
7072
; CHECK: for.exit:
7173
; CHECK-NEXT: [[IV_NEXT_LCSSA:%.*]] = phi i8 [ [[IV_NEXT]], [[FOR_BODY]] ], [ [[IND_END]], [[MIDDLE_BLOCK]] ]

0 commit comments

Comments
 (0)