• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1; RUN: opt < %s -ipsccp -S | FileCheck %s
2; RUN: opt < %s -enable-debugify -ipsccp -debugify-quiet -disable-output
3
4;;======================== test1
5
6define internal i32 @test1a(i32 %A) {
7	%X = add i32 1, 2
8	ret i32 %A
9}
10; CHECK-LABEL: define internal i32 @test1a(
11; CHECK: ret i32 undef
12
13define i32 @test1b() {
14	%X = call i32 @test1a( i32 17 )
15	ret i32 %X
16
17; CHECK-LABEL: define i32 @test1b(
18; CHECK: ret i32 17
19}
20
21
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-LABEL: 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-LABEL: 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, i32* @G
55	store i32 %X, i32* @G
56	ret void
57}
58; CHECK-LABEL: define void @test3a(
59; CHECK-NEXT: ret void
60
61
62define i32 @test3b() {
63	%V = load i32, 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-LABEL: define i32 @test3b(
74; CHECK-NOT: store
75; CHECK: ret i32 0
76
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
86; CHECK-LABEL: define internal { i64, i64 } @test4a(
87; CHECK-NEXT:   ret { i64, i64 } undef
88; CHECK-NEXT: }
89
90define i64 @test4b() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
91  %a = invoke {i64,i64} @test4a()
92          to label %A unwind label %B
93A:
94  %b = extractvalue {i64,i64} %a, 0
95  %c = call i64 @test4c(i64 %b)
96  ret i64 %c
97B:
98  %val = landingpad { i8*, i32 }
99           catch i8* null
100  ret i64 0
101}
102; CHECK: define i64 @test4b()
103; CHECK:   %c = call i64 @test4c(i64 5)
104; CHECK-NEXT:  ret i64 5
105
106
107define internal i64 @test4c(i64 %a) {
108  ret i64 %a
109}
110; CHECK-LABEL: define internal i64 @test4c(
111; CHECK: ret i64 undef
112
113
114
115;;======================== test5
116
117; PR4313
118define internal {i64,i64} @test5a() {
119  %a = insertvalue {i64,i64} undef, i64 4, 1
120  %b = insertvalue {i64,i64} %a, i64 5, 0
121  ret {i64,i64} %b
122}
123
124define i64 @test5b() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
125  %a = invoke {i64,i64} @test5a()
126          to label %A unwind label %B
127A:
128  %c = call i64 @test5c({i64,i64} %a)
129  ret i64 %c
130B:
131  %val = landingpad { i8*, i32 }
132           catch i8* null
133  ret i64 0
134}
135
136; CHECK: define i64 @test5b()
137; CHECK:     A:
138; CHECK-NEXT:  %c = call i64 @test5c({ i64, i64 } { i64 5, i64 4 })
139; CHECK-NEXT:  ret i64 5
140
141define internal i64 @test5c({i64,i64} %a) {
142  %b = extractvalue {i64,i64} %a, 0
143  ret i64 %b
144}
145
146
147;;======================== test6
148
149define i64 @test6a() {
150  ret i64 0
151}
152
153define i64 @test6b() {
154  %a = call i64 @test6a()
155  ret i64 %a
156}
157; CHECK-LABEL: define i64 @test6b(
158; CHECK: ret i64 0
159
160;;======================== test7
161
162
163%T = type {i32,i32}
164
165define internal %T @test7a(i32 %A) {
166  %X = add i32 1, %A
167  %mrv0 = insertvalue %T undef, i32 %X, 0
168  %mrv1 = insertvalue %T %mrv0, i32 %A, 1
169  ret %T %mrv1
170; CHECK-LABEL: @test7a(
171; CHECK-NEXT: ret %T undef
172}
173
174define i32 @test7b() {
175	%X = call %T @test7a(i32 17)
176        %Y = extractvalue %T %X, 0
177	%Z = add i32 %Y, %Y
178	ret i32 %Z
179; CHECK-LABEL: define i32 @test7b(
180; CHECK-NEXT: call %T @test7a(i32 17)
181; CHECK-NEXT: ret i32 36
182}
183
184;;======================== test8
185
186
187define internal {} @test8a(i32 %A, i32* %P) {
188  store i32 %A, i32* %P
189  ret {} {}
190; CHECK-LABEL: @test8a(
191; CHECK-NEXT: store i32 5,
192; CHECK-NEXT: ret
193}
194
195define void @test8b(i32* %P) {
196    %X = call {} @test8a(i32 5, i32* %P)
197    ret void
198; CHECK-LABEL: define void @test8b(
199; CHECK-NEXT: call {} @test8a
200; CHECK-NEXT: ret void
201}
202
203;;======================== test9
204
205@test9g = internal global {  } zeroinitializer
206
207define void @test9() {
208entry:
209        %local_foo = alloca {  }
210        load {  }, {  }* @test9g
211        store {  } %0, {  }* %local_foo
212        ret void
213}
214
215; CHECK-LABEL: define void @test9(
216; CHECK-NEXT: entry:
217; CHECK-NEXT: %local_foo = alloca {}
218; CHECK-NEXT:  store {} zeroinitializer, {}* %local_foo
219; CHECK-NEXT: ret void
220
221declare i32 @__gxx_personality_v0(...)
222
223;;======================== test10
224
225define i32 @test10a() nounwind {
226entry:
227  %call = call i32 @test10b(i32 undef)
228  ret i32 %call
229; CHECK-LABEL: define i32 @test10a(
230; CHECK: ret i32 0
231}
232
233define internal i32 @test10b(i32 %x) nounwind {
234entry:
235  %r = and i32 %x, 1
236  ret i32 %r
237; CHECK-LABEL: define internal i32 @test10b(
238; CHECK: ret i32 undef
239}
240
241;;======================== test11
242
243define i64 @test11a() {
244  %xor = xor i64 undef, undef
245  ret i64 %xor
246; CHECK-LABEL: define i64 @test11a
247; CHECK: ret i64 0
248}
249
250define i64 @test11b() {
251  %call1 = call i64 @test11a()
252  %call2 = call i64 @llvm.ctpop.i64(i64 %call1)
253  ret i64 %call2
254; 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
258}
259
260declare i64 @llvm.ctpop.i64(i64)
261