xref: /aosp_15_r20/external/llvm/test/Transforms/JumpThreading/basic.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -jump-threading -S < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdeclare i32 @f1()
4*9880d681SAndroid Build Coastguard Workerdeclare i32 @f2()
5*9880d681SAndroid Build Coastguard Workerdeclare void @f3()
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i1 %cond) {
8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker	br i1 %cond, label %T1, label %F1
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard WorkerT1:
13*9880d681SAndroid Build Coastguard Worker	%v1 = call i32 @f1()
14*9880d681SAndroid Build Coastguard Worker	br label %Merge
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard WorkerF1:
17*9880d681SAndroid Build Coastguard Worker	%v2 = call i32 @f2()
18*9880d681SAndroid Build Coastguard Worker	br label %Merge
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard WorkerMerge:
21*9880d681SAndroid Build Coastguard Worker	%A = phi i1 [true, %T1], [false, %F1]
22*9880d681SAndroid Build Coastguard Worker	%B = phi i32 [%v1, %T1], [%v2, %F1]
23*9880d681SAndroid Build Coastguard Worker	br i1 %A, label %T2, label %F2
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard WorkerT2:
26*9880d681SAndroid Build Coastguard Worker; CHECK: T2:
27*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %v1
28*9880d681SAndroid Build Coastguard Worker	call void @f3()
29*9880d681SAndroid Build Coastguard Worker	ret i32 %B
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard WorkerF2:
32*9880d681SAndroid Build Coastguard Worker; CHECK: F2:
33*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %v2
34*9880d681SAndroid Build Coastguard Worker	ret i32 %B
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker;; cond is known false on Entry -> F1 edge!
39*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i1 %cond) {
40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
41*9880d681SAndroid Build Coastguard WorkerEntry:
42*9880d681SAndroid Build Coastguard Worker	br i1 %cond, label %T1, label %F1
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard WorkerT1:
45*9880d681SAndroid Build Coastguard Worker; CHECK: %v1 = call i32 @f1()
46*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 47
47*9880d681SAndroid Build Coastguard Worker	%v1 = call i32 @f1()
48*9880d681SAndroid Build Coastguard Worker	br label %Merge
49*9880d681SAndroid Build Coastguard Worker
50*9880d681SAndroid Build Coastguard WorkerF1:
51*9880d681SAndroid Build Coastguard Worker	br i1 %cond, label %Merge, label %F2
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard WorkerMerge:
54*9880d681SAndroid Build Coastguard Worker	%B = phi i32 [47, %T1], [192, %F1]
55*9880d681SAndroid Build Coastguard Worker	ret i32 %B
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard WorkerF2:
58*9880d681SAndroid Build Coastguard Worker	call void @f3()
59*9880d681SAndroid Build Coastguard Worker	ret i32 12
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker; Undef handling.
64*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i1 %cond) {
65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: T1:
67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 42
68*9880d681SAndroid Build Coastguard Worker	br i1 undef, label %T1, label %F1
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard WorkerT1:
71*9880d681SAndroid Build Coastguard Worker	ret i32 42
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard WorkerF1:
74*9880d681SAndroid Build Coastguard Worker	ret i32 17
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i1 %cond, i1 %cond2) {
78*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4(
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker	br i1 %cond, label %T1, label %F1
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard WorkerT1:
83*9880d681SAndroid Build Coastguard Worker; CHECK:   %v1 = call i32 @f1()
84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   br label %T
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker	%v1 = call i32 @f1()
87*9880d681SAndroid Build Coastguard Worker	br label %Merge
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard WorkerF1:
90*9880d681SAndroid Build Coastguard Worker	%v2 = call i32 @f2()
91*9880d681SAndroid Build Coastguard Worker; CHECK:   %v2 = call i32 @f2()
92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   br i1 %cond2,
93*9880d681SAndroid Build Coastguard Worker	br label %Merge
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard WorkerMerge:
96*9880d681SAndroid Build Coastguard Worker	%A = phi i1 [undef, %T1], [%cond2, %F1]
97*9880d681SAndroid Build Coastguard Worker	%B = phi i32 [%v1, %T1], [%v2, %F1]
98*9880d681SAndroid Build Coastguard Worker	br i1 %A, label %T2, label %F2
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard WorkerT2:
101*9880d681SAndroid Build Coastguard Worker	call void @f3()
102*9880d681SAndroid Build Coastguard Worker	ret i32 %B
103*9880d681SAndroid Build Coastguard Worker
104*9880d681SAndroid Build Coastguard WorkerF2:
105*9880d681SAndroid Build Coastguard Worker	ret i32 %B
106*9880d681SAndroid Build Coastguard Worker}
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker;; This tests that the branch in 'merge' can be cloned up into T1.
110*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i1 %cond, i1 %cond2) {
111*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5(
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker	br i1 %cond, label %T1, label %F1
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard WorkerT1:
116*9880d681SAndroid Build Coastguard Worker; CHECK: T1:
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   %v1 = call i32 @f1()
118*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   %cond3 = icmp eq i32 %v1, 412
119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   br i1 %cond3, label %T2, label %F2
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker	%v1 = call i32 @f1()
122*9880d681SAndroid Build Coastguard Worker        %cond3 = icmp eq i32 %v1, 412
123*9880d681SAndroid Build Coastguard Worker	br label %Merge
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard WorkerF1:
126*9880d681SAndroid Build Coastguard Worker	%v2 = call i32 @f2()
127*9880d681SAndroid Build Coastguard Worker	br label %Merge
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard WorkerMerge:
130*9880d681SAndroid Build Coastguard Worker	%A = phi i1 [%cond3, %T1], [%cond2, %F1]
131*9880d681SAndroid Build Coastguard Worker	%B = phi i32 [%v1, %T1], [%v2, %F1]
132*9880d681SAndroid Build Coastguard Worker	br i1 %A, label %T2, label %F2
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard WorkerT2:
135*9880d681SAndroid Build Coastguard Worker	call void @f3()
136*9880d681SAndroid Build Coastguard Worker	ret i32 %B
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard WorkerF2:
139*9880d681SAndroid Build Coastguard Worker	ret i32 %B
140*9880d681SAndroid Build Coastguard Worker}
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker;; Lexically duplicated conditionals should be threaded.
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32 %A) {
147*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6(
148*9880d681SAndroid Build Coastguard Worker	%tmp455 = icmp eq i32 %A, 42
149*9880d681SAndroid Build Coastguard Worker	br i1 %tmp455, label %BB1, label %BB2
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @f2()
152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 3
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @f1()
155*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br
156*9880d681SAndroid Build Coastguard Worker; CHECK: call void @f3()
157*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br
158*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 4
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard WorkerBB2:
161*9880d681SAndroid Build Coastguard Worker	call i32 @f1()
162*9880d681SAndroid Build Coastguard Worker	br label %BB1
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard WorkerBB1:
166*9880d681SAndroid Build Coastguard Worker	%tmp459 = icmp eq i32 %A, 42
167*9880d681SAndroid Build Coastguard Worker	br i1 %tmp459, label %BB3, label %BB4
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard WorkerBB3:
170*9880d681SAndroid Build Coastguard Worker	call i32 @f2()
171*9880d681SAndroid Build Coastguard Worker        ret i32 3
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard WorkerBB4:
174*9880d681SAndroid Build Coastguard Worker	call void @f3()
175*9880d681SAndroid Build Coastguard Worker	ret i32 4
176*9880d681SAndroid Build Coastguard Worker}
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Worker
179*9880d681SAndroid Build Coastguard Worker;; This tests that the branch in 'merge' can be cloned up into T1.
180*9880d681SAndroid Build Coastguard Worker;; rdar://7367025
181*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i1 %cond, i1 %cond2) {
182*9880d681SAndroid Build Coastguard WorkerEntry:
183*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7(
184*9880d681SAndroid Build Coastguard Worker	%v1 = call i32 @f1()
185*9880d681SAndroid Build Coastguard Worker	br i1 %cond, label %Merge, label %F1
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard WorkerF1:
188*9880d681SAndroid Build Coastguard Worker	%v2 = call i32 @f2()
189*9880d681SAndroid Build Coastguard Worker	br label %Merge
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard WorkerMerge:
192*9880d681SAndroid Build Coastguard Worker	%B = phi i32 [%v1, %Entry], [%v2, %F1]
193*9880d681SAndroid Build Coastguard Worker        %M = icmp ne i32 %B, %v1
194*9880d681SAndroid Build Coastguard Worker        %N = icmp eq i32 %B, 47
195*9880d681SAndroid Build Coastguard Worker        %O = and i1 %M, %N
196*9880d681SAndroid Build Coastguard Worker	br i1 %O, label %T2, label %F2
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Worker; CHECK: Merge:
199*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi
200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   %v2 = call i32 @f2()
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard WorkerT2:
203*9880d681SAndroid Build Coastguard Worker	call void @f3()
204*9880d681SAndroid Build Coastguard Worker	ret i32 %B
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard WorkerF2:
207*9880d681SAndroid Build Coastguard Worker	ret i32 %B
208*9880d681SAndroid Build Coastguard Worker; CHECK: F2:
209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i32
210*9880d681SAndroid Build Coastguard Worker}
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerdeclare i1 @test8a()
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Workerdefine i32 @test8b(i1 %cond, i1 %cond2) {
216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8b(
217*9880d681SAndroid Build Coastguard WorkerT0:
218*9880d681SAndroid Build Coastguard Worker        %A = call i1 @test8a()
219*9880d681SAndroid Build Coastguard Worker	br i1 %A, label %T1, label %F1
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Worker; CHECK: T0:
222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call
223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %A, label %T1, label %Y
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard WorkerT1:
226*9880d681SAndroid Build Coastguard Worker        %B = call i1 @test8a()
227*9880d681SAndroid Build Coastguard Worker	br i1 %B, label %T2, label %F1
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Worker; CHECK: T1:
230*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call
231*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %B, label %T2, label %Y
232*9880d681SAndroid Build Coastguard WorkerT2:
233*9880d681SAndroid Build Coastguard Worker        %C = call i1 @test8a()
234*9880d681SAndroid Build Coastguard Worker	br i1 %cond, label %T3, label %F1
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Worker; CHECK: T2:
237*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call
238*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %cond, label %T3, label %Y
239*9880d681SAndroid Build Coastguard WorkerT3:
240*9880d681SAndroid Build Coastguard Worker        ret i32 0
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard WorkerF1:
243*9880d681SAndroid Build Coastguard Worker        %D = phi i32 [0, %T0], [0, %T1], [1, %T2]
244*9880d681SAndroid Build Coastguard Worker        %E = icmp eq i32 %D, 1
245*9880d681SAndroid Build Coastguard Worker        %F = and i1 %E, %cond
246*9880d681SAndroid Build Coastguard Worker	br i1 %F, label %X, label %Y
247*9880d681SAndroid Build Coastguard WorkerX:
248*9880d681SAndroid Build Coastguard Worker        call i1 @test8a()
249*9880d681SAndroid Build Coastguard Worker        ret i32 1
250*9880d681SAndroid Build Coastguard WorkerY:
251*9880d681SAndroid Build Coastguard Worker        ret i32 2
252*9880d681SAndroid Build Coastguard Worker}
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Worker;;; Verify that we can handle constraint propagation through "xor x, 1".
256*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i1 %cond, i1 %cond2) {
257*9880d681SAndroid Build Coastguard WorkerEntry:
258*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9(
259*9880d681SAndroid Build Coastguard Worker	%v1 = call i32 @f1()
260*9880d681SAndroid Build Coastguard Worker	br i1 %cond, label %Merge, label %F1
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Worker; CHECK: Entry:
263*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %v1 = call i32 @f1()
264*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  br i1 %cond, label %F2, label %Merge
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard WorkerF1:
267*9880d681SAndroid Build Coastguard Worker	%v2 = call i32 @f2()
268*9880d681SAndroid Build Coastguard Worker	br label %Merge
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard WorkerMerge:
271*9880d681SAndroid Build Coastguard Worker	%B = phi i32 [%v1, %Entry], [%v2, %F1]
272*9880d681SAndroid Build Coastguard Worker        %M = icmp eq i32 %B, %v1
273*9880d681SAndroid Build Coastguard Worker        %M1 = xor i1 %M, 1
274*9880d681SAndroid Build Coastguard Worker        %N = icmp eq i32 %B, 47
275*9880d681SAndroid Build Coastguard Worker        %O = and i1 %M1, %N
276*9880d681SAndroid Build Coastguard Worker	br i1 %O, label %T2, label %F2
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Worker; CHECK: Merge:
279*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi
280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   %v2 = call i32 @f2()
281*9880d681SAndroid Build Coastguard Worker
282*9880d681SAndroid Build Coastguard WorkerT2:
283*9880d681SAndroid Build Coastguard Worker	%Q = zext i1 %M to i32
284*9880d681SAndroid Build Coastguard Worker	ret i32 %Q
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard WorkerF2:
287*9880d681SAndroid Build Coastguard Worker	ret i32 %B
288*9880d681SAndroid Build Coastguard Worker; CHECK: F2:
289*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i32
290*9880d681SAndroid Build Coastguard Worker}
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Worker; CHECK: @test10
295*9880d681SAndroid Build Coastguard Workerdeclare i32 @test10f1()
296*9880d681SAndroid Build Coastguard Workerdeclare i32 @test10f2()
297*9880d681SAndroid Build Coastguard Workerdeclare void @test10f3()
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Worker;; Non-local condition threading.
300*9880d681SAndroid Build Coastguard Workerdefine i32 @test10g(i1 %cond) {
301*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10g(
302*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   br i1 %cond, label %T2, label %F2
303*9880d681SAndroid Build Coastguard Worker        br i1 %cond, label %T1, label %F1
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard WorkerT1:
306*9880d681SAndroid Build Coastguard Worker        %v1 = call i32 @test10f1()
307*9880d681SAndroid Build Coastguard Worker        br label %Merge
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Worker; CHECK: %v1 = call i32 @test10f1()
310*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @f3()
311*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %v1
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard WorkerF1:
314*9880d681SAndroid Build Coastguard Worker        %v2 = call i32 @test10f2()
315*9880d681SAndroid Build Coastguard Worker        br label %Merge
316*9880d681SAndroid Build Coastguard Worker
317*9880d681SAndroid Build Coastguard WorkerMerge:
318*9880d681SAndroid Build Coastguard Worker        %B = phi i32 [%v1, %T1], [%v2, %F1]
319*9880d681SAndroid Build Coastguard Worker        br i1 %cond, label %T2, label %F2
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard WorkerT2:
322*9880d681SAndroid Build Coastguard Worker        call void @f3()
323*9880d681SAndroid Build Coastguard Worker        ret i32 %B
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard WorkerF2:
326*9880d681SAndroid Build Coastguard Worker        ret i32 %B
327*9880d681SAndroid Build Coastguard Worker}
328*9880d681SAndroid Build Coastguard Worker
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Worker; Impossible conditional constraints should get threaded.  BB3 is dead here.
331*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32 %A) {
332*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11(
333*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp
334*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %tmp455, label %BB4, label %BB2
335*9880d681SAndroid Build Coastguard Worker	%tmp455 = icmp eq i32 %A, 42
336*9880d681SAndroid Build Coastguard Worker	br i1 %tmp455, label %BB1, label %BB2
337*9880d681SAndroid Build Coastguard Worker
338*9880d681SAndroid Build Coastguard WorkerBB2:
339*9880d681SAndroid Build Coastguard Worker; CHECK: call i32 @f1()
340*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %C
341*9880d681SAndroid Build Coastguard Worker	%C = call i32 @f1()
342*9880d681SAndroid Build Coastguard Worker	ret i32 %C
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Worker
345*9880d681SAndroid Build Coastguard WorkerBB1:
346*9880d681SAndroid Build Coastguard Worker	%tmp459 = icmp eq i32 %A, 43
347*9880d681SAndroid Build Coastguard Worker	br i1 %tmp459, label %BB3, label %BB4
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard WorkerBB3:
350*9880d681SAndroid Build Coastguard Worker	call i32 @f2()
351*9880d681SAndroid Build Coastguard Worker        ret i32 3
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard WorkerBB4:
354*9880d681SAndroid Build Coastguard Worker	call void @f3()
355*9880d681SAndroid Build Coastguard Worker	ret i32 4
356*9880d681SAndroid Build Coastguard Worker}
357*9880d681SAndroid Build Coastguard Worker
358*9880d681SAndroid Build Coastguard Worker;; Correlated value through boolean expression.  GCC PR18046.
359*9880d681SAndroid Build Coastguard Workerdefine void @test12(i32 %A) {
360*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12(
361*9880d681SAndroid Build Coastguard Workerentry:
362*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i32 %A, 0
363*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %bb, label %bb1
364*9880d681SAndroid Build Coastguard Worker; Should branch to the return block instead of through BB1.
365*9880d681SAndroid Build Coastguard Worker; CHECK: entry:
366*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %cond = icmp eq i32 %A, 0
367*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %cond, label %bb1, label %return
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Workerbb:
370*9880d681SAndroid Build Coastguard Worker  %B = call i32 @test10f2()
371*9880d681SAndroid Build Coastguard Worker  br label %bb1
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Workerbb1:
374*9880d681SAndroid Build Coastguard Worker  %C = phi i32 [ %A, %entry ], [ %B, %bb ]
375*9880d681SAndroid Build Coastguard Worker  %cond4 = icmp eq i32 %C, 0
376*9880d681SAndroid Build Coastguard Worker  br i1 %cond4, label %bb2, label %return
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Worker; CHECK: bb1:
379*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %B = call i32 @test10f2()
380*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %cond4 = icmp eq i32 %B, 0
381*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: br i1 %cond4, label %bb2, label %return
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Workerbb2:
384*9880d681SAndroid Build Coastguard Worker  %D = call i32 @test10f2()
385*9880d681SAndroid Build Coastguard Worker  ret void
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Workerreturn:
388*9880d681SAndroid Build Coastguard Worker  ret void
389*9880d681SAndroid Build Coastguard Worker}
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Worker;; Duplicate condition to avoid xor of cond.
393*9880d681SAndroid Build Coastguard Worker;; rdar://7391699
394*9880d681SAndroid Build Coastguard Workerdefine i32 @test13(i1 %cond, i1 %cond2) {
395*9880d681SAndroid Build Coastguard WorkerEntry:
396*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13(
397*9880d681SAndroid Build Coastguard Worker	%v1 = call i32 @f1()
398*9880d681SAndroid Build Coastguard Worker	br i1 %cond, label %Merge, label %F1
399*9880d681SAndroid Build Coastguard Worker
400*9880d681SAndroid Build Coastguard WorkerF1:
401*9880d681SAndroid Build Coastguard Worker	br label %Merge
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard WorkerMerge:
404*9880d681SAndroid Build Coastguard Worker	%B = phi i1 [true, %Entry], [%cond2, %F1]
405*9880d681SAndroid Build Coastguard Worker        %C = phi i32 [192, %Entry], [%v1, %F1]
406*9880d681SAndroid Build Coastguard Worker        %M = icmp eq i32 %C, 192
407*9880d681SAndroid Build Coastguard Worker        %N = xor i1 %B, %M
408*9880d681SAndroid Build Coastguard Worker	br i1 %N, label %T2, label %F2
409*9880d681SAndroid Build Coastguard Worker
410*9880d681SAndroid Build Coastguard WorkerT2:
411*9880d681SAndroid Build Coastguard Worker	ret i32 123
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard WorkerF2:
414*9880d681SAndroid Build Coastguard Worker	ret i32 %v1
415*9880d681SAndroid Build Coastguard Worker
416*9880d681SAndroid Build Coastguard Worker; CHECK:   br i1 %cond, label %F2, label %Merge
417*9880d681SAndroid Build Coastguard Worker
418*9880d681SAndroid Build Coastguard Worker; CHECK:      Merge:
419*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   %M = icmp eq i32 %v1, 192
420*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   %N = xor i1 %cond2, %M
421*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   br i1 %N, label %T2, label %F2
422*9880d681SAndroid Build Coastguard Worker}
423*9880d681SAndroid Build Coastguard Worker
424*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14(
425*9880d681SAndroid Build Coastguard Workerdefine i32 @test14(i32 %in) {
426*9880d681SAndroid Build Coastguard Workerentry:
427*9880d681SAndroid Build Coastguard Worker	%A = icmp eq i32 %in, 0
428*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %A, label %right_ret, label %merge
429*9880d681SAndroid Build Coastguard Worker  br i1 %A, label %left, label %right
430*9880d681SAndroid Build Coastguard Worker
431*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: left:
432*9880d681SAndroid Build Coastguard Workerleft:
433*9880d681SAndroid Build Coastguard Worker	br label %merge
434*9880d681SAndroid Build Coastguard Worker
435*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: right:
436*9880d681SAndroid Build Coastguard Workerright:
437*9880d681SAndroid Build Coastguard Worker  %B = call i32 @f1()
438*9880d681SAndroid Build Coastguard Worker	br label %merge
439*9880d681SAndroid Build Coastguard Worker
440*9880d681SAndroid Build Coastguard Workermerge:
441*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: %C = phi i32 [%in, %left], [%B, %right]
442*9880d681SAndroid Build Coastguard Worker	%C = phi i32 [%in, %left], [%B, %right]
443*9880d681SAndroid Build Coastguard Worker	%D = add i32 %C, 1
444*9880d681SAndroid Build Coastguard Worker	%E = icmp eq i32 %D, 2
445*9880d681SAndroid Build Coastguard Worker	br i1 %E, label %left_ret, label %right_ret
446*9880d681SAndroid Build Coastguard Worker
447*9880d681SAndroid Build Coastguard Worker; CHECK: left_ret:
448*9880d681SAndroid Build Coastguard Workerleft_ret:
449*9880d681SAndroid Build Coastguard Worker	ret i32 0
450*9880d681SAndroid Build Coastguard Worker
451*9880d681SAndroid Build Coastguard Workerright_ret:
452*9880d681SAndroid Build Coastguard Worker	ret i32 1
453*9880d681SAndroid Build Coastguard Worker}
454*9880d681SAndroid Build Coastguard Worker
455*9880d681SAndroid Build Coastguard Worker; PR5652
456*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15(
457*9880d681SAndroid Build Coastguard Workerdefine i32 @test15(i32 %len) {
458*9880d681SAndroid Build Coastguard Workerentry:
459*9880d681SAndroid Build Coastguard Worker; CHECK: icmp ult i32 %len, 13
460*9880d681SAndroid Build Coastguard Worker  %tmp = icmp ult i32 %len, 13
461*9880d681SAndroid Build Coastguard Worker  br i1 %tmp, label %check, label %exit0
462*9880d681SAndroid Build Coastguard Worker
463*9880d681SAndroid Build Coastguard Workerexit0:
464*9880d681SAndroid Build Coastguard Worker  ret i32 0
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Workercheck:
467*9880d681SAndroid Build Coastguard Worker  %tmp9 = icmp ult i32 %len, 21
468*9880d681SAndroid Build Coastguard Worker  br i1 %tmp9, label %exit1, label %exit2
469*9880d681SAndroid Build Coastguard Worker
470*9880d681SAndroid Build Coastguard Workerexit2:
471*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: ret i32 2
472*9880d681SAndroid Build Coastguard Worker  ret i32 2
473*9880d681SAndroid Build Coastguard Worker
474*9880d681SAndroid Build Coastguard Workerexit1:
475*9880d681SAndroid Build Coastguard Worker  ret i32 1
476*9880d681SAndroid Build Coastguard Worker; CHECK: }
477*9880d681SAndroid Build Coastguard Worker}
478*9880d681SAndroid Build Coastguard Worker
479*9880d681SAndroid Build Coastguard Worker;;; Verify that we can handle constraint propagation through cast.
480*9880d681SAndroid Build Coastguard Workerdefine i32 @test16(i1 %cond) {
481*9880d681SAndroid Build Coastguard WorkerEntry:
482*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16(
483*9880d681SAndroid Build Coastguard Worker	br i1 %cond, label %Merge, label %F1
484*9880d681SAndroid Build Coastguard Worker
485*9880d681SAndroid Build Coastguard Worker; CHECK: Entry:
486*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  br i1 %cond, label %F2, label %Merge
487*9880d681SAndroid Build Coastguard Worker
488*9880d681SAndroid Build Coastguard WorkerF1:
489*9880d681SAndroid Build Coastguard Worker	%v1 = call i32 @f1()
490*9880d681SAndroid Build Coastguard Worker	br label %Merge
491*9880d681SAndroid Build Coastguard Worker
492*9880d681SAndroid Build Coastguard WorkerMerge:
493*9880d681SAndroid Build Coastguard Worker	%B = phi i32 [0, %Entry], [%v1, %F1]
494*9880d681SAndroid Build Coastguard Worker	%M = icmp eq i32 %B, 0
495*9880d681SAndroid Build Coastguard Worker	%M1 = zext i1 %M to i32
496*9880d681SAndroid Build Coastguard Worker	%N = icmp eq i32 %M1, 0
497*9880d681SAndroid Build Coastguard Worker	br i1 %N, label %T2, label %F2
498*9880d681SAndroid Build Coastguard Worker
499*9880d681SAndroid Build Coastguard Worker; CHECK: Merge:
500*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: phi
501*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   %v1 = call i32 @f1()
502*9880d681SAndroid Build Coastguard Worker
503*9880d681SAndroid Build Coastguard WorkerT2:
504*9880d681SAndroid Build Coastguard Worker	%Q = call i32 @f2()
505*9880d681SAndroid Build Coastguard Worker	ret i32 %Q
506*9880d681SAndroid Build Coastguard Worker
507*9880d681SAndroid Build Coastguard WorkerF2:
508*9880d681SAndroid Build Coastguard Worker	ret i32 %B
509*9880d681SAndroid Build Coastguard Worker; CHECK: F2:
510*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: phi i32
511*9880d681SAndroid Build Coastguard Worker}
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Worker; In this test we check that block duplication is inhibited by the presence
514*9880d681SAndroid Build Coastguard Worker; of a function with the 'noduplicate' attribute.
515*9880d681SAndroid Build Coastguard Worker
516*9880d681SAndroid Build Coastguard Workerdeclare void @g()
517*9880d681SAndroid Build Coastguard Workerdeclare void @j()
518*9880d681SAndroid Build Coastguard Workerdeclare void @k()
519*9880d681SAndroid Build Coastguard Worker
520*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @h(i32 %p) {
521*9880d681SAndroid Build Coastguard Workerdefine void @h(i32 %p) {
522*9880d681SAndroid Build Coastguard Worker  %x = icmp ult i32 %p, 5
523*9880d681SAndroid Build Coastguard Worker  br i1 %x, label %l1, label %l2
524*9880d681SAndroid Build Coastguard Worker
525*9880d681SAndroid Build Coastguard Workerl1:
526*9880d681SAndroid Build Coastguard Worker  call void @j()
527*9880d681SAndroid Build Coastguard Worker  br label %l3
528*9880d681SAndroid Build Coastguard Worker
529*9880d681SAndroid Build Coastguard Workerl2:
530*9880d681SAndroid Build Coastguard Worker  call void @k()
531*9880d681SAndroid Build Coastguard Worker  br label %l3
532*9880d681SAndroid Build Coastguard Worker
533*9880d681SAndroid Build Coastguard Workerl3:
534*9880d681SAndroid Build Coastguard Worker; CHECK: call void @g() [[NOD:#[0-9]+]]
535*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @g() [[NOD]]
536*9880d681SAndroid Build Coastguard Worker  call void @g() noduplicate
537*9880d681SAndroid Build Coastguard Worker  %y = icmp ult i32 %p, 5
538*9880d681SAndroid Build Coastguard Worker  br i1 %y, label %l4, label %l5
539*9880d681SAndroid Build Coastguard Worker
540*9880d681SAndroid Build Coastguard Workerl4:
541*9880d681SAndroid Build Coastguard Worker  call void @j()
542*9880d681SAndroid Build Coastguard Worker  ret void
543*9880d681SAndroid Build Coastguard Worker
544*9880d681SAndroid Build Coastguard Workerl5:
545*9880d681SAndroid Build Coastguard Worker  call void @k()
546*9880d681SAndroid Build Coastguard Worker  ret void
547*9880d681SAndroid Build Coastguard Worker; CHECK: }
548*9880d681SAndroid Build Coastguard Worker}
549*9880d681SAndroid Build Coastguard Worker
550*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: define void @h_con(i32 %p) {
551*9880d681SAndroid Build Coastguard Workerdefine void @h_con(i32 %p) {
552*9880d681SAndroid Build Coastguard Worker  %x = icmp ult i32 %p, 5
553*9880d681SAndroid Build Coastguard Worker  br i1 %x, label %l1, label %l2
554*9880d681SAndroid Build Coastguard Worker
555*9880d681SAndroid Build Coastguard Workerl1:
556*9880d681SAndroid Build Coastguard Worker  call void @j()
557*9880d681SAndroid Build Coastguard Worker  br label %l3
558*9880d681SAndroid Build Coastguard Worker
559*9880d681SAndroid Build Coastguard Workerl2:
560*9880d681SAndroid Build Coastguard Worker  call void @k()
561*9880d681SAndroid Build Coastguard Worker  br label %l3
562*9880d681SAndroid Build Coastguard Worker
563*9880d681SAndroid Build Coastguard Workerl3:
564*9880d681SAndroid Build Coastguard Worker; CHECK: call void @g() [[CON:#[0-9]+]]
565*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: call void @g() [[CON]]
566*9880d681SAndroid Build Coastguard Worker  call void @g() convergent
567*9880d681SAndroid Build Coastguard Worker  %y = icmp ult i32 %p, 5
568*9880d681SAndroid Build Coastguard Worker  br i1 %y, label %l4, label %l5
569*9880d681SAndroid Build Coastguard Worker
570*9880d681SAndroid Build Coastguard Workerl4:
571*9880d681SAndroid Build Coastguard Worker  call void @j()
572*9880d681SAndroid Build Coastguard Worker  ret void
573*9880d681SAndroid Build Coastguard Worker
574*9880d681SAndroid Build Coastguard Workerl5:
575*9880d681SAndroid Build Coastguard Worker  call void @k()
576*9880d681SAndroid Build Coastguard Worker  ret void
577*9880d681SAndroid Build Coastguard Worker; CHECK: }
578*9880d681SAndroid Build Coastguard Worker}
579*9880d681SAndroid Build Coastguard Worker
580*9880d681SAndroid Build Coastguard Worker
581*9880d681SAndroid Build Coastguard Worker; CHECK: attributes [[NOD]] = { noduplicate }
582*9880d681SAndroid Build Coastguard Worker; CHECK: attributes [[CON]] = { convergent }
583