Skip to content

Commit f8045b2

Browse files
committed
Recommit "[SCCP] Remove forcedconstant, go to overdefined instead"
This includes a fix for cases where things get marked as overdefined in ResolvedUndefsIn, but we later discover a constant. To avoid crashing, we consistently bail out on overdefined values in the visitors. This is similar to the previous behavior with forcedconstant. This reverts the revert commit 02b72f5.
1 parent 549b436 commit f8045b2

File tree

14 files changed

+785
-348
lines changed

14 files changed

+785
-348
lines changed

llvm/lib/Transforms/Scalar/SCCP.cpp

Lines changed: 53 additions & 234 deletions
Large diffs are not rendered by default.

llvm/test/Transforms/IPConstantProp/PR16052.ll

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --function-signature --scrub-attributes
22
; RUN: opt < %s -S -ipsccp | FileCheck %s
33

44
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
@@ -7,7 +7,9 @@ target triple = "x86_64-unknown-linux-gnu"
77
define i64 @fn2() {
88
; CHECK-LABEL: define {{[^@]+}}@fn2()
99
; CHECK-NEXT: entry:
10-
; CHECK-NEXT: [[CALL2:%.*]] = call i64 @fn1(i64 undef)
10+
; CHECK-NEXT: [[CONV:%.*]] = sext i32 undef to i64
11+
; CHECK-NEXT: [[DIV:%.*]] = sdiv i64 8, [[CONV]]
12+
; CHECK-NEXT: [[CALL2:%.*]] = call i64 @fn1(i64 [[DIV]])
1113
; CHECK-NEXT: ret i64 [[CALL2]]
1214
;
1315
entry:
@@ -21,7 +23,8 @@ define internal i64 @fn1(i64 %p1) {
2123
; CHECK-LABEL: define {{[^@]+}}@fn1
2224
; CHECK-SAME: (i64 [[P1:%.*]])
2325
; CHECK-NEXT: entry:
24-
; CHECK-NEXT: [[COND:%.*]] = select i1 undef, i64 undef, i64 undef
26+
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i64 [[P1]], 0
27+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], i64 [[P1]], i64 [[P1]]
2528
; CHECK-NEXT: ret i64 [[COND]]
2629
;
2730
entry:

llvm/test/Transforms/IPConstantProp/PR26044.ll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ define void @fn2(i32* %P) {
1111
; CHECK: for.cond1:
1212
; CHECK-NEXT: br i1 false, label [[IF_END]], label [[IF_END]]
1313
; CHECK: if.end:
14-
; CHECK-NEXT: [[CALL:%.*]] = call i32 @fn1(i32 undef)
14+
; CHECK-NEXT: [[TMP0:%.*]] = load i32, i32* null, align 4
15+
; CHECK-NEXT: [[CALL:%.*]] = call i32 @fn1(i32 [[TMP0]])
1516
; CHECK-NEXT: store i32 [[CALL]], i32* [[P]]
1617
; CHECK-NEXT: br label [[FOR_COND1:%.*]]
1718
;
@@ -33,7 +34,8 @@ define internal i32 @fn1(i32 %p1) {
3334
; CHECK-LABEL: define {{[^@]+}}@fn1
3435
; CHECK-SAME: (i32 [[P1:%.*]])
3536
; CHECK-NEXT: entry:
36-
; CHECK-NEXT: [[COND:%.*]] = select i1 undef, i32 undef, i32 undef
37+
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[P1]], 0
38+
; CHECK-NEXT: [[COND:%.*]] = select i1 [[TOBOOL]], i32 [[P1]], i32 [[P1]]
3739
; CHECK-NEXT: ret i32 [[COND]]
3840
;
3941
entry:
Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1-
; RUN: opt < %s -sccp -S | \
2-
; RUN: grep "ret i1 false"
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -sccp -S | FileCheck %s
33

44
define i1 @foo() {
5-
%X = and i1 false, undef ; <i1> [#uses=1]
6-
ret i1 %X
5+
; CHECK-LABEL: @foo(
6+
; CHECK-NEXT: [[X:%.*]] = and i1 false, undef
7+
; CHECK-NEXT: ret i1 [[X]]
8+
;
9+
%X = and i1 false, undef ; <i1> [#uses=1]
10+
ret i1 %X
711
}
812

llvm/test/Transforms/SCCP/apint-bigint2.ll

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,13 @@ define i101 @array() {
1818
}
1919

2020
; CHECK-LABEL: @large_aggregate
21-
; CHECK-NEXT: ret i101 undef
21+
; CHECK-NEXT: %B = load i101, i101* undef
22+
; CHECK-NEXT: %D = and i101 %B, 1
23+
; CHECK-NEXT: %DD = or i101 %D, 1
24+
; CHECK-NEXT: %G = getelementptr i101, i101* getelementptr inbounds ([6 x i101], [6 x i101]* @Y, i32 0, i32 5), i101 %DD
25+
; CHECK-NEXT: %L3 = load i101, i101* %G
26+
; CHECK-NEXT: ret i101 %L3
27+
;
2228
define i101 @large_aggregate() {
2329
%B = load i101, i101* undef
2430
%D = and i101 %B, 1
@@ -29,6 +35,22 @@ define i101 @large_aggregate() {
2935
ret i101 %L3
3036
}
3137

38+
; CHECK-LABEL: define i101 @large_aggregate_2() {
39+
; CHECK-NEXT: %D = and i101 undef, 1
40+
; CHECK-NEXT: %DD = or i101 %D, 1
41+
; CHECK-NEXT: %G = getelementptr i101, i101* getelementptr inbounds ([6 x i101], [6 x i101]* @Y, i32 0, i32 5), i101 %DD
42+
; CHECK-NEXT: %L3 = load i101, i101* %G
43+
; CHECK-NEXT: ret i101 %L3
44+
;
45+
define i101 @large_aggregate_2() {
46+
%D = and i101 undef, 1
47+
%DD = or i101 %D, 1
48+
%F = getelementptr [6 x i101], [6 x i101]* @Y, i32 0, i32 5
49+
%G = getelementptr i101, i101* %F, i101 %DD
50+
%L3 = load i101, i101* %G
51+
ret i101 %L3
52+
}
53+
3254
; CHECK-LABEL: @index_too_large
3355
; CHECK-NEXT: store i101* getelementptr (i101, i101* getelementptr ([6 x i101], [6 x i101]* @Y, i32 0, i32 -1), i101 9224497936761618431), i101** undef
3456
; CHECK-NEXT: ret void
Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,39 @@
1-
; RUN: opt < %s -ipsccp -S | not grep global
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -ipsccp -S | FileCheck %s
23

34
@G = internal global i66 undef
45

56

6-
77
define void @foo() {
8-
%X = load i66, i66* @G
9-
store i66 %X, i66* @G
10-
ret void
8+
; CHECK-LABEL: @foo(
9+
; CHECK-NEXT: [[X:%.*]] = load i66, i66* @G
10+
; CHECK-NEXT: store i66 [[X]], i66* @G
11+
; CHECK-NEXT: ret void
12+
;
13+
%X = load i66, i66* @G
14+
store i66 %X, i66* @G
15+
ret void
1116
}
1217

1318
define i66 @bar() {
14-
%V = load i66, i66* @G
15-
%C = icmp eq i66 %V, 17
16-
br i1 %C, label %T, label %F
19+
; CHECK-LABEL: @bar(
20+
; CHECK-NEXT: [[V:%.*]] = load i66, i66* @G
21+
; CHECK-NEXT: [[C:%.*]] = icmp eq i66 [[V]], 17
22+
; CHECK-NEXT: br i1 [[C]], label [[T:%.*]], label [[F:%.*]]
23+
; CHECK: T:
24+
; CHECK-NEXT: store i66 17, i66* @G
25+
; CHECK-NEXT: ret i66 17
26+
; CHECK: F:
27+
; CHECK-NEXT: store i66 123, i66* @G
28+
; CHECK-NEXT: ret i66 0
29+
;
30+
%V = load i66, i66* @G
31+
%C = icmp eq i66 %V, 17
32+
br i1 %C, label %T, label %F
1733
T:
18-
store i66 17, i66* @G
19-
ret i66 %V
34+
store i66 17, i66* @G
35+
ret i66 %V
2036
F:
21-
store i66 123, i66* @G
22-
ret i66 0
37+
store i66 123, i66* @G
38+
ret i66 0
2339
}

llvm/test/Transforms/SCCP/apint-select.ll

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,29 @@
1-
; RUN: opt < %s -sccp -S | not grep select
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -sccp -S | FileCheck %s
23

34
@A = constant i32 10
45

56
define i712 @test1() {
6-
%P = getelementptr i32, i32* @A, i32 0
7-
%B = ptrtoint i32* %P to i64
8-
%BB = and i64 %B, undef
9-
%C = icmp sge i64 %BB, 0
10-
%X = select i1 %C, i712 0, i712 1
11-
ret i712 %X
7+
; CHECK-LABEL: @test1(
8+
; CHECK-NEXT: [[BB:%.*]] = and i64 ptrtoint (i32* @A to i64), undef
9+
; CHECK-NEXT: [[C:%.*]] = icmp sge i64 [[BB]], 0
10+
; CHECK-NEXT: [[X:%.*]] = select i1 [[C]], i712 0, i712 1
11+
; CHECK-NEXT: ret i712 [[X]]
12+
;
13+
%P = getelementptr i32, i32* @A, i32 0
14+
%B = ptrtoint i32* %P to i64
15+
%BB = and i64 %B, undef
16+
%C = icmp sge i64 %BB, 0
17+
%X = select i1 %C, i712 0, i712 1
18+
ret i712 %X
1219
}
1320

1421

1522

1623
define i712 @test2(i1 %C) {
17-
%X = select i1 %C, i712 0, i712 undef
18-
ret i712 %X
24+
; CHECK-LABEL: @test2(
25+
; CHECK-NEXT: ret i712 0
26+
;
27+
%X = select i1 %C, i712 0, i712 undef
28+
ret i712 %X
1929
}
20-
21-

llvm/test/Transforms/SCCP/ip-constant-ranges.ll

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,10 +141,12 @@ define double @test_struct({ double, double } %test) {
141141
; Constant range for %x is [47, 302)
142142
; CHECK-LABEL: @f5
143143
; CHECK-NEXT: entry:
144-
; CHECK-NEXT: %cmp = icmp sgt i32 %x, undef
145-
; CHECK-NEXT: %res1 = select i1 %cmp, i32 1, i32 2
146-
; CHECK-NEXT: %res = add i32 %res1, 3
147-
; CHECK-NEXT: ret i32 %res
144+
; CHECK-NEXT: %cmp = icmp sgt i32 %x, undef
145+
; CHECK-NEXT: %cmp2 = icmp ne i32 undef, %x
146+
; CHECK-NEXT: %res1 = select i1 %cmp, i32 1, i32 2
147+
; CHECK-NEXT: %res2 = select i1 %cmp2, i32 3, i32 4
148+
; CHECK-NEXT: %res = add i32 %res1, %res2
149+
; CHECK-NEXT: ret i32 %res
148150
define internal i32 @f5(i32 %x) {
149151
entry:
150152
%cmp = icmp sgt i32 %x, undef

llvm/test/Transforms/SCCP/ipsccp-basic.ll

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ define void @test3a() {
5656
ret void
5757
}
5858
; CHECK-LABEL: define void @test3a(
59-
; CHECK-NEXT: ret void
59+
; CHECK-NEXT: %X = load i32, i32* @G
60+
; CHECK-NEXT: store i32 %X, i32* @G
61+
; CHECK-NEXT: ret void
6062

6163

6264
define i32 @test3b() {
@@ -71,9 +73,17 @@ F:
7173
ret i32 0
7274
}
7375
; CHECK-LABEL: define i32 @test3b(
74-
; CHECK-NOT: store
75-
; CHECK: ret i32 0
76+
; CHECK-NEXT: %V = load i32, i32* @G
77+
; CHECK-NEXT: %C = icmp eq i32 %V, 17
78+
; CHECK-NEXT: br i1 %C, label %T, label %F
79+
80+
; CHECK-LABEL: T:
81+
; CHECK-NEXT: store i32 17, i32* @G
82+
; CHECK-NEXT: ret i32 17
7683

84+
; CHECK-LABEL: F:
85+
; CHECK-NEXT: store i32 123, i32* @G
86+
; CHECK-NEXT: ret i32 0
7787

7888
;;======================== test4
7989

@@ -226,16 +236,21 @@ define i32 @test10a() nounwind {
226236
entry:
227237
%call = call i32 @test10b(i32 undef)
228238
ret i32 %call
239+
229240
; CHECK-LABEL: define i32 @test10a(
230-
; CHECK: ret i32 0
241+
; CHECK-NEXT: entry:
242+
; CHECK-NEXT: %call = call i32 @test10b(i32 undef)
243+
; CHECK-NEXT: ret i32 %call
231244
}
232245

233246
define internal i32 @test10b(i32 %x) nounwind {
234247
entry:
235248
%r = and i32 %x, 1
236249
ret i32 %r
237250
; CHECK-LABEL: define internal i32 @test10b(
238-
; CHECK: ret i32 undef
251+
; CHECK-NEXT: entry:
252+
; CHECK-NEXT: %r = and i32 undef, 1
253+
; CHECK-NEXT: ret i32 %r
239254
}
240255

241256
;;======================== test11
@@ -244,17 +259,18 @@ define i64 @test11a() {
244259
%xor = xor i64 undef, undef
245260
ret i64 %xor
246261
; CHECK-LABEL: define i64 @test11a
247-
; CHECK: ret i64 0
262+
; CHECK-NEXT: %xor = xor i64 undef, undef
263+
; CHECK-NEXT: ret i64 %xor
248264
}
249265

250266
define i64 @test11b() {
251267
%call1 = call i64 @test11a()
252268
%call2 = call i64 @llvm.ctpop.i64(i64 %call1)
253269
ret i64 %call2
254270
; CHECK-LABEL: define i64 @test11b
255-
; CHECK: %[[call1:.*]] = call i64 @test11a()
256-
; CHECK-NOT: call i64 @llvm.ctpop.i64
257-
; CHECK-NEXT: ret i64 0
271+
; CHECK-NEXT: [[call1:%.*]] = call i64 @test11a()
272+
; CHECK-NEXT: [[call2:%.*]] = call i64 @llvm.ctpop.i64(i64 [[call1]])
273+
; CHECK-NEXT: ret i64 [[call2]]
258274
}
259275

260276
declare i64 @llvm.ctpop.i64(i64)
Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,47 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
12
; RUN: opt < %s -sccp -S | FileCheck %s
23

34
; Test that SCCP has basic knowledge of when and/or/mul nuke overdefined values.
45

5-
; CHECK-LABEL: test
6-
; CHECK: ret i32 0
76
define i32 @test(i32 %X) {
7+
; CHECK-LABEL: @test(
8+
; CHECK-NEXT: ret i32 0
9+
;
810
%Y = and i32 %X, 0
911
ret i32 %Y
1012
}
1113

12-
; CHECK-LABEL: test2
13-
; CHECK: ret i32 -1
1414
define i32 @test2(i32 %X) {
15+
; CHECK-LABEL: @test2(
16+
; CHECK-NEXT: ret i32 -1
17+
;
1518
%Y = or i32 -1, %X
1619
ret i32 %Y
1720
}
1821

19-
; CHECK-LABEL: test3
20-
; CHECK: ret i32 0
2122
define i32 @test3(i32 %X) {
23+
; CHECK-LABEL: @test3(
24+
; CHECK-NEXT: [[Y:%.*]] = and i32 undef, [[X:%.*]]
25+
; CHECK-NEXT: ret i32 [[Y]]
26+
;
2227
%Y = and i32 undef, %X
2328
ret i32 %Y
2429
}
2530

26-
; CHECK-LABEL: test4
27-
; CHECK: ret i32 -1
2831
define i32 @test4(i32 %X) {
32+
; CHECK-LABEL: @test4(
33+
; CHECK-NEXT: [[Y:%.*]] = or i32 [[X:%.*]], undef
34+
; CHECK-NEXT: ret i32 [[Y]]
35+
;
2936
%Y = or i32 %X, undef
3037
ret i32 %Y
3138
}
3239

3340
; X * 0 = 0 even if X is overdefined.
34-
; CHECK-LABEL: test5
35-
; CHECK: ret i32 0
3641
define i32 @test5(i32 %foo) {
42+
; CHECK-LABEL: @test5(
43+
; CHECK-NEXT: ret i32 0
44+
;
3745
%patatino = mul i32 %foo, 0
3846
ret i32 %patatino
3947
}

0 commit comments

Comments
 (0)