xref: /aosp_15_r20/external/llvm/test/Transforms/SimplifyCFG/preserve-branchweights.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: opt -simplifycfg -S -o - < %s | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdeclare void @helper(i32)
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine void @test1(i1 %a, i1 %b) {
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
8*9880d681SAndroid Build Coastguard Workerentry:
9*9880d681SAndroid Build Coastguard Worker  br i1 %a, label %Y, label %X, !prof !0
10*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %or.cond, label %Z, label %Y, !prof !0
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard WorkerX:
13*9880d681SAndroid Build Coastguard Worker  %c = or i1 %b, false
14*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %Z, label %Y, !prof !1
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard WorkerY:
17*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 0)
18*9880d681SAndroid Build Coastguard Worker  ret void
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard WorkerZ:
21*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 1)
22*9880d681SAndroid Build Coastguard Worker  ret void
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker; Make sure the metadata name string is "branch_weights" before propagating it.
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Workerdefine void @fake_weights(i1 %a, i1 %b) {
28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @fake_weights(
29*9880d681SAndroid Build Coastguard Workerentry:
30*9880d681SAndroid Build Coastguard Worker  br i1 %a, label %Y, label %X, !prof !12
31*9880d681SAndroid Build Coastguard Worker; CHECK:        %or.cond = and i1 %a.not, %c
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   br i1 %or.cond, label %Z, label %Y, !prof !1
33*9880d681SAndroid Build Coastguard Worker; CHECK:      Y:
34*9880d681SAndroid Build Coastguard WorkerX:
35*9880d681SAndroid Build Coastguard Worker  %c = or i1 %b, false
36*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %Z, label %Y, !prof !1
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard WorkerY:
39*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 0)
40*9880d681SAndroid Build Coastguard Worker  ret void
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard WorkerZ:
43*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 1)
44*9880d681SAndroid Build Coastguard Worker  ret void
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine void @test2(i1 %a, i1 %b) {
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
49*9880d681SAndroid Build Coastguard Workerentry:
50*9880d681SAndroid Build Coastguard Worker  br i1 %a, label %X, label %Y, !prof !1
51*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %or.cond, label %Z, label %Y, !prof !2
52*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: !prof
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard WorkerX:
55*9880d681SAndroid Build Coastguard Worker  %c = or i1 %b, false
56*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %Z, label %Y, !prof !2
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard WorkerY:
59*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 0)
60*9880d681SAndroid Build Coastguard Worker  ret void
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard WorkerZ:
63*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 1)
64*9880d681SAndroid Build Coastguard Worker  ret void
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdefine void @test3(i1 %a, i1 %b) {
68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
69*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %or.cond, label %Z, label %Y, !prof !1
70*9880d681SAndroid Build Coastguard Workerentry:
71*9880d681SAndroid Build Coastguard Worker  br i1 %a, label %X, label %Y, !prof !1
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard WorkerX:
74*9880d681SAndroid Build Coastguard Worker  %c = or i1 %b, false
75*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %Z, label %Y
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard WorkerY:
78*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 0)
79*9880d681SAndroid Build Coastguard Worker  ret void
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard WorkerZ:
82*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 1)
83*9880d681SAndroid Build Coastguard Worker  ret void
84*9880d681SAndroid Build Coastguard Worker}
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerdefine void @test4(i1 %a, i1 %b) {
87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4(
88*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %or.cond, label %Z, label %Y, !prof !1
89*9880d681SAndroid Build Coastguard Workerentry:
90*9880d681SAndroid Build Coastguard Worker  br i1 %a, label %X, label %Y
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard WorkerX:
93*9880d681SAndroid Build Coastguard Worker  %c = or i1 %b, false
94*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %Z, label %Y, !prof !1
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard WorkerY:
97*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 0)
98*9880d681SAndroid Build Coastguard Worker  ret void
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard WorkerZ:
101*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 1)
102*9880d681SAndroid Build Coastguard Worker  ret void
103*9880d681SAndroid Build Coastguard Worker}
104*9880d681SAndroid Build Coastguard Worker
105*9880d681SAndroid Build Coastguard Worker;; test5 - The case where it jumps to the default target will be removed.
106*9880d681SAndroid Build Coastguard Workerdefine void @test5(i32 %M, i32 %N) nounwind uwtable {
107*9880d681SAndroid Build Coastguard Workerentry:
108*9880d681SAndroid Build Coastguard Worker  switch i32 %N, label %sw2 [
109*9880d681SAndroid Build Coastguard Worker    i32 1, label %sw2
110*9880d681SAndroid Build Coastguard Worker    i32 2, label %sw.bb
111*9880d681SAndroid Build Coastguard Worker    i32 3, label %sw.bb1
112*9880d681SAndroid Build Coastguard Worker  ], !prof !3
113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5(
114*9880d681SAndroid Build Coastguard Worker; CHECK: switch i32 %N, label %sw2 [
115*9880d681SAndroid Build Coastguard Worker; CHECK: i32 3, label %sw.bb1
116*9880d681SAndroid Build Coastguard Worker; CHECK: i32 2, label %sw.bb
117*9880d681SAndroid Build Coastguard Worker; CHECK: ], !prof !3
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workersw.bb:
120*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 0)
121*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Workersw.bb1:
124*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 1)
125*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Workersw2:
128*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 2)
129*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workersw.epilog:
132*9880d681SAndroid Build Coastguard Worker  ret void
133*9880d681SAndroid Build Coastguard Worker}
134*9880d681SAndroid Build Coastguard Worker
135*9880d681SAndroid Build Coastguard Worker;; test6 - Some cases of the second switch are pruned during optimization.
136*9880d681SAndroid Build Coastguard Worker;; Then the second switch will be converted to a branch, finally, the first
137*9880d681SAndroid Build Coastguard Worker;; switch and the branch will be merged into a single switch.
138*9880d681SAndroid Build Coastguard Workerdefine void @test6(i32 %M, i32 %N) nounwind uwtable {
139*9880d681SAndroid Build Coastguard Workerentry:
140*9880d681SAndroid Build Coastguard Worker  switch i32 %N, label %sw2 [
141*9880d681SAndroid Build Coastguard Worker    i32 1, label %sw2
142*9880d681SAndroid Build Coastguard Worker    i32 2, label %sw.bb
143*9880d681SAndroid Build Coastguard Worker    i32 3, label %sw.bb1
144*9880d681SAndroid Build Coastguard Worker  ], !prof !4
145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6(
146*9880d681SAndroid Build Coastguard Worker; CHECK: switch i32 %N, label %sw.epilog
147*9880d681SAndroid Build Coastguard Worker; CHECK: i32 3, label %sw.bb1
148*9880d681SAndroid Build Coastguard Worker; CHECK: i32 2, label %sw.bb
149*9880d681SAndroid Build Coastguard Worker; CHECK: i32 4, label %sw.bb5
150*9880d681SAndroid Build Coastguard Worker; CHECK: ], !prof !4
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workersw.bb:
153*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 0)
154*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workersw.bb1:
157*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 1)
158*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
159*9880d681SAndroid Build Coastguard Worker
160*9880d681SAndroid Build Coastguard Workersw2:
161*9880d681SAndroid Build Coastguard Worker;; Here "case 2" is invalidated since the default case of the first switch
162*9880d681SAndroid Build Coastguard Worker;; does not include "case 2".
163*9880d681SAndroid Build Coastguard Worker  switch i32 %N, label %sw.epilog [
164*9880d681SAndroid Build Coastguard Worker    i32 2, label %sw.bb4
165*9880d681SAndroid Build Coastguard Worker    i32 4, label %sw.bb5
166*9880d681SAndroid Build Coastguard Worker  ], !prof !5
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Workersw.bb4:
169*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 2)
170*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workersw.bb5:
173*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 3)
174*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workersw.epilog:
177*9880d681SAndroid Build Coastguard Worker  ret void
178*9880d681SAndroid Build Coastguard Worker}
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker;; This test is based on test1 but swapped the targets of the second branch.
181*9880d681SAndroid Build Coastguard Workerdefine void @test1_swap(i1 %a, i1 %b) {
182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1_swap(
183*9880d681SAndroid Build Coastguard Workerentry:
184*9880d681SAndroid Build Coastguard Worker  br i1 %a, label %Y, label %X, !prof !0
185*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %or.cond, label %Y, label %Z, !prof !5
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard WorkerX:
188*9880d681SAndroid Build Coastguard Worker  %c = or i1 %b, false
189*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %Y, label %Z, !prof !1
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard WorkerY:
192*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 0)
193*9880d681SAndroid Build Coastguard Worker  ret void
194*9880d681SAndroid Build Coastguard Worker
195*9880d681SAndroid Build Coastguard WorkerZ:
196*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 1)
197*9880d681SAndroid Build Coastguard Worker  ret void
198*9880d681SAndroid Build Coastguard Worker}
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Workerdefine void @test7(i1 %a, i1 %b) {
201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7(
202*9880d681SAndroid Build Coastguard Workerentry:
203*9880d681SAndroid Build Coastguard Worker  %c = or i1 %b, false
204*9880d681SAndroid Build Coastguard Worker  br i1 %a, label %Y, label %X, !prof !0
205*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %brmerge, label %Y, label %Z, !prof !6
206*9880d681SAndroid Build Coastguard Worker
207*9880d681SAndroid Build Coastguard WorkerX:
208*9880d681SAndroid Build Coastguard Worker  br i1 %c, label %Y, label %Z, !prof !6
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard WorkerY:
211*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 0)
212*9880d681SAndroid Build Coastguard Worker  ret void
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard WorkerZ:
215*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 1)
216*9880d681SAndroid Build Coastguard Worker  ret void
217*9880d681SAndroid Build Coastguard Worker}
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Worker; Test basic folding to a conditional branch.
220*9880d681SAndroid Build Coastguard Workerdefine void @test8(i64 %x, i64 %y) nounwind {
221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8(
222*9880d681SAndroid Build Coastguard Workerentry:
223*9880d681SAndroid Build Coastguard Worker    %lt = icmp slt i64 %x, %y
224*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %lt, label %a, label %b, !prof !7
225*9880d681SAndroid Build Coastguard Worker    %qux = select i1 %lt, i32 0, i32 2
226*9880d681SAndroid Build Coastguard Worker    switch i32 %qux, label %bees [
227*9880d681SAndroid Build Coastguard Worker        i32 0, label %a
228*9880d681SAndroid Build Coastguard Worker        i32 1, label %b
229*9880d681SAndroid Build Coastguard Worker        i32 2, label %b
230*9880d681SAndroid Build Coastguard Worker    ], !prof !7
231*9880d681SAndroid Build Coastguard Workera:
232*9880d681SAndroid Build Coastguard Worker    call void @helper(i32 0) nounwind
233*9880d681SAndroid Build Coastguard Worker    ret void
234*9880d681SAndroid Build Coastguard Workerb:
235*9880d681SAndroid Build Coastguard Worker    call void @helper(i32 1) nounwind
236*9880d681SAndroid Build Coastguard Worker    ret void
237*9880d681SAndroid Build Coastguard Workerbees:
238*9880d681SAndroid Build Coastguard Worker    call void @helper(i32 2) nounwind
239*9880d681SAndroid Build Coastguard Worker    ret void
240*9880d681SAndroid Build Coastguard Worker}
241*9880d681SAndroid Build Coastguard Worker
242*9880d681SAndroid Build Coastguard Worker; Test edge splitting when the default target has icmp and unconditinal
243*9880d681SAndroid Build Coastguard Worker; branch
244*9880d681SAndroid Build Coastguard Workerdefine i1 @test9(i32 %x, i32 %y) nounwind {
245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9(
246*9880d681SAndroid Build Coastguard Workerentry:
247*9880d681SAndroid Build Coastguard Worker    switch i32 %x, label %bees [
248*9880d681SAndroid Build Coastguard Worker        i32 0, label %a
249*9880d681SAndroid Build Coastguard Worker        i32 1, label %end
250*9880d681SAndroid Build Coastguard Worker        i32 2, label %end
251*9880d681SAndroid Build Coastguard Worker    ], !prof !7
252*9880d681SAndroid Build Coastguard Worker; CHECK: switch i32 %x, label %bees [
253*9880d681SAndroid Build Coastguard Worker; CHECK: i32 0, label %a
254*9880d681SAndroid Build Coastguard Worker; CHECK: i32 1, label %end
255*9880d681SAndroid Build Coastguard Worker; CHECK: i32 2, label %end
256*9880d681SAndroid Build Coastguard Worker; CHECK: i32 92, label %end
257*9880d681SAndroid Build Coastguard Worker; CHECK: ], !prof !8
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Workera:
260*9880d681SAndroid Build Coastguard Worker    call void @helper(i32 0) nounwind
261*9880d681SAndroid Build Coastguard Worker    %reta = icmp slt i32 %x, %y
262*9880d681SAndroid Build Coastguard Worker    ret i1 %reta
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Workerbees:
265*9880d681SAndroid Build Coastguard Worker    %tmp = icmp eq i32 %x, 92
266*9880d681SAndroid Build Coastguard Worker    br label %end
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Workerend:
269*9880d681SAndroid Build Coastguard Worker; CHECK: end:
270*9880d681SAndroid Build Coastguard Worker; CHECK: %ret = phi i1 [ true, %entry ], [ false, %bees ], [ true, %entry ], [ true, %entry ]
271*9880d681SAndroid Build Coastguard Worker    %ret = phi i1 [ true, %entry ], [%tmp, %bees], [true, %entry]
272*9880d681SAndroid Build Coastguard Worker    call void @helper(i32 2) nounwind
273*9880d681SAndroid Build Coastguard Worker    ret i1 %ret
274*9880d681SAndroid Build Coastguard Worker}
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Workerdefine void @test10(i32 %x) nounwind readnone ssp noredzone {
277*9880d681SAndroid Build Coastguard Workerentry:
278*9880d681SAndroid Build Coastguard Worker switch i32 %x, label %lor.rhs [
279*9880d681SAndroid Build Coastguard Worker   i32 2, label %lor.end
280*9880d681SAndroid Build Coastguard Worker   i32 1, label %lor.end
281*9880d681SAndroid Build Coastguard Worker   i32 3, label %lor.end
282*9880d681SAndroid Build Coastguard Worker ], !prof !7
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard Workerlor.rhs:
285*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) nounwind
286*9880d681SAndroid Build Coastguard Worker ret void
287*9880d681SAndroid Build Coastguard Worker
288*9880d681SAndroid Build Coastguard Workerlor.end:
289*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) nounwind
290*9880d681SAndroid Build Coastguard Worker ret void
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10(
293*9880d681SAndroid Build Coastguard Worker; CHECK: %x.off = add i32 %x, -1
294*9880d681SAndroid Build Coastguard Worker; CHECK: %switch = icmp ult i32 %x.off, 3
295*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %switch, label %lor.end, label %lor.rhs, !prof !9
296*9880d681SAndroid Build Coastguard Worker}
297*9880d681SAndroid Build Coastguard Worker
298*9880d681SAndroid Build Coastguard Worker; Remove dead cases from the switch.
299*9880d681SAndroid Build Coastguard Workerdefine void @test11(i32 %x) nounwind {
300*9880d681SAndroid Build Coastguard Worker  %i = shl i32 %x, 1
301*9880d681SAndroid Build Coastguard Worker  switch i32 %i, label %a [
302*9880d681SAndroid Build Coastguard Worker    i32 21, label %b
303*9880d681SAndroid Build Coastguard Worker    i32 24, label %c
304*9880d681SAndroid Build Coastguard Worker  ], !prof !8
305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11(
306*9880d681SAndroid Build Coastguard Worker; CHECK: %cond = icmp eq i32 %i, 24
307*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %cond, label %c, label %a, !prof !10
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Workera:
310*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) nounwind
311*9880d681SAndroid Build Coastguard Worker ret void
312*9880d681SAndroid Build Coastguard Workerb:
313*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) nounwind
314*9880d681SAndroid Build Coastguard Worker ret void
315*9880d681SAndroid Build Coastguard Workerc:
316*9880d681SAndroid Build Coastguard Worker call void @helper(i32 2) nounwind
317*9880d681SAndroid Build Coastguard Worker ret void
318*9880d681SAndroid Build Coastguard Worker}
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Worker;; test12 - Don't crash if the whole switch is removed
321*9880d681SAndroid Build Coastguard Workerdefine void @test12(i32 %M, i32 %N) nounwind uwtable {
322*9880d681SAndroid Build Coastguard Workerentry:
323*9880d681SAndroid Build Coastguard Worker  switch i32 %N, label %sw.bb [
324*9880d681SAndroid Build Coastguard Worker    i32 1, label %sw.bb
325*9880d681SAndroid Build Coastguard Worker  ], !prof !9
326*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12(
327*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry:
328*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @helper
329*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void
330*9880d681SAndroid Build Coastguard Worker
331*9880d681SAndroid Build Coastguard Workersw.bb:
332*9880d681SAndroid Build Coastguard Worker  call void @helper(i32 0)
333*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
334*9880d681SAndroid Build Coastguard Worker
335*9880d681SAndroid Build Coastguard Workersw.epilog:
336*9880d681SAndroid Build Coastguard Worker  ret void
337*9880d681SAndroid Build Coastguard Worker}
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Worker;; If every case is dead, make sure they are all removed. This used to
340*9880d681SAndroid Build Coastguard Worker;; crash trying to merge the metadata.
341*9880d681SAndroid Build Coastguard Workerdefine void @test13(i32 %x) nounwind {
342*9880d681SAndroid Build Coastguard Workerentry:
343*9880d681SAndroid Build Coastguard Worker  %i = shl i32 %x, 1
344*9880d681SAndroid Build Coastguard Worker  switch i32 %i, label %a [
345*9880d681SAndroid Build Coastguard Worker    i32 21, label %b
346*9880d681SAndroid Build Coastguard Worker    i32 25, label %c
347*9880d681SAndroid Build Coastguard Worker  ], !prof !8
348*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13(
349*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: entry:
350*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: call void @helper
351*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret void
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Workera:
354*9880d681SAndroid Build Coastguard Worker call void @helper(i32 0) nounwind
355*9880d681SAndroid Build Coastguard Worker ret void
356*9880d681SAndroid Build Coastguard Workerb:
357*9880d681SAndroid Build Coastguard Worker call void @helper(i32 1) nounwind
358*9880d681SAndroid Build Coastguard Worker ret void
359*9880d681SAndroid Build Coastguard Workerc:
360*9880d681SAndroid Build Coastguard Worker call void @helper(i32 2) nounwind
361*9880d681SAndroid Build Coastguard Worker ret void
362*9880d681SAndroid Build Coastguard Worker}
363*9880d681SAndroid Build Coastguard Worker
364*9880d681SAndroid Build Coastguard Worker;; When folding branches to common destination, the updated branch weights
365*9880d681SAndroid Build Coastguard Worker;; can exceed uint32 by more than factor of 2. We should keep halving the
366*9880d681SAndroid Build Coastguard Worker;; weights until they can fit into uint32.
367*9880d681SAndroid Build Coastguard Worker@max_regno = common global i32 0, align 4
368*9880d681SAndroid Build Coastguard Workerdefine void @test14(i32* %old, i32 %final) {
369*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14
370*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 %or.cond, label %for.exit, label %for.inc, !prof !11
371*9880d681SAndroid Build Coastguard Workerfor.cond:
372*9880d681SAndroid Build Coastguard Worker  br label %for.cond2
373*9880d681SAndroid Build Coastguard Workerfor.cond2:
374*9880d681SAndroid Build Coastguard Worker  %i.1 = phi i32 [ %inc19, %for.inc ], [ 0, %for.cond ]
375*9880d681SAndroid Build Coastguard Worker  %bit.0 = phi i32 [ %shl, %for.inc ], [ 1, %for.cond ]
376*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %bit.0, 0
377*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %for.exit, label %for.body3, !prof !10
378*9880d681SAndroid Build Coastguard Workerfor.body3:
379*9880d681SAndroid Build Coastguard Worker  %v3 = load i32, i32* @max_regno, align 4
380*9880d681SAndroid Build Coastguard Worker  %cmp4 = icmp eq i32 %i.1, %v3
381*9880d681SAndroid Build Coastguard Worker  br i1 %cmp4, label %for.exit, label %for.inc, !prof !11
382*9880d681SAndroid Build Coastguard Workerfor.inc:
383*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 %bit.0, 1
384*9880d681SAndroid Build Coastguard Worker  %inc19 = add nsw i32 %i.1, 1
385*9880d681SAndroid Build Coastguard Worker  br label %for.cond2
386*9880d681SAndroid Build Coastguard Workerfor.exit:
387*9880d681SAndroid Build Coastguard Worker  ret void
388*9880d681SAndroid Build Coastguard Worker}
389*9880d681SAndroid Build Coastguard Worker
390*9880d681SAndroid Build Coastguard Worker; Don't drop the metadata.
391*9880d681SAndroid Build Coastguard Worker
392*9880d681SAndroid Build Coastguard Workerdefine i32 @HoistThenElseCodeToIf(i32 %n) {
393*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @HoistThenElseCodeToIf(
394*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  entry:
395*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TOBOOL:%.*]] = icmp eq i32 %n, 0
396*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DOT:%.*]] = select i1 [[TOBOOL]], i32 1, i32 234, !prof !12
397*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[DOT]]
398*9880d681SAndroid Build Coastguard Worker;
399*9880d681SAndroid Build Coastguard Workerentry:
400*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %n, 0
401*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %if, label %else, !prof !0
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Workerif:
404*9880d681SAndroid Build Coastguard Worker  br label %return
405*9880d681SAndroid Build Coastguard Worker
406*9880d681SAndroid Build Coastguard Workerelse:
407*9880d681SAndroid Build Coastguard Worker  br label %return
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard Workerreturn:
410*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 1, %if ], [ 234, %else ]
411*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
412*9880d681SAndroid Build Coastguard Worker}
413*9880d681SAndroid Build Coastguard Worker
414*9880d681SAndroid Build Coastguard Worker; The selects should have freshly calculated branch weights.
415*9880d681SAndroid Build Coastguard Worker
416*9880d681SAndroid Build Coastguard Workerdefine i32 @SimplifyCondBranchToCondBranch(i1 %cmpa, i1 %cmpb) {
417*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @SimplifyCondBranchToCondBranch(
418*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  block1:
419*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[BRMERGE:%.*]] = or i1 %cmpa, %cmpb
420*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DOTMUX:%.*]] = select i1 %cmpa, i32 0, i32 2, !prof !13
421*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OUTVAL:%.*]] = select i1 [[BRMERGE]], i32 [[DOTMUX]], i32 1, !prof !14
422*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[OUTVAL]]
423*9880d681SAndroid Build Coastguard Worker;
424*9880d681SAndroid Build Coastguard Workerblock1:
425*9880d681SAndroid Build Coastguard Worker  br i1 %cmpa, label %block3, label %block2, !prof !13
426*9880d681SAndroid Build Coastguard Worker
427*9880d681SAndroid Build Coastguard Workerblock2:
428*9880d681SAndroid Build Coastguard Worker  br i1 %cmpb, label %block3, label %exit, !prof !14
429*9880d681SAndroid Build Coastguard Worker
430*9880d681SAndroid Build Coastguard Workerblock3:
431*9880d681SAndroid Build Coastguard Worker  %cowval = phi i32 [ 2, %block2 ], [ 0, %block1 ]
432*9880d681SAndroid Build Coastguard Worker  br label %exit
433*9880d681SAndroid Build Coastguard Worker
434*9880d681SAndroid Build Coastguard Workerexit:
435*9880d681SAndroid Build Coastguard Worker  %outval = phi i32 [ %cowval, %block3 ], [ 1, %block2 ]
436*9880d681SAndroid Build Coastguard Worker  ret i32 %outval
437*9880d681SAndroid Build Coastguard Worker}
438*9880d681SAndroid Build Coastguard Worker
439*9880d681SAndroid Build Coastguard Worker; Swap the operands of the compares to verify that the weights update correctly.
440*9880d681SAndroid Build Coastguard Worker
441*9880d681SAndroid Build Coastguard Workerdefine i32 @SimplifyCondBranchToCondBranchSwap(i1 %cmpa, i1 %cmpb) {
442*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @SimplifyCondBranchToCondBranchSwap(
443*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  block1:
444*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMPA_NOT:%.*]] = xor i1 %cmpa, true
445*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMPB_NOT:%.*]] = xor i1 %cmpb, true
446*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[BRMERGE:%.*]] = or i1 [[CMPA_NOT]], [[CMPB_NOT]]
447*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DOTMUX:%.*]] = select i1 [[CMPA_NOT]], i32 0, i32 2, !prof !15
448*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OUTVAL:%.*]] = select i1 [[BRMERGE]], i32 [[DOTMUX]], i32 1, !prof !16
449*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[OUTVAL]]
450*9880d681SAndroid Build Coastguard Worker;
451*9880d681SAndroid Build Coastguard Workerblock1:
452*9880d681SAndroid Build Coastguard Worker  br i1 %cmpa, label %block2, label %block3, !prof !13
453*9880d681SAndroid Build Coastguard Worker
454*9880d681SAndroid Build Coastguard Workerblock2:
455*9880d681SAndroid Build Coastguard Worker  br i1 %cmpb, label %exit, label %block3, !prof !14
456*9880d681SAndroid Build Coastguard Worker
457*9880d681SAndroid Build Coastguard Workerblock3:
458*9880d681SAndroid Build Coastguard Worker  %cowval = phi i32 [ 2, %block2 ], [ 0, %block1 ]
459*9880d681SAndroid Build Coastguard Worker  br label %exit
460*9880d681SAndroid Build Coastguard Worker
461*9880d681SAndroid Build Coastguard Workerexit:
462*9880d681SAndroid Build Coastguard Worker  %outval = phi i32 [ %cowval, %block3 ], [ 1, %block2 ]
463*9880d681SAndroid Build Coastguard Worker  ret i32 %outval
464*9880d681SAndroid Build Coastguard Worker}
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Workerdefine i32 @SimplifyCondBranchToCondBranchSwapMissingWeight(i1 %cmpa, i1 %cmpb) {
467*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @SimplifyCondBranchToCondBranchSwapMissingWeight(
468*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  block1:
469*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMPA_NOT:%.*]] = xor i1 %cmpa, true
470*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMPB_NOT:%.*]] = xor i1 %cmpb, true
471*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[BRMERGE:%.*]] = or i1 [[CMPA_NOT]], [[CMPB_NOT]]
472*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DOTMUX:%.*]] = select i1 [[CMPA_NOT]], i32 0, i32 2, !prof !17
473*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[OUTVAL:%.*]] = select i1 [[BRMERGE]], i32 [[DOTMUX]], i32 1, !prof !18
474*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[OUTVAL]]
475*9880d681SAndroid Build Coastguard Worker;
476*9880d681SAndroid Build Coastguard Workerblock1:
477*9880d681SAndroid Build Coastguard Worker  br i1 %cmpa, label %block2, label %block3, !prof !13
478*9880d681SAndroid Build Coastguard Worker
479*9880d681SAndroid Build Coastguard Workerblock2:
480*9880d681SAndroid Build Coastguard Worker  br i1 %cmpb, label %exit, label %block3
481*9880d681SAndroid Build Coastguard Worker
482*9880d681SAndroid Build Coastguard Workerblock3:
483*9880d681SAndroid Build Coastguard Worker  %cowval = phi i32 [ 2, %block2 ], [ 0, %block1 ]
484*9880d681SAndroid Build Coastguard Worker  br label %exit
485*9880d681SAndroid Build Coastguard Worker
486*9880d681SAndroid Build Coastguard Workerexit:
487*9880d681SAndroid Build Coastguard Worker  %outval = phi i32 [ %cowval, %block3 ], [ 1, %block2 ]
488*9880d681SAndroid Build Coastguard Worker  ret i32 %outval
489*9880d681SAndroid Build Coastguard Worker}
490*9880d681SAndroid Build Coastguard Worker
491*9880d681SAndroid Build Coastguard Worker!0 = !{!"branch_weights", i32 3, i32 5}
492*9880d681SAndroid Build Coastguard Worker!1 = !{!"branch_weights", i32 1, i32 1}
493*9880d681SAndroid Build Coastguard Worker!2 = !{!"branch_weights", i32 1, i32 2}
494*9880d681SAndroid Build Coastguard Worker!3 = !{!"branch_weights", i32 4, i32 3, i32 2, i32 1}
495*9880d681SAndroid Build Coastguard Worker!4 = !{!"branch_weights", i32 4, i32 3, i32 2, i32 1}
496*9880d681SAndroid Build Coastguard Worker!5 = !{!"branch_weights", i32 7, i32 6, i32 5}
497*9880d681SAndroid Build Coastguard Worker!6 = !{!"branch_weights", i32 1, i32 3}
498*9880d681SAndroid Build Coastguard Worker!7 = !{!"branch_weights", i32 33, i32 9, i32 8, i32 7}
499*9880d681SAndroid Build Coastguard Worker!8 = !{!"branch_weights", i32 33, i32 9, i32 8}
500*9880d681SAndroid Build Coastguard Worker!9 = !{!"branch_weights", i32 7, i32 6}
501*9880d681SAndroid Build Coastguard Worker!10 = !{!"branch_weights", i32 672646, i32 21604207}
502*9880d681SAndroid Build Coastguard Worker!11 = !{!"branch_weights", i32 6960, i32 21597248}
503*9880d681SAndroid Build Coastguard Worker!12 = !{!"these_are_not_the_branch_weights_you_are_looking_for", i32 3, i32 5}
504*9880d681SAndroid Build Coastguard Worker!13 = !{!"branch_weights", i32 2, i32 3}
505*9880d681SAndroid Build Coastguard Worker!14 = !{!"branch_weights", i32 4, i32 7}
506*9880d681SAndroid Build Coastguard Worker
507*9880d681SAndroid Build Coastguard Worker; CHECK: !0 = !{!"branch_weights", i32 5, i32 11}
508*9880d681SAndroid Build Coastguard Worker; CHECK: !1 = !{!"branch_weights", i32 1, i32 3}
509*9880d681SAndroid Build Coastguard Worker; CHECK: !2 = !{!"branch_weights", i32 1, i32 5}
510*9880d681SAndroid Build Coastguard Worker; CHECK: !3 = !{!"branch_weights", i32 7, i32 1, i32 2}
511*9880d681SAndroid Build Coastguard Worker; CHECK: !4 = !{!"branch_weights", i32 49, i32 12, i32 24, i32 35}
512*9880d681SAndroid Build Coastguard Worker; CHECK: !5 = !{!"branch_weights", i32 11, i32 5}
513*9880d681SAndroid Build Coastguard Worker; CHECK: !6 = !{!"branch_weights", i32 17, i32 15}
514*9880d681SAndroid Build Coastguard Worker; CHECK: !7 = !{!"branch_weights", i32 9, i32 7}
515*9880d681SAndroid Build Coastguard Worker; CHECK: !8 = !{!"branch_weights", i32 17, i32 9, i32 8, i32 7, i32 17}
516*9880d681SAndroid Build Coastguard Worker; CHECK: !9 = !{!"branch_weights", i32 24, i32 33}
517*9880d681SAndroid Build Coastguard Worker; CHECK: !10 = !{!"branch_weights", i32 8, i32 33}
518*9880d681SAndroid Build Coastguard Worker;; The false weight prints out as a negative integer here, but inside llvm, we
519*9880d681SAndroid Build Coastguard Worker;; treat the weight as an unsigned integer.
520*9880d681SAndroid Build Coastguard Worker; CHECK: !11 = !{!"branch_weights", i32 112017436, i32 -735157296}
521*9880d681SAndroid Build Coastguard Worker; CHECK: !12 = !{!"branch_weights", i32 3, i32 5}
522*9880d681SAndroid Build Coastguard Worker; CHECK: !13 = !{!"branch_weights", i32 22, i32 12}
523*9880d681SAndroid Build Coastguard Worker; CHECK: !14 = !{!"branch_weights", i32 34, i32 21}
524*9880d681SAndroid Build Coastguard Worker; CHECK: !15 = !{!"branch_weights", i32 33, i32 14}
525*9880d681SAndroid Build Coastguard Worker; CHECK: !16 = !{!"branch_weights", i32 47, i32 8}
526*9880d681SAndroid Build Coastguard Worker; CHECK: !17 = !{!"branch_weights", i32 6, i32 2}
527*9880d681SAndroid Build Coastguard Worker; CHECK: !18 = !{!"branch_weights", i32 8, i32 2}
528