blob: c1c6c926fd9b636aa46eecd6cbef351869d02d4d [file] [log] [blame]
Chris Lattnerc702b6a2009-10-20 20:39:43 +00001; RUN: opt < %s -ipsccp -S | FileCheck %s
Chris Lattnerc2965a62004-12-10 07:54:51 +00002
Chris Lattnerc702b6a2009-10-20 20:39:43 +00003;;======================== test1
4
5define internal i32 @test1a(i32 %A) {
6 %X = add i32 1, 2
Tanya Lattner1d526b92008-03-19 04:14:49 +00007 ret i32 %A
Chris Lattnerc2965a62004-12-10 07:54:51 +00008}
Stephen Lina76289a2013-07-14 01:50:49 +00009; CHECK-LABEL: define internal i32 @test1a(
Chris Lattnerc702b6a2009-10-20 20:39:43 +000010; CHECK: ret i32 undef
Chris Lattnerc2965a62004-12-10 07:54:51 +000011
Chris Lattnerc702b6a2009-10-20 20:39:43 +000012define i32 @test1b() {
13 %X = call i32 @test1a( i32 17 )
Tanya Lattner1d526b92008-03-19 04:14:49 +000014 ret i32 %X
Chris Lattnerc702b6a2009-10-20 20:39:43 +000015
Stephen Lina76289a2013-07-14 01:50:49 +000016; CHECK-LABEL: define i32 @test1b(
Chris Lattnerc702b6a2009-10-20 20:39:43 +000017; CHECK: ret i32 17
Chris Lattnerc2965a62004-12-10 07:54:51 +000018}
Tanya Lattner1d526b92008-03-19 04:14:49 +000019
Chris Lattnerc702b6a2009-10-20 20:39:43 +000020
21
22;;======================== test2
23
24define internal i32 @test2a(i32 %A) {
25 %C = icmp eq i32 %A, 0
26 br i1 %C, label %T, label %F
27T:
28 %B = call i32 @test2a( i32 0 )
29 ret i32 0
30F:
31 %C.upgrd.1 = call i32 @test2a(i32 1)
32 ret i32 %C.upgrd.1
33}
Stephen Lina76289a2013-07-14 01:50:49 +000034; CHECK-LABEL: define internal i32 @test2a(
Chris Lattnerc702b6a2009-10-20 20:39:43 +000035; CHECK-NEXT: br label %T
36; CHECK: ret i32 undef
37
38
39define i32 @test2b() {
40 %X = call i32 @test2a(i32 0)
41 ret i32 %X
42}
Stephen Lina76289a2013-07-14 01:50:49 +000043; CHECK-LABEL: define i32 @test2b(
Chris Lattnerc702b6a2009-10-20 20:39:43 +000044; CHECK-NEXT: %X = call i32 @test2a(i32 0)
45; CHECK-NEXT: ret i32 0
46
47
48;;======================== test3
49
50@G = internal global i32 undef
51
52define void @test3a() {
53 %X = load i32* @G
54 store i32 %X, i32* @G
55 ret void
56}
Stephen Lina76289a2013-07-14 01:50:49 +000057; CHECK-LABEL: define void @test3a(
Chris Lattnerc702b6a2009-10-20 20:39:43 +000058; CHECK-NEXT: ret void
59
60
61define i32 @test3b() {
62 %V = load i32* @G
63 %C = icmp eq i32 %V, 17
64 br i1 %C, label %T, label %F
65T:
66 store i32 17, i32* @G
67 ret i32 %V
68F:
69 store i32 123, i32* @G
70 ret i32 0
71}
Stephen Lina76289a2013-07-14 01:50:49 +000072; CHECK-LABEL: define i32 @test3b(
Chris Lattnerc702b6a2009-10-20 20:39:43 +000073; CHECK-NOT: store
74; CHECK: ret i32 0
Chris Lattner582d0562009-10-20 21:00:47 +000075
76
77;;======================== test4
78
79define internal {i64,i64} @test4a() {
80 %a = insertvalue {i64,i64} undef, i64 4, 1
81 %b = insertvalue {i64,i64} %a, i64 5, 0
82 ret {i64,i64} %b
83}
84
85define i64 @test4b() {
86 %a = invoke {i64,i64} @test4a()
87 to label %A unwind label %B
88A:
89 %b = extractvalue {i64,i64} %a, 0
90 %c = call i64 @test4c(i64 %b)
91 ret i64 %c
92B:
Bill Wendlingb1e680f2011-08-31 20:55:40 +000093 %val = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
94 catch i8* null
Chris Lattner582d0562009-10-20 21:00:47 +000095 ret i64 0
96}
97; CHECK: define i64 @test4b()
98; CHECK: %c = call i64 @test4c(i64 5)
99; CHECK-NEXT: ret i64 5
100
101
102define internal i64 @test4c(i64 %a) {
103 ret i64 %a
104}
Stephen Lina76289a2013-07-14 01:50:49 +0000105; CHECK-LABEL: define internal i64 @test4c(
Chris Lattner582d0562009-10-20 21:00:47 +0000106; CHECK: ret i64 undef
Chris Lattner0f15e032009-10-20 21:04:26 +0000107
108
109
110;;======================== test5
111
112; PR4313
113define internal {i64,i64} @test5a() {
114 %a = insertvalue {i64,i64} undef, i64 4, 1
115 %b = insertvalue {i64,i64} %a, i64 5, 0
116 ret {i64,i64} %b
117}
118
119define i64 @test5b() {
120 %a = invoke {i64,i64} @test5a()
121 to label %A unwind label %B
122A:
123 %c = call i64 @test5c({i64,i64} %a)
124 ret i64 %c
125B:
Bill Wendlingb1e680f2011-08-31 20:55:40 +0000126 %val = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
127 catch i8* null
Chris Lattner0f15e032009-10-20 21:04:26 +0000128 ret i64 0
129}
130
131; CHECK: define i64 @test5b()
132; CHECK: A:
Chris Lattnerb1ed91f2011-07-09 17:41:24 +0000133; CHECK-NEXT: %c = call i64 @test5c({ i64, i64 } %a)
Chris Lattner156b8c72009-11-03 23:40:48 +0000134; CHECK-NEXT: ret i64 5
Chris Lattner0f15e032009-10-20 21:04:26 +0000135
136define internal i64 @test5c({i64,i64} %a) {
137 %b = extractvalue {i64,i64} %a, 0
138 ret i64 %b
139}
140
Chris Lattner9d49f0c2009-11-02 07:33:59 +0000141
142;;======================== test6
143
144define i64 @test6a() {
145 ret i64 0
146}
147
148define i64 @test6b() {
149 %a = call i64 @test6a()
150 ret i64 %a
151}
Stephen Lina76289a2013-07-14 01:50:49 +0000152; CHECK-LABEL: define i64 @test6b(
Chris Lattner9d49f0c2009-11-02 07:33:59 +0000153; CHECK: ret i64 0
154
Chris Lattnere364a322009-11-02 18:27:22 +0000155;;======================== test7
156
157
158%T = type {i32,i32}
159
Chris Lattnerb1ed91f2011-07-09 17:41:24 +0000160define internal %T @test7a(i32 %A) {
Chris Lattnere364a322009-11-02 18:27:22 +0000161 %X = add i32 1, %A
162 %mrv0 = insertvalue %T undef, i32 %X, 0
163 %mrv1 = insertvalue %T %mrv0, i32 %A, 1
164 ret %T %mrv1
Stephen Linc1c7a132013-07-14 01:42:54 +0000165; CHECK-LABEL: @test7a(
Chris Lattnere364a322009-11-02 18:27:22 +0000166; CHECK-NEXT: %mrv0 = insertvalue %T undef, i32 18, 0
167; CHECK-NEXT: %mrv1 = insertvalue %T %mrv0, i32 17, 1
168}
169
170define i32 @test7b() {
Chris Lattnerb1ed91f2011-07-09 17:41:24 +0000171 %X = call %T @test7a(i32 17)
172 %Y = extractvalue %T %X, 0
Chris Lattnere364a322009-11-02 18:27:22 +0000173 %Z = add i32 %Y, %Y
174 ret i32 %Z
Stephen Lina76289a2013-07-14 01:50:49 +0000175; CHECK-LABEL: define i32 @test7b(
Chris Lattnere364a322009-11-02 18:27:22 +0000176; CHECK-NEXT: call %T @test7a(i32 17)
177; CHECK-NEXT: ret i32 36
178}
179
Chris Lattnercde8de52009-11-03 19:24:51 +0000180;;======================== test8
181
182
183define internal {} @test8a(i32 %A, i32* %P) {
184 store i32 %A, i32* %P
185 ret {} {}
Stephen Linc1c7a132013-07-14 01:42:54 +0000186; CHECK-LABEL: @test8a(
Chris Lattnercde8de52009-11-03 19:24:51 +0000187; CHECK-NEXT: store i32 5,
188; CHECK-NEXT: ret
189}
190
191define void @test8b(i32* %P) {
192 %X = call {} @test8a(i32 5, i32* %P)
193 ret void
Stephen Lina76289a2013-07-14 01:50:49 +0000194; CHECK-LABEL: define void @test8b(
Dan Gohman386e01e2010-04-08 18:03:05 +0000195; CHECK-NEXT: call {} @test8a
Chris Lattnercde8de52009-11-03 19:24:51 +0000196; CHECK-NEXT: ret void
197}
198
Chris Lattner69c523c2009-11-03 21:25:50 +0000199;;======================== test9
Chris Lattnercde8de52009-11-03 19:24:51 +0000200
Chris Lattner69c523c2009-11-03 21:25:50 +0000201@test9g = internal global { } zeroinitializer
202
203define void @test9() {
204entry:
205 %local_foo = alloca { }
Chris Lattner9122fa22009-11-03 21:26:26 +0000206 load { }* @test9g
Chris Lattner69c523c2009-11-03 21:25:50 +0000207 store { } %0, { }* %local_foo
208 ret void
209}
Chris Lattnere364a322009-11-02 18:27:22 +0000210
Bill Wendlingb1e680f2011-08-31 20:55:40 +0000211declare i32 @__gxx_personality_v0(...)
Eli Friedman1815b682011-09-20 23:28:51 +0000212
213;;======================== test10
214
215define i32 @test10a() nounwind {
216entry:
217 %call = call i32 @test10b(i32 undef)
218 ret i32 %call
Stephen Lina76289a2013-07-14 01:50:49 +0000219; CHECK-LABEL: define i32 @test10a(
Eli Friedman1815b682011-09-20 23:28:51 +0000220; CHECK: ret i32 0
221}
222
223define internal i32 @test10b(i32 %x) nounwind {
224entry:
225 %r = and i32 %x, 1
226 ret i32 %r
Stephen Lina76289a2013-07-14 01:50:49 +0000227; CHECK-LABEL: define internal i32 @test10b(
Eli Friedman1815b682011-09-20 23:28:51 +0000228; CHECK: ret i32 undef
229}