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