xref: /aosp_15_r20/external/llvm/test/Transforms/SCCP/ipsccp-basic.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -ipsccp -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker;;======================== test1
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workerdefine internal i32 @test1a(i32 %A) {
6*9880d681SAndroid Build Coastguard Worker	%X = add i32 1, 2
7*9880d681SAndroid Build Coastguard Worker	ret i32 %A
8*9880d681SAndroid Build Coastguard Worker}
9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define internal i32 @test1a(
10*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 undef
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine i32 @test1b() {
13*9880d681SAndroid Build Coastguard Worker	%X = call i32 @test1a( i32 17 )
14*9880d681SAndroid Build Coastguard Worker	ret i32 %X
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @test1b(
17*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 17
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker;;======================== test2
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerdefine internal i32 @test2a(i32 %A) {
25*9880d681SAndroid Build Coastguard Worker	%C = icmp eq i32 %A, 0
26*9880d681SAndroid Build Coastguard Worker	br i1 %C, label %T, label %F
27*9880d681SAndroid Build Coastguard WorkerT:
28*9880d681SAndroid Build Coastguard Worker	%B = call i32 @test2a( i32 0 )
29*9880d681SAndroid Build Coastguard Worker	ret i32 0
30*9880d681SAndroid Build Coastguard WorkerF:
31*9880d681SAndroid Build Coastguard Worker	%C.upgrd.1 = call i32 @test2a(i32 1)
32*9880d681SAndroid Build Coastguard Worker	ret i32 %C.upgrd.1
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define internal i32 @test2a(
35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br label %T
36*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 undef
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerdefine i32 @test2b() {
40*9880d681SAndroid Build Coastguard Worker	%X = call i32 @test2a(i32 0)
41*9880d681SAndroid Build Coastguard Worker	ret i32 %X
42*9880d681SAndroid Build Coastguard Worker}
43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @test2b(
44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %X = call i32 @test2a(i32 0)
45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker;;======================== test3
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard Worker@G = internal global i32 undef
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Workerdefine void @test3a() {
53*9880d681SAndroid Build Coastguard Worker	%X = load i32, i32* @G
54*9880d681SAndroid Build Coastguard Worker	store i32 %X, i32* @G
55*9880d681SAndroid Build Coastguard Worker	ret void
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test3a(
58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdefine i32 @test3b() {
62*9880d681SAndroid Build Coastguard Worker	%V = load i32, i32* @G
63*9880d681SAndroid Build Coastguard Worker	%C = icmp eq i32 %V, 17
64*9880d681SAndroid Build Coastguard Worker	br i1 %C, label %T, label %F
65*9880d681SAndroid Build Coastguard WorkerT:
66*9880d681SAndroid Build Coastguard Worker	store i32 17, i32* @G
67*9880d681SAndroid Build Coastguard Worker	ret i32 %V
68*9880d681SAndroid Build Coastguard WorkerF:
69*9880d681SAndroid Build Coastguard Worker	store i32 123, i32* @G
70*9880d681SAndroid Build Coastguard Worker	ret i32 0
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @test3b(
73*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: store
74*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker;;======================== test4
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerdefine internal {i64,i64} @test4a() {
80*9880d681SAndroid Build Coastguard Worker  %a = insertvalue {i64,i64} undef, i64 4, 1
81*9880d681SAndroid Build Coastguard Worker  %b = insertvalue {i64,i64} %a, i64 5, 0
82*9880d681SAndroid Build Coastguard Worker  ret {i64,i64} %b
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define internal { i64, i64 } @test4a(
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   ret { i64, i64 } { i64 5, i64 4 }
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: }
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine i64 @test4b() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
90*9880d681SAndroid Build Coastguard Worker  %a = invoke {i64,i64} @test4a()
91*9880d681SAndroid Build Coastguard Worker          to label %A unwind label %B
92*9880d681SAndroid Build Coastguard WorkerA:
93*9880d681SAndroid Build Coastguard Worker  %b = extractvalue {i64,i64} %a, 0
94*9880d681SAndroid Build Coastguard Worker  %c = call i64 @test4c(i64 %b)
95*9880d681SAndroid Build Coastguard Worker  ret i64 %c
96*9880d681SAndroid Build Coastguard WorkerB:
97*9880d681SAndroid Build Coastguard Worker  %val = landingpad { i8*, i32 }
98*9880d681SAndroid Build Coastguard Worker           catch i8* null
99*9880d681SAndroid Build Coastguard Worker  ret i64 0
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker; CHECK: define i64 @test4b()
102*9880d681SAndroid Build Coastguard Worker; CHECK:   %c = call i64 @test4c(i64 5)
103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i64 5
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerdefine internal i64 @test4c(i64 %a) {
107*9880d681SAndroid Build Coastguard Worker  ret i64 %a
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define internal i64 @test4c(
110*9880d681SAndroid Build Coastguard Worker; CHECK: ret i64 undef
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker;;======================== test5
115*9880d681SAndroid Build Coastguard Worker
116*9880d681SAndroid Build Coastguard Worker; PR4313
117*9880d681SAndroid Build Coastguard Workerdefine internal {i64,i64} @test5a() {
118*9880d681SAndroid Build Coastguard Worker  %a = insertvalue {i64,i64} undef, i64 4, 1
119*9880d681SAndroid Build Coastguard Worker  %b = insertvalue {i64,i64} %a, i64 5, 0
120*9880d681SAndroid Build Coastguard Worker  ret {i64,i64} %b
121*9880d681SAndroid Build Coastguard Worker}
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workerdefine i64 @test5b() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
124*9880d681SAndroid Build Coastguard Worker  %a = invoke {i64,i64} @test5a()
125*9880d681SAndroid Build Coastguard Worker          to label %A unwind label %B
126*9880d681SAndroid Build Coastguard WorkerA:
127*9880d681SAndroid Build Coastguard Worker  %c = call i64 @test5c({i64,i64} %a)
128*9880d681SAndroid Build Coastguard Worker  ret i64 %c
129*9880d681SAndroid Build Coastguard WorkerB:
130*9880d681SAndroid Build Coastguard Worker  %val = landingpad { i8*, i32 }
131*9880d681SAndroid Build Coastguard Worker           catch i8* null
132*9880d681SAndroid Build Coastguard Worker  ret i64 0
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker; CHECK: define i64 @test5b()
136*9880d681SAndroid Build Coastguard Worker; CHECK:     A:
137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %c = call i64 @test5c({ i64, i64 } { i64 5, i64 4 })
138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i64 5
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerdefine internal i64 @test5c({i64,i64} %a) {
141*9880d681SAndroid Build Coastguard Worker  %b = extractvalue {i64,i64} %a, 0
142*9880d681SAndroid Build Coastguard Worker  ret i64 %b
143*9880d681SAndroid Build Coastguard Worker}
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker;;======================== test6
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workerdefine i64 @test6a() {
149*9880d681SAndroid Build Coastguard Worker  ret i64 0
150*9880d681SAndroid Build Coastguard Worker}
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerdefine i64 @test6b() {
153*9880d681SAndroid Build Coastguard Worker  %a = call i64 @test6a()
154*9880d681SAndroid Build Coastguard Worker  ret i64 %a
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i64 @test6b(
157*9880d681SAndroid Build Coastguard Worker; CHECK: ret i64 0
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker;;======================== test7
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Worker%T = type {i32,i32}
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Workerdefine internal %T @test7a(i32 %A) {
165*9880d681SAndroid Build Coastguard Worker  %X = add i32 1, %A
166*9880d681SAndroid Build Coastguard Worker  %mrv0 = insertvalue %T undef, i32 %X, 0
167*9880d681SAndroid Build Coastguard Worker  %mrv1 = insertvalue %T %mrv0, i32 %A, 1
168*9880d681SAndroid Build Coastguard Worker  ret %T %mrv1
169*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7a(
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret %T { i32 18, i32 17 }
171*9880d681SAndroid Build Coastguard Worker}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdefine i32 @test7b() {
174*9880d681SAndroid Build Coastguard Worker	%X = call %T @test7a(i32 17)
175*9880d681SAndroid Build Coastguard Worker        %Y = extractvalue %T %X, 0
176*9880d681SAndroid Build Coastguard Worker	%Z = add i32 %Y, %Y
177*9880d681SAndroid Build Coastguard Worker	ret i32 %Z
178*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @test7b(
179*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call %T @test7a(i32 17)
180*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 36
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker;;======================== test8
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Workerdefine internal {} @test8a(i32 %A, i32* %P) {
187*9880d681SAndroid Build Coastguard Worker  store i32 %A, i32* %P
188*9880d681SAndroid Build Coastguard Worker  ret {} {}
189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8a(
190*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: store i32 5,
191*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Workerdefine void @test8b(i32* %P) {
195*9880d681SAndroid Build Coastguard Worker    %X = call {} @test8a(i32 5, i32* %P)
196*9880d681SAndroid Build Coastguard Worker    ret void
197*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test8b(
198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call {} @test8a
199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void
200*9880d681SAndroid Build Coastguard Worker}
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker;;======================== test9
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker@test9g = internal global {  } zeroinitializer
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Workerdefine void @test9() {
207*9880d681SAndroid Build Coastguard Workerentry:
208*9880d681SAndroid Build Coastguard Worker        %local_foo = alloca {  }
209*9880d681SAndroid Build Coastguard Worker        load {  }, {  }* @test9g
210*9880d681SAndroid Build Coastguard Worker        store {  } %0, {  }* %local_foo
211*9880d681SAndroid Build Coastguard Worker        ret void
212*9880d681SAndroid Build Coastguard Worker}
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test9(
215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry:
216*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %local_foo = alloca {}
217*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  store {} zeroinitializer, {}* %local_foo
218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Workerdeclare i32 @__gxx_personality_v0(...)
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Worker;;======================== test10
223*9880d681SAndroid Build Coastguard Worker
224*9880d681SAndroid Build Coastguard Workerdefine i32 @test10a() nounwind {
225*9880d681SAndroid Build Coastguard Workerentry:
226*9880d681SAndroid Build Coastguard Worker  %call = call i32 @test10b(i32 undef)
227*9880d681SAndroid Build Coastguard Worker  ret i32 %call
228*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i32 @test10a(
229*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0
230*9880d681SAndroid Build Coastguard Worker}
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Workerdefine internal i32 @test10b(i32 %x) nounwind {
233*9880d681SAndroid Build Coastguard Workerentry:
234*9880d681SAndroid Build Coastguard Worker  %r = and i32 %x, 1
235*9880d681SAndroid Build Coastguard Worker  ret i32 %r
236*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define internal i32 @test10b(
237*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 undef
238*9880d681SAndroid Build Coastguard Worker}
239*9880d681SAndroid Build Coastguard Worker
240*9880d681SAndroid Build Coastguard Worker;;======================== test11
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Workerdefine i64 @test11a() {
243*9880d681SAndroid Build Coastguard Worker  %xor = xor i64 undef, undef
244*9880d681SAndroid Build Coastguard Worker  ret i64 %xor
245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define i64 @test11a
246*9880d681SAndroid Build Coastguard Worker; CHECK: ret i64 0
247*9880d681SAndroid Build Coastguard Worker}
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Workerdefine void @test11b() {
250*9880d681SAndroid Build Coastguard Worker  %call1 = call i64 @test11a()
251*9880d681SAndroid Build Coastguard Worker  %call2 = call i64 @llvm.ctpop.i64(i64 %call1)
252*9880d681SAndroid Build Coastguard Worker  ret void
253*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @test11b
254*9880d681SAndroid Build Coastguard Worker; CHECK: %[[call1:.*]] = call i64 @test11a()
255*9880d681SAndroid Build Coastguard Worker; CHECK: %[[call2:.*]] = call i64 @llvm.ctpop.i64(i64 0)
256*9880d681SAndroid Build Coastguard Worker}
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.ctpop.i64(i64)
259