xref: /aosp_15_r20/external/llvm/test/Analysis/BranchProbabilityInfo/basic.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -analyze -branch-prob | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %i, i32* %a) {
5*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'test1'
6*9880d681SAndroid Build Coastguard Workerentry:
7*9880d681SAndroid Build Coastguard Worker  br label %body
8*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> body probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Workerbody:
11*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 0, %entry ], [ %next, %body ]
12*9880d681SAndroid Build Coastguard Worker  %base = phi i32 [ 0, %entry ], [ %sum, %body ]
13*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %a, i32 %iv
14*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx
15*9880d681SAndroid Build Coastguard Worker  %sum = add nsw i32 %0, %base
16*9880d681SAndroid Build Coastguard Worker  %next = add i32 %iv, 1
17*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp eq i32 %next, %i
18*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %exit, label %body
19*9880d681SAndroid Build Coastguard Worker; CHECK: edge body -> exit probability is 0x04000000 / 0x80000000 = 3.12%
20*9880d681SAndroid Build Coastguard Worker; CHECK: edge body -> body probability is 0x7c000000 / 0x80000000 = 96.88% [HOT edge]
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Workerexit:
23*9880d681SAndroid Build Coastguard Worker  ret i32 %sum
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %i, i32 %a, i32 %b) {
27*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'test2'
28*9880d681SAndroid Build Coastguard Workerentry:
29*9880d681SAndroid Build Coastguard Worker  %cond = icmp ult i32 %i, 42
30*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %then, label %else, !prof !0
31*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> then probability is 0x78787878 / 0x80000000 = 94.12% [HOT edge]
32*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> else probability is 0x07878788 / 0x80000000 = 5.88%
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerthen:
35*9880d681SAndroid Build Coastguard Worker  br label %exit
36*9880d681SAndroid Build Coastguard Worker; CHECK: edge then -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerelse:
39*9880d681SAndroid Build Coastguard Worker  br label %exit
40*9880d681SAndroid Build Coastguard Worker; CHECK: edge else -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerexit:
43*9880d681SAndroid Build Coastguard Worker  %result = phi i32 [ %a, %then ], [ %b, %else ]
44*9880d681SAndroid Build Coastguard Worker  ret i32 %result
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Worker!0 = !{!"branch_weights", i32 64, i32 4}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %i, i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
50*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'test3'
51*9880d681SAndroid Build Coastguard Workerentry:
52*9880d681SAndroid Build Coastguard Worker  switch i32 %i, label %case_a [ i32 1, label %case_b
53*9880d681SAndroid Build Coastguard Worker                                 i32 2, label %case_c
54*9880d681SAndroid Build Coastguard Worker                                 i32 3, label %case_d
55*9880d681SAndroid Build Coastguard Worker                                 i32 4, label %case_e ], !prof !1
56*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> case_a probability is 0x06666666 / 0x80000000 = 5.00%
57*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> case_b probability is 0x06666666 / 0x80000000 = 5.00%
58*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> case_c probability is 0x66666666 / 0x80000000 = 80.00%
59*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> case_d probability is 0x06666666 / 0x80000000 = 5.00%
60*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> case_e probability is 0x06666666 / 0x80000000 = 5.00%
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workercase_a:
63*9880d681SAndroid Build Coastguard Worker  br label %exit
64*9880d681SAndroid Build Coastguard Worker; CHECK: edge case_a -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workercase_b:
67*9880d681SAndroid Build Coastguard Worker  br label %exit
68*9880d681SAndroid Build Coastguard Worker; CHECK: edge case_b -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
69*9880d681SAndroid Build Coastguard Worker
70*9880d681SAndroid Build Coastguard Workercase_c:
71*9880d681SAndroid Build Coastguard Worker  br label %exit
72*9880d681SAndroid Build Coastguard Worker; CHECK: edge case_c -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workercase_d:
75*9880d681SAndroid Build Coastguard Worker  br label %exit
76*9880d681SAndroid Build Coastguard Worker; CHECK: edge case_d -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workercase_e:
79*9880d681SAndroid Build Coastguard Worker  br label %exit
80*9880d681SAndroid Build Coastguard Worker; CHECK: edge case_e -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerexit:
83*9880d681SAndroid Build Coastguard Worker  %result = phi i32 [ %a, %case_a ],
84*9880d681SAndroid Build Coastguard Worker                    [ %b, %case_b ],
85*9880d681SAndroid Build Coastguard Worker                    [ %c, %case_c ],
86*9880d681SAndroid Build Coastguard Worker                    [ %d, %case_d ],
87*9880d681SAndroid Build Coastguard Worker                    [ %e, %case_e ]
88*9880d681SAndroid Build Coastguard Worker  ret i32 %result
89*9880d681SAndroid Build Coastguard Worker}
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Worker!1 = !{!"branch_weights", i32 4, i32 4, i32 64, i32 4, i32 4}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %x) nounwind uwtable readnone ssp {
94*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'test4'
95*9880d681SAndroid Build Coastguard Workerentry:
96*9880d681SAndroid Build Coastguard Worker  %conv = sext i32 %x to i64
97*9880d681SAndroid Build Coastguard Worker  switch i64 %conv, label %return [
98*9880d681SAndroid Build Coastguard Worker    i64 0, label %sw.bb
99*9880d681SAndroid Build Coastguard Worker    i64 1, label %sw.bb
100*9880d681SAndroid Build Coastguard Worker    i64 2, label %sw.bb
101*9880d681SAndroid Build Coastguard Worker    i64 5, label %sw.bb1
102*9880d681SAndroid Build Coastguard Worker  ], !prof !2
103*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> return probability is 0x0a8a8a8b / 0x80000000 = 8.24%
104*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> sw.bb probability is 0x15151515 / 0x80000000 = 16.47%
105*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> sw.bb1 probability is 0x60606060 / 0x80000000 = 75.29%
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Workersw.bb:
108*9880d681SAndroid Build Coastguard Worker  br label %return
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Workersw.bb1:
111*9880d681SAndroid Build Coastguard Worker  br label %return
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerreturn:
114*9880d681SAndroid Build Coastguard Worker  %retval.0 = phi i32 [ 5, %sw.bb1 ], [ 1, %sw.bb ], [ 0, %entry ]
115*9880d681SAndroid Build Coastguard Worker  ret i32 %retval.0
116*9880d681SAndroid Build Coastguard Worker}
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker!2 = !{!"branch_weights", i32 7, i32 6, i32 4, i32 4, i32 64}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerdeclare void @coldfunc() cold
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %a, i32 %b, i1 %flag) {
123*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'test5'
124*9880d681SAndroid Build Coastguard Workerentry:
125*9880d681SAndroid Build Coastguard Worker  br i1 %flag, label %then, label %else
126*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> then probability is 0x07878788 / 0x80000000 = 5.88%
127*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> else probability is 0x78787878 / 0x80000000 = 94.12% [HOT edge]
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Workerthen:
130*9880d681SAndroid Build Coastguard Worker  call void @coldfunc()
131*9880d681SAndroid Build Coastguard Worker  br label %exit
132*9880d681SAndroid Build Coastguard Worker; CHECK: edge then -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Workerelse:
135*9880d681SAndroid Build Coastguard Worker  br label %exit
136*9880d681SAndroid Build Coastguard Worker; CHECK: edge else -> exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Workerexit:
139*9880d681SAndroid Build Coastguard Worker  %result = phi i32 [ %a, %then ], [ %b, %else ]
140*9880d681SAndroid Build Coastguard Worker  ret i32 %result
141*9880d681SAndroid Build Coastguard Worker}
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Workerdeclare i32 @regular_function(i32 %i)
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Workerdefine i32 @test_cold_call_sites(i32* %a) {
146*9880d681SAndroid Build Coastguard Worker; Test that edges to blocks post-dominated by cold call sites
147*9880d681SAndroid Build Coastguard Worker; are marked as not expected to be taken.
148*9880d681SAndroid Build Coastguard Worker; TODO(dnovillo) The calls to regular_function should not be merged, but
149*9880d681SAndroid Build Coastguard Worker; they are currently being merged. Convert this into a code generation test
150*9880d681SAndroid Build Coastguard Worker; after that is fixed.
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'test_cold_call_sites'
153*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> then probability is 0x07878788 / 0x80000000 = 5.88%
154*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> else probability is 0x78787878 / 0x80000000 = 94.12% [HOT edge]
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Workerentry:
157*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr i32, i32* %a, i32 1
158*9880d681SAndroid Build Coastguard Worker  %val1 = load i32, i32* %gep1
159*9880d681SAndroid Build Coastguard Worker  %cond1 = icmp ugt i32 %val1, 1
160*9880d681SAndroid Build Coastguard Worker  br i1 %cond1, label %then, label %else
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Workerthen:
163*9880d681SAndroid Build Coastguard Worker  ; This function is not declared cold, but this call site is.
164*9880d681SAndroid Build Coastguard Worker  %val4 = call i32 @regular_function(i32 %val1) cold
165*9880d681SAndroid Build Coastguard Worker  br label %exit
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Workerelse:
168*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr i32, i32* %a, i32 2
169*9880d681SAndroid Build Coastguard Worker  %val2 = load i32, i32* %gep2
170*9880d681SAndroid Build Coastguard Worker  %val3 = call i32 @regular_function(i32 %val2)
171*9880d681SAndroid Build Coastguard Worker  br label %exit
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerexit:
174*9880d681SAndroid Build Coastguard Worker  %ret = phi i32 [ %val4, %then ], [ %val3, %else ]
175*9880d681SAndroid Build Coastguard Worker  ret i32 %ret
176*9880d681SAndroid Build Coastguard Worker}
177*9880d681SAndroid Build Coastguard Worker
178*9880d681SAndroid Build Coastguard Workerdefine i32 @zero1(i32 %i, i32 %a, i32 %b) {
179*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'zero1'
180*9880d681SAndroid Build Coastguard Workerentry:
181*9880d681SAndroid Build Coastguard Worker  %cond = icmp eq i32 %i, 0
182*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %then, label %else
183*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> then probability is 0x30000000 / 0x80000000 = 37.50%
184*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> else probability is 0x50000000 / 0x80000000 = 62.50%
185*9880d681SAndroid Build Coastguard Worker
186*9880d681SAndroid Build Coastguard Workerthen:
187*9880d681SAndroid Build Coastguard Worker  br label %exit
188*9880d681SAndroid Build Coastguard Worker
189*9880d681SAndroid Build Coastguard Workerelse:
190*9880d681SAndroid Build Coastguard Worker  br label %exit
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Workerexit:
193*9880d681SAndroid Build Coastguard Worker  %result = phi i32 [ %a, %then ], [ %b, %else ]
194*9880d681SAndroid Build Coastguard Worker  ret i32 %result
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerdefine i32 @zero2(i32 %i, i32 %a, i32 %b) {
198*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'zero2'
199*9880d681SAndroid Build Coastguard Workerentry:
200*9880d681SAndroid Build Coastguard Worker  %cond = icmp ne i32 %i, -1
201*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %then, label %else
202*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> then probability is 0x50000000 / 0x80000000 = 62.50%
203*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> else probability is 0x30000000 / 0x80000000 = 37.50%
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerthen:
206*9880d681SAndroid Build Coastguard Worker  br label %exit
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Workerelse:
209*9880d681SAndroid Build Coastguard Worker  br label %exit
210*9880d681SAndroid Build Coastguard Worker
211*9880d681SAndroid Build Coastguard Workerexit:
212*9880d681SAndroid Build Coastguard Worker  %result = phi i32 [ %a, %then ], [ %b, %else ]
213*9880d681SAndroid Build Coastguard Worker  ret i32 %result
214*9880d681SAndroid Build Coastguard Worker}
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Workerdefine i32 @zero3(i32 %i, i32 %a, i32 %b) {
217*9880d681SAndroid Build Coastguard Worker; CHECK: Printing analysis {{.*}} for function 'zero3'
218*9880d681SAndroid Build Coastguard Workerentry:
219*9880d681SAndroid Build Coastguard Worker; AND'ing with a single bit bitmask essentially leads to a bool comparison,
220*9880d681SAndroid Build Coastguard Worker; meaning we don't have probability information.
221*9880d681SAndroid Build Coastguard Worker  %and = and i32 %i, 2
222*9880d681SAndroid Build Coastguard Worker  %tobool = icmp eq i32 %and, 0
223*9880d681SAndroid Build Coastguard Worker  br i1 %tobool, label %then, label %else
224*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> then probability is 0x40000000 / 0x80000000 = 50.00%
225*9880d681SAndroid Build Coastguard Worker; CHECK: edge entry -> else probability is 0x40000000 / 0x80000000 = 50.00%
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Workerthen:
228*9880d681SAndroid Build Coastguard Worker; AND'ing with other bitmask might be something else, so we still assume the
229*9880d681SAndroid Build Coastguard Worker; usual probabilities.
230*9880d681SAndroid Build Coastguard Worker  %and2 = and i32 %i, 5
231*9880d681SAndroid Build Coastguard Worker  %tobool2 = icmp eq i32 %and2, 0
232*9880d681SAndroid Build Coastguard Worker  br i1 %tobool2, label %else, label %exit
233*9880d681SAndroid Build Coastguard Worker; CHECK: edge then -> else probability is 0x30000000 / 0x80000000 = 37.50%
234*9880d681SAndroid Build Coastguard Worker; CHECK: edge then -> exit probability is 0x50000000 / 0x80000000 = 62.50%
235*9880d681SAndroid Build Coastguard Worker
236*9880d681SAndroid Build Coastguard Workerelse:
237*9880d681SAndroid Build Coastguard Worker  br label %exit
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Workerexit:
240*9880d681SAndroid Build Coastguard Worker  %result = phi i32 [ %a, %then ], [ %b, %else ]
241*9880d681SAndroid Build Coastguard Worker  ret i32 %result
242*9880d681SAndroid Build Coastguard Worker}
243*9880d681SAndroid Build Coastguard Worker
244