blob: 11edcf48bea341c1c8c9c8f3529f69b5a2050148 [file] [log] [blame]
Chris Lattner82ad3522009-10-20 20:39:43 +00001; RUN: opt < %s -ipsccp -S | FileCheck %s
Chris Lattner3e5b0302009-11-02 18:22:51 +00002; XFAIL: *
Dan Gohmanf17a25c2007-07-18 16:29:46 +00003
Chris Lattner82ad3522009-10-20 20:39:43 +00004;;======================== test1
5
6define internal i32 @test1a(i32 %A) {
7 %X = add i32 1, 2
Tanya Lattnerba93e2d2008-03-19 04:14:49 +00008 ret i32 %A
Dan Gohmanf17a25c2007-07-18 16:29:46 +00009}
Chris Lattner82ad3522009-10-20 20:39:43 +000010; CHECK: define internal i32 @test1a
11; CHECK: ret i32 undef
Dan Gohmanf17a25c2007-07-18 16:29:46 +000012
Chris Lattner82ad3522009-10-20 20:39:43 +000013define i32 @test1b() {
14 %X = call i32 @test1a( i32 17 )
Tanya Lattnerba93e2d2008-03-19 04:14:49 +000015 ret i32 %X
Chris Lattner82ad3522009-10-20 20:39:43 +000016
17; CHECK: define i32 @test1b
18; CHECK: ret i32 17
Dan Gohmanf17a25c2007-07-18 16:29:46 +000019}
Tanya Lattnerba93e2d2008-03-19 04:14:49 +000020
Chris Lattner82ad3522009-10-20 20:39:43 +000021
22
23;;======================== test2
24
25define internal i32 @test2a(i32 %A) {
26 %C = icmp eq i32 %A, 0
27 br i1 %C, label %T, label %F
28T:
29 %B = call i32 @test2a( i32 0 )
30 ret i32 0
31F:
32 %C.upgrd.1 = call i32 @test2a(i32 1)
33 ret i32 %C.upgrd.1
34}
35; CHECK: define internal i32 @test2a
36; CHECK-NEXT: br label %T
37; CHECK: ret i32 undef
38
39
40define i32 @test2b() {
41 %X = call i32 @test2a(i32 0)
42 ret i32 %X
43}
44; CHECK: define i32 @test2b
45; CHECK-NEXT: %X = call i32 @test2a(i32 0)
46; CHECK-NEXT: ret i32 0
47
48
49;;======================== test3
50
51@G = internal global i32 undef
52
53define void @test3a() {
54 %X = load i32* @G
55 store i32 %X, i32* @G
56 ret void
57}
58; CHECK: define void @test3a
59; CHECK-NEXT: ret void
60
61
62define i32 @test3b() {
63 %V = load i32* @G
64 %C = icmp eq i32 %V, 17
65 br i1 %C, label %T, label %F
66T:
67 store i32 17, i32* @G
68 ret i32 %V
69F:
70 store i32 123, i32* @G
71 ret i32 0
72}
73; CHECK: define i32 @test3b
74; CHECK-NOT: store
75; CHECK: ret i32 0
Chris Lattnerf3eec132009-10-20 21:00:47 +000076
77
78;;======================== test4
79
80define internal {i64,i64} @test4a() {
81 %a = insertvalue {i64,i64} undef, i64 4, 1
82 %b = insertvalue {i64,i64} %a, i64 5, 0
83 ret {i64,i64} %b
84}
85
86define i64 @test4b() {
87 %a = invoke {i64,i64} @test4a()
88 to label %A unwind label %B
89A:
90 %b = extractvalue {i64,i64} %a, 0
91 %c = call i64 @test4c(i64 %b)
92 ret i64 %c
93B:
94 ret i64 0
95}
96; CHECK: define i64 @test4b()
97; CHECK: %c = call i64 @test4c(i64 5)
98; CHECK-NEXT: ret i64 5
99
100
101define internal i64 @test4c(i64 %a) {
102 ret i64 %a
103}
104; CHECK: define internal i64 @test4c
105; CHECK: ret i64 undef
Chris Lattner7d7f7fb2009-10-20 21:04:26 +0000106
107
108
109;;======================== test5
110
111; PR4313
112define internal {i64,i64} @test5a() {
113 %a = insertvalue {i64,i64} undef, i64 4, 1
114 %b = insertvalue {i64,i64} %a, i64 5, 0
115 ret {i64,i64} %b
116}
117
118define i64 @test5b() {
119 %a = invoke {i64,i64} @test5a()
120 to label %A unwind label %B
121A:
122 %c = call i64 @test5c({i64,i64} %a)
123 ret i64 %c
124B:
125 ret i64 0
126}
127
128; CHECK: define i64 @test5b()
129; CHECK: A:
130; CHECK-NEXT: %c = call i64 @test5c(%0 %a)
131; CHECK-NEXT: ret i64 %c
132
133define internal i64 @test5c({i64,i64} %a) {
134 %b = extractvalue {i64,i64} %a, 0
135 ret i64 %b
136}
137
Chris Lattner29cc27a2009-11-02 07:33:59 +0000138
139;;======================== test6
140
141define i64 @test6a() {
142 ret i64 0
143}
144
145define i64 @test6b() {
146 %a = call i64 @test6a()
147 ret i64 %a
148}
149; CHECK: define i64 @test6b
150; CHECK: ret i64 0
151
Chris Lattnerc264c9e2009-11-02 18:27:22 +0000152;;======================== test7
153
154
155%T = type {i32,i32}
156
157define internal {i32, i32} @test7a(i32 %A) {
158 %X = add i32 1, %A
159 %mrv0 = insertvalue %T undef, i32 %X, 0
160 %mrv1 = insertvalue %T %mrv0, i32 %A, 1
161 ret %T %mrv1
162; CHECK: @test7a
163; CHECK-NEXT: %mrv0 = insertvalue %T undef, i32 18, 0
164; CHECK-NEXT: %mrv1 = insertvalue %T %mrv0, i32 17, 1
165}
166
167define i32 @test7b() {
168 %X = call {i32, i32} @test7a(i32 17)
169 %Y = extractvalue {i32, i32} %X, 0
170 %Z = add i32 %Y, %Y
171 ret i32 %Z
172; CHECK: define i32 @test7b
173; CHECK-NEXT: call %T @test7a(i32 17)
174; CHECK-NEXT: ret i32 36
175}
176
Chris Lattner59dc8e62009-11-03 19:24:51 +0000177;;======================== test8
178
179
180define internal {} @test8a(i32 %A, i32* %P) {
181 store i32 %A, i32* %P
182 ret {} {}
183; CHECK: @test8a
184; CHECK-NEXT: store i32 5,
185; CHECK-NEXT: ret
186}
187
188define void @test8b(i32* %P) {
189 %X = call {} @test8a(i32 5, i32* %P)
190 ret void
191; CHECK: define void @test8b
Chris Lattner339daf42009-11-03 21:25:50 +0000192; CHECK-NEXT: call { } @test8a
Chris Lattner59dc8e62009-11-03 19:24:51 +0000193; CHECK-NEXT: ret void
194}
195
Chris Lattner339daf42009-11-03 21:25:50 +0000196;;======================== test9
Chris Lattner59dc8e62009-11-03 19:24:51 +0000197
Chris Lattner339daf42009-11-03 21:25:50 +0000198@test9g = internal global { } zeroinitializer
199
200define void @test9() {
201entry:
202 %local_foo = alloca { }
Chris Lattner4cc50962009-11-03 21:26:26 +0000203 load { }* @test9g
Chris Lattner339daf42009-11-03 21:25:50 +0000204 store { } %0, { }* %local_foo
205 ret void
206}
Chris Lattnerc264c9e2009-11-02 18:27:22 +0000207