xref: /aosp_15_r20/external/llvm/test/Transforms/GVN/condprop.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -basicaa -gvn -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker@a = external global i32		; <i32*> [#uses=7]
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
6*9880d681SAndroid Build Coastguard Workerdefine i32 @test1() nounwind {
7*9880d681SAndroid Build Coastguard Workerentry:
8*9880d681SAndroid Build Coastguard Worker	%0 = load i32, i32* @a, align 4
9*9880d681SAndroid Build Coastguard Worker	%1 = icmp eq i32 %0, 4
10*9880d681SAndroid Build Coastguard Worker	br i1 %1, label %bb, label %bb1
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerbb:		; preds = %entry
13*9880d681SAndroid Build Coastguard Worker	br label %bb8
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Workerbb1:		; preds = %entry
16*9880d681SAndroid Build Coastguard Worker	%2 = load i32, i32* @a, align 4
17*9880d681SAndroid Build Coastguard Worker	%3 = icmp eq i32 %2, 5
18*9880d681SAndroid Build Coastguard Worker	br i1 %3, label %bb2, label %bb3
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerbb2:		; preds = %bb1
21*9880d681SAndroid Build Coastguard Worker	br label %bb8
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerbb3:		; preds = %bb1
24*9880d681SAndroid Build Coastguard Worker	%4 = load i32, i32* @a, align 4
25*9880d681SAndroid Build Coastguard Worker	%5 = icmp eq i32 %4, 4
26*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 false, label %bb4, label %bb5
27*9880d681SAndroid Build Coastguard Worker	br i1 %5, label %bb4, label %bb5
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerbb4:		; preds = %bb3
30*9880d681SAndroid Build Coastguard Worker	%6 = load i32, i32* @a, align 4
31*9880d681SAndroid Build Coastguard Worker	%7 = add i32 %6, 5
32*9880d681SAndroid Build Coastguard Worker	br label %bb8
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerbb5:		; preds = %bb3
35*9880d681SAndroid Build Coastguard Worker	%8 = load i32, i32* @a, align 4
36*9880d681SAndroid Build Coastguard Worker	%9 = icmp eq i32 %8, 5
37*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 false, label %bb6, label %bb7
38*9880d681SAndroid Build Coastguard Worker	br i1 %9, label %bb6, label %bb7
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerbb6:		; preds = %bb5
41*9880d681SAndroid Build Coastguard Worker	%10 = load i32, i32* @a, align 4
42*9880d681SAndroid Build Coastguard Worker	%11 = add i32 %10, 4
43*9880d681SAndroid Build Coastguard Worker	br label %bb8
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerbb7:		; preds = %bb5
46*9880d681SAndroid Build Coastguard Worker	%12 = load i32, i32* @a, align 4
47*9880d681SAndroid Build Coastguard Worker	br label %bb8
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerbb8:		; preds = %bb7, %bb6, %bb4, %bb2, %bb
50*9880d681SAndroid Build Coastguard Worker	%.0 = phi i32 [ %12, %bb7 ], [ %11, %bb6 ], [ %7, %bb4 ], [ 4, %bb2 ], [ 5, %bb ]
51*9880d681SAndroid Build Coastguard Worker	br label %return
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerreturn:		; preds = %bb8
54*9880d681SAndroid Build Coastguard Worker	ret i32 %.0
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdeclare void @foo(i1)
58*9880d681SAndroid Build Coastguard Workerdeclare void @bar(i32)
59*9880d681SAndroid Build Coastguard Worker
60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
61*9880d681SAndroid Build Coastguard Workerdefine void @test3(i32 %x, i32 %y) {
62*9880d681SAndroid Build Coastguard Worker  %xz = icmp eq i32 %x, 0
63*9880d681SAndroid Build Coastguard Worker  %yz = icmp eq i32 %y, 0
64*9880d681SAndroid Build Coastguard Worker  %z = and i1 %xz, %yz
65*9880d681SAndroid Build Coastguard Worker  br i1 %z, label %both_zero, label %nope
66*9880d681SAndroid Build Coastguard Workerboth_zero:
67*9880d681SAndroid Build Coastguard Worker  call void @foo(i1 %xz)
68*9880d681SAndroid Build Coastguard Worker; CHECK: call void @foo(i1 true)
69*9880d681SAndroid Build Coastguard Worker  call void @foo(i1 %yz)
70*9880d681SAndroid Build Coastguard Worker; CHECK: call void @foo(i1 true)
71*9880d681SAndroid Build Coastguard Worker  call void @bar(i32 %x)
72*9880d681SAndroid Build Coastguard Worker; CHECK: call void @bar(i32 0)
73*9880d681SAndroid Build Coastguard Worker  call void @bar(i32 %y)
74*9880d681SAndroid Build Coastguard Worker; CHECK: call void @bar(i32 0)
75*9880d681SAndroid Build Coastguard Worker  ret void
76*9880d681SAndroid Build Coastguard Workernope:
77*9880d681SAndroid Build Coastguard Worker  call void @foo(i1 %z)
78*9880d681SAndroid Build Coastguard Worker; CHECK: call void @foo(i1 false)
79*9880d681SAndroid Build Coastguard Worker  ret void
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4(
83*9880d681SAndroid Build Coastguard Workerdefine void @test4(i1 %b, i32 %x) {
84*9880d681SAndroid Build Coastguard Worker  br i1 %b, label %sw, label %case3
85*9880d681SAndroid Build Coastguard Workersw:
86*9880d681SAndroid Build Coastguard Worker  switch i32 %x, label %default [
87*9880d681SAndroid Build Coastguard Worker    i32 0, label %case0
88*9880d681SAndroid Build Coastguard Worker    i32 1, label %case1
89*9880d681SAndroid Build Coastguard Worker    i32 2, label %case0
90*9880d681SAndroid Build Coastguard Worker    i32 3, label %case3
91*9880d681SAndroid Build Coastguard Worker    i32 4, label %default
92*9880d681SAndroid Build Coastguard Worker  ]
93*9880d681SAndroid Build Coastguard Workerdefault:
94*9880d681SAndroid Build Coastguard Worker; CHECK: default:
95*9880d681SAndroid Build Coastguard Worker  call void @bar(i32 %x)
96*9880d681SAndroid Build Coastguard Worker; CHECK: call void @bar(i32 %x)
97*9880d681SAndroid Build Coastguard Worker  ret void
98*9880d681SAndroid Build Coastguard Workercase0:
99*9880d681SAndroid Build Coastguard Worker; CHECK: case0:
100*9880d681SAndroid Build Coastguard Worker  call void @bar(i32 %x)
101*9880d681SAndroid Build Coastguard Worker; CHECK: call void @bar(i32 %x)
102*9880d681SAndroid Build Coastguard Worker  ret void
103*9880d681SAndroid Build Coastguard Workercase1:
104*9880d681SAndroid Build Coastguard Worker; CHECK: case1:
105*9880d681SAndroid Build Coastguard Worker  call void @bar(i32 %x)
106*9880d681SAndroid Build Coastguard Worker; CHECK: call void @bar(i32 1)
107*9880d681SAndroid Build Coastguard Worker  ret void
108*9880d681SAndroid Build Coastguard Workercase3:
109*9880d681SAndroid Build Coastguard Worker; CHECK: case3:
110*9880d681SAndroid Build Coastguard Worker  call void @bar(i32 %x)
111*9880d681SAndroid Build Coastguard Worker; CHECK: call void @bar(i32 %x)
112*9880d681SAndroid Build Coastguard Worker  ret void
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5(
116*9880d681SAndroid Build Coastguard Workerdefine i1 @test5(i32 %x, i32 %y) {
117*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %x, %y
118*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %same, label %different
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workersame:
121*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp ne i32 %x, %y
122*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
123*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp2
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Workerdifferent:
126*9880d681SAndroid Build Coastguard Worker  %cmp3 = icmp eq i32 %x, %y
127*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
128*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp3
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6(
132*9880d681SAndroid Build Coastguard Workerdefine i1 @test6(i32 %x, i32 %y) {
133*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp ne i32 %x, %y
134*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %x, %y
135*9880d681SAndroid Build Coastguard Worker  %cmp3 = icmp eq i32 %x, %y
136*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %same, label %different
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workersame:
139*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
140*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp2
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Workerdifferent:
143*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
144*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp3
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6_fp(
148*9880d681SAndroid Build Coastguard Workerdefine i1 @test6_fp(float %x, float %y) {
149*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp une float %x, %y
150*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp oeq float %x, %y
151*9880d681SAndroid Build Coastguard Worker  %cmp3 = fcmp oeq float  %x, %y
152*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %same, label %different
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Workersame:
155*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
156*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp2
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerdifferent:
159*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
160*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp3
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7(
164*9880d681SAndroid Build Coastguard Workerdefine i1 @test7(i32 %x, i32 %y) {
165*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %x, %y
166*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %same, label %different
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Workersame:
169*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp sle i32 %x, %y
170*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
171*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp2
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdifferent:
174*9880d681SAndroid Build Coastguard Worker  %cmp3 = icmp sgt i32 %x, %y
175*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
176*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp3
177*9880d681SAndroid Build Coastguard Worker}
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7_fp(
180*9880d681SAndroid Build Coastguard Workerdefine i1 @test7_fp(float %x, float %y) {
181*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %x, %y
182*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %same, label %different
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workersame:
185*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp ule float %x, %y
186*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
187*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp2
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Workerdifferent:
190*9880d681SAndroid Build Coastguard Worker  %cmp3 = fcmp ogt float %x, %y
191*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
192*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp3
193*9880d681SAndroid Build Coastguard Worker}
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8(
196*9880d681SAndroid Build Coastguard Workerdefine i1 @test8(i32 %x, i32 %y) {
197*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp sle i32 %x, %y
198*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %x, %y
199*9880d681SAndroid Build Coastguard Worker  %cmp3 = icmp sgt i32 %x, %y
200*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %same, label %different
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Workersame:
203*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
204*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp2
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Workerdifferent:
207*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
208*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp3
209*9880d681SAndroid Build Coastguard Worker}
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8_fp(
212*9880d681SAndroid Build Coastguard Workerdefine i1 @test8_fp(float %x, float %y) {
213*9880d681SAndroid Build Coastguard Worker  %cmp2 = fcmp ule float %x, %y
214*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp ogt float %x, %y
215*9880d681SAndroid Build Coastguard Worker  %cmp3 = fcmp ogt float %x, %y
216*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %same, label %different
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Workersame:
219*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
220*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp2
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Workerdifferent:
223*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 false
224*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp3
225*9880d681SAndroid Build Coastguard Worker}
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker; PR1768
228*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9(
229*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i32 %i, i32 %j) {
230*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %i, %j
231*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %cond_true, label %ret
232*9880d681SAndroid Build Coastguard Worker
233*9880d681SAndroid Build Coastguard Workercond_true:
234*9880d681SAndroid Build Coastguard Worker  %diff = sub i32 %i, %j
235*9880d681SAndroid Build Coastguard Worker  ret i32 %diff
236*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Workerret:
239*9880d681SAndroid Build Coastguard Worker  ret i32 5
240*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 5
241*9880d681SAndroid Build Coastguard Worker}
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Worker; PR1768
244*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10(
245*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i32 %j, i32 %i) {
246*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %i, %j
247*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %cond_true, label %ret
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Workercond_true:
250*9880d681SAndroid Build Coastguard Worker  %diff = sub i32 %i, %j
251*9880d681SAndroid Build Coastguard Worker  ret i32 %diff
252*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Workerret:
255*9880d681SAndroid Build Coastguard Worker  ret i32 5
256*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 5
257*9880d681SAndroid Build Coastguard Worker}
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workerdeclare i32 @yogibar()
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11(
262*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32 %x) {
263*9880d681SAndroid Build Coastguard Worker  %v0 = call i32 @yogibar()
264*9880d681SAndroid Build Coastguard Worker  %v1 = call i32 @yogibar()
265*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %v0, %v1
266*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %cond_true, label %next
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Workercond_true:
269*9880d681SAndroid Build Coastguard Worker  ret i32 %v1
270*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %v0
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Workernext:
273*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp eq i32 %x, %v0
274*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %cond_true2, label %next2
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Workercond_true2:
277*9880d681SAndroid Build Coastguard Worker  ret i32 %v0
278*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x
279*9880d681SAndroid Build Coastguard Worker
280*9880d681SAndroid Build Coastguard Workernext2:
281*9880d681SAndroid Build Coastguard Worker  ret i32 0
282*9880d681SAndroid Build Coastguard Worker}
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12(
285*9880d681SAndroid Build Coastguard Workerdefine i32 @test12(i32 %x) {
286*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %x, 0
287*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %cond_true, label %cond_false
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Workercond_true:
290*9880d681SAndroid Build Coastguard Worker  br label %ret
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Workercond_false:
293*9880d681SAndroid Build Coastguard Worker  br label %ret
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Workerret:
296*9880d681SAndroid Build Coastguard Worker  %res = phi i32 [ %x, %cond_true ], [ %x, %cond_false ]
297*9880d681SAndroid Build Coastguard Worker; CHECK: %res = phi i32 [ 0, %cond_true ], [ %x, %cond_false ]
298*9880d681SAndroid Build Coastguard Worker  ret i32 %res
299*9880d681SAndroid Build Coastguard Worker}
300