xref: /aosp_15_r20/external/llvm/test/Transforms/SimplifyCFG/preserve-branchweights-switch-create.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -simplifycfg -S -o - < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdeclare void @func2(i32)
4*9880d681SAndroid Build Coastguard Workerdeclare void @func4(i32)
5*9880d681SAndroid Build Coastguard Workerdeclare void @func6(i32)
6*9880d681SAndroid Build Coastguard Workerdeclare void @func8(i32)
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker;; test1 - create a switch with case 2 and case 4 from two branches: N == 2
9*9880d681SAndroid Build Coastguard Worker;; and N == 4.
10*9880d681SAndroid Build Coastguard Workerdefine void @test1(i32 %N) nounwind uwtable {
11*9880d681SAndroid Build Coastguard Workerentry:
12*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %N, 2
13*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %if.then, label %if.else, !prof !0
14*9880d681SAndroid Build Coastguard Worker; CHECK: test1
15*9880d681SAndroid Build Coastguard Worker; CHECK: switch i32 %N
16*9880d681SAndroid Build Coastguard Worker; CHECK: ], !prof !0
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerif.then:
19*9880d681SAndroid Build Coastguard Worker  call void @func2(i32 %N) nounwind
20*9880d681SAndroid Build Coastguard Worker  br label %if.end9
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerif.else:
23*9880d681SAndroid Build Coastguard Worker  %cmp2 = icmp eq i32 %N, 4
24*9880d681SAndroid Build Coastguard Worker  br i1 %cmp2, label %if.then7, label %if.else8, !prof !1
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerif.then7:
27*9880d681SAndroid Build Coastguard Worker  call void @func4(i32 %N) nounwind
28*9880d681SAndroid Build Coastguard Worker  br label %if.end
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Workerif.else8:
31*9880d681SAndroid Build Coastguard Worker  call void @func8(i32 %N) nounwind
32*9880d681SAndroid Build Coastguard Worker  br label %if.end
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerif.end:
35*9880d681SAndroid Build Coastguard Worker  br label %if.end9
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerif.end9:
38*9880d681SAndroid Build Coastguard Worker  ret void
39*9880d681SAndroid Build Coastguard Worker}
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker;; test2 - Merge two switches where PredDefault == BB.
42*9880d681SAndroid Build Coastguard Workerdefine void @test2(i32 %M, i32 %N) nounwind uwtable {
43*9880d681SAndroid Build Coastguard Workerentry:
44*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %M, 2
45*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %sw1, label %sw2
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workersw1:
48*9880d681SAndroid Build Coastguard Worker  switch i32 %N, label %sw2 [
49*9880d681SAndroid Build Coastguard Worker    i32 2, label %sw.bb
50*9880d681SAndroid Build Coastguard Worker    i32 3, label %sw.bb1
51*9880d681SAndroid Build Coastguard Worker  ], !prof !2
52*9880d681SAndroid Build Coastguard Worker; CHECK: test2
53*9880d681SAndroid Build Coastguard Worker; CHECK: switch i32 %N, label %sw.epilog
54*9880d681SAndroid Build Coastguard Worker; CHECK: i32 2, label %sw.bb
55*9880d681SAndroid Build Coastguard Worker; CHECK: i32 3, label %sw.bb1
56*9880d681SAndroid Build Coastguard Worker; CHECK: i32 4, label %sw.bb5
57*9880d681SAndroid Build Coastguard Worker; CHECK: ], !prof !1
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workersw.bb:
60*9880d681SAndroid Build Coastguard Worker  call void @func2(i32 %N) nounwind
61*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workersw.bb1:
64*9880d681SAndroid Build Coastguard Worker  call void @func4(i32 %N) nounwind
65*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workersw2:
68*9880d681SAndroid Build Coastguard Worker;; Here "case 2" is invalidated if control is transferred through default case
69*9880d681SAndroid Build Coastguard Worker;; of the first switch.
70*9880d681SAndroid Build Coastguard Worker  switch i32 %N, label %sw.epilog [
71*9880d681SAndroid Build Coastguard Worker    i32 2, label %sw.bb4
72*9880d681SAndroid Build Coastguard Worker    i32 4, label %sw.bb5
73*9880d681SAndroid Build Coastguard Worker  ], !prof !3
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workersw.bb4:
76*9880d681SAndroid Build Coastguard Worker  call void @func6(i32 %N) nounwind
77*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workersw.bb5:
80*9880d681SAndroid Build Coastguard Worker  call void @func8(i32 %N) nounwind
81*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Workersw.epilog:
84*9880d681SAndroid Build Coastguard Worker  ret void
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker;; test3 - Merge two switches where PredDefault != BB.
88*9880d681SAndroid Build Coastguard Workerdefine void @test3(i32 %M, i32 %N) nounwind uwtable {
89*9880d681SAndroid Build Coastguard Workerentry:
90*9880d681SAndroid Build Coastguard Worker  %cmp = icmp sgt i32 %M, 2
91*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %sw1, label %sw2
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workersw1:
94*9880d681SAndroid Build Coastguard Worker  switch i32 %N, label %sw.bb [
95*9880d681SAndroid Build Coastguard Worker    i32 2, label %sw2
96*9880d681SAndroid Build Coastguard Worker    i32 3, label %sw2
97*9880d681SAndroid Build Coastguard Worker    i32 1, label %sw.bb1
98*9880d681SAndroid Build Coastguard Worker  ], !prof !4
99*9880d681SAndroid Build Coastguard Worker; CHECK: test3
100*9880d681SAndroid Build Coastguard Worker; CHECK: switch i32 %N, label %sw.bb
101*9880d681SAndroid Build Coastguard Worker; CHECK: i32 1, label %sw.bb1
102*9880d681SAndroid Build Coastguard Worker; CHECK: i32 3, label %sw.bb4
103*9880d681SAndroid Build Coastguard Worker; CHECK: i32 2, label %sw.epilog
104*9880d681SAndroid Build Coastguard Worker; CHECK: ], !prof !3
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workersw.bb:
107*9880d681SAndroid Build Coastguard Worker  call void @func2(i32 %N) nounwind
108*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workersw.bb1:
111*9880d681SAndroid Build Coastguard Worker  call void @func4(i32 %N) nounwind
112*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workersw2:
115*9880d681SAndroid Build Coastguard Worker  switch i32 %N, label %sw.epilog [
116*9880d681SAndroid Build Coastguard Worker    i32 3, label %sw.bb4
117*9880d681SAndroid Build Coastguard Worker    i32 4, label %sw.bb5
118*9880d681SAndroid Build Coastguard Worker  ], !prof !5
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workersw.bb4:
121*9880d681SAndroid Build Coastguard Worker  call void @func6(i32 %N) nounwind
122*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Workersw.bb5:
125*9880d681SAndroid Build Coastguard Worker  call void @func8(i32 %N) nounwind
126*9880d681SAndroid Build Coastguard Worker  br label %sw.epilog
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workersw.epilog:
129*9880d681SAndroid Build Coastguard Worker  ret void
130*9880d681SAndroid Build Coastguard Worker}
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker!0 = !{!"branch_weights", i32 64, i32 4}
133*9880d681SAndroid Build Coastguard Worker!1 = !{!"branch_weights", i32 4, i32 64}
134*9880d681SAndroid Build Coastguard Worker; CHECK: !0 = !{!"branch_weights", i32 256, i32 4352, i32 16}
135*9880d681SAndroid Build Coastguard Worker!2 = !{!"branch_weights", i32 4, i32 4, i32 8}
136*9880d681SAndroid Build Coastguard Worker!3 = !{!"branch_weights", i32 8, i32 8, i32 4}
137*9880d681SAndroid Build Coastguard Worker; CHECK: !1 = !{!"branch_weights", i32 32, i32 48, i32 96, i32 16}
138*9880d681SAndroid Build Coastguard Worker!4 = !{!"branch_weights", i32 7, i32 6, i32 4, i32 3}
139*9880d681SAndroid Build Coastguard Worker!5 = !{!"branch_weights", i32 17, i32 13, i32 9}
140*9880d681SAndroid Build Coastguard Worker; CHECK: !3 = !{!"branch_weights", i32 7, i32 3, i32 4, i32 6}
141