blob: e3699209a35bf6f2bd88d135d6acd9e174fa4fb9 [file] [log] [blame]
Chris Lattner82ad3522009-10-20 20:39:43 +00001; RUN: opt < %s -ipsccp -S | FileCheck %s
Dan Gohmanf17a25c2007-07-18 16:29:46 +00002
Chris Lattner82ad3522009-10-20 20:39:43 +00003;;======================== test1
4
5define internal i32 @test1a(i32 %A) {
6 %X = add i32 1, 2
Tanya Lattnerba93e2d2008-03-19 04:14:49 +00007 ret i32 %A
Dan Gohmanf17a25c2007-07-18 16:29:46 +00008}
Chris Lattner82ad3522009-10-20 20:39:43 +00009; CHECK: define internal i32 @test1a
10; CHECK: ret i32 undef
Dan Gohmanf17a25c2007-07-18 16:29:46 +000011
Chris Lattner82ad3522009-10-20 20:39:43 +000012define i32 @test1b() {
13 %X = call i32 @test1a( i32 17 )
Tanya Lattnerba93e2d2008-03-19 04:14:49 +000014 ret i32 %X
Chris Lattner82ad3522009-10-20 20:39:43 +000015
16; CHECK: define i32 @test1b
17; CHECK: ret i32 17
Dan Gohmanf17a25c2007-07-18 16:29:46 +000018}
Tanya Lattnerba93e2d2008-03-19 04:14:49 +000019
Chris Lattner82ad3522009-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}
34; CHECK: define internal i32 @test2a
35; 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}
43; CHECK: define i32 @test2b
44; 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}
57; CHECK: define void @test3a
58; 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}
72; CHECK: define i32 @test3b
73; CHECK-NOT: store
74; CHECK: ret i32 0
Chris Lattnerf3eec132009-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:
93 ret i64 0
94}
95; CHECK: define i64 @test4b()
96; CHECK: %c = call i64 @test4c(i64 5)
97; CHECK-NEXT: ret i64 5
98
99
100define internal i64 @test4c(i64 %a) {
101 ret i64 %a
102}
103; CHECK: define internal i64 @test4c
104; CHECK: ret i64 undef
Chris Lattner7d7f7fb2009-10-20 21:04:26 +0000105
106
107
108;;======================== test5
109
110; PR4313
111define internal {i64,i64} @test5a() {
112 %a = insertvalue {i64,i64} undef, i64 4, 1
113 %b = insertvalue {i64,i64} %a, i64 5, 0
114 ret {i64,i64} %b
115}
116
117define i64 @test5b() {
118 %a = invoke {i64,i64} @test5a()
119 to label %A unwind label %B
120A:
121 %c = call i64 @test5c({i64,i64} %a)
122 ret i64 %c
123B:
124 ret i64 0
125}
126
127; CHECK: define i64 @test5b()
128; CHECK: A:
129; CHECK-NEXT: %c = call i64 @test5c(%0 %a)
Chris Lattnerdca9e5c2009-11-03 23:40:48 +0000130; CHECK-NEXT: ret i64 5
Chris Lattner7d7f7fb2009-10-20 21:04:26 +0000131
132define internal i64 @test5c({i64,i64} %a) {
133 %b = extractvalue {i64,i64} %a, 0
134 ret i64 %b
135}
136
Chris Lattner29cc27a2009-11-02 07:33:59 +0000137
138;;======================== test6
139
140define i64 @test6a() {
141 ret i64 0
142}
143
144define i64 @test6b() {
145 %a = call i64 @test6a()
146 ret i64 %a
147}
148; CHECK: define i64 @test6b
149; CHECK: ret i64 0
150
Chris Lattnerc264c9e2009-11-02 18:27:22 +0000151;;======================== test7
152
153
154%T = type {i32,i32}
155
156define internal {i32, i32} @test7a(i32 %A) {
157 %X = add i32 1, %A
158 %mrv0 = insertvalue %T undef, i32 %X, 0
159 %mrv1 = insertvalue %T %mrv0, i32 %A, 1
160 ret %T %mrv1
161; CHECK: @test7a
162; CHECK-NEXT: %mrv0 = insertvalue %T undef, i32 18, 0
163; CHECK-NEXT: %mrv1 = insertvalue %T %mrv0, i32 17, 1
164}
165
166define i32 @test7b() {
167 %X = call {i32, i32} @test7a(i32 17)
168 %Y = extractvalue {i32, i32} %X, 0
169 %Z = add i32 %Y, %Y
170 ret i32 %Z
171; CHECK: define i32 @test7b
172; CHECK-NEXT: call %T @test7a(i32 17)
173; CHECK-NEXT: ret i32 36
174}
175
Chris Lattner59dc8e62009-11-03 19:24:51 +0000176;;======================== test8
177
178
179define internal {} @test8a(i32 %A, i32* %P) {
180 store i32 %A, i32* %P
181 ret {} {}
182; CHECK: @test8a
183; CHECK-NEXT: store i32 5,
184; CHECK-NEXT: ret
185}
186
187define void @test8b(i32* %P) {
188 %X = call {} @test8a(i32 5, i32* %P)
189 ret void
190; CHECK: define void @test8b
Chris Lattner339daf42009-11-03 21:25:50 +0000191; CHECK-NEXT: call { } @test8a
Chris Lattner59dc8e62009-11-03 19:24:51 +0000192; CHECK-NEXT: ret void
193}
194
Chris Lattner339daf42009-11-03 21:25:50 +0000195;;======================== test9
Chris Lattner59dc8e62009-11-03 19:24:51 +0000196
Chris Lattner339daf42009-11-03 21:25:50 +0000197@test9g = internal global { } zeroinitializer
198
199define void @test9() {
200entry:
201 %local_foo = alloca { }
Chris Lattner4cc50962009-11-03 21:26:26 +0000202 load { }* @test9g
Chris Lattner339daf42009-11-03 21:25:50 +0000203 store { } %0, { }* %local_foo
204 ret void
205}
Chris Lattnerc264c9e2009-11-02 18:27:22 +0000206