xref: /llvm-project/llvm/test/Analysis/BranchProbabilityInfo/basic.ll (revision bb6497ffa6a88d1b3a32101d9b6519094d75ef2a)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s
3
4define i32 @test1(i32 %i, ptr %a) {
5; CHECK-LABEL: 'test1'
6; CHECK-NEXT:  ---- Branch Probabilities ----
7; CHECK-NEXT:    edge %entry -> %body probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
8; CHECK-NEXT:    edge %body -> %exit probability is 0x04000000 / 0x80000000 = 3.12%
9; CHECK-NEXT:    edge %body -> %body probability is 0x7c000000 / 0x80000000 = 96.88% [HOT edge]
10;
11entry:
12  br label %body
13
14body:
15  %iv = phi i32 [ 0, %entry ], [ %next, %body ]
16  %base = phi i32 [ 0, %entry ], [ %sum, %body ]
17  %arrayidx = getelementptr inbounds i32, ptr %a, i32 %iv
18  %0 = load i32, ptr %arrayidx
19  %sum = add nsw i32 %0, %base
20  %next = add i32 %iv, 1
21  %exitcond = icmp eq i32 %next, %i
22  br i1 %exitcond, label %exit, label %body
23
24exit:
25  ret i32 %sum
26}
27
28define i32 @test2(i32 %i, i32 %a, i32 %b) {
29; CHECK-LABEL: 'test2'
30; CHECK-NEXT:  ---- Branch Probabilities ----
31; CHECK-NEXT:    edge %entry -> %then probability is 0x78787878 / 0x80000000 = 94.12% [HOT edge]
32; CHECK-NEXT:    edge %entry -> %else probability is 0x07878788 / 0x80000000 = 5.88%
33; CHECK-NEXT:    edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
34; CHECK-NEXT:    edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
35;
36entry:
37  %cond = icmp ult i32 %i, 42
38  br i1 %cond, label %then, label %else, !prof !0
39
40then:
41  br label %exit
42
43else:
44  br label %exit
45
46exit:
47  %result = phi i32 [ %a, %then ], [ %b, %else ]
48  ret i32 %result
49}
50
51!0 = !{!"branch_weights", i32 64, i32 4}
52
53define i32 @test3(i32 %i, i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
54; CHECK-LABEL: 'test3'
55; CHECK-NEXT:  ---- Branch Probabilities ----
56; CHECK-NEXT:    edge %entry -> %case_a probability is 0x06666666 / 0x80000000 = 5.00%
57; CHECK-NEXT:    edge %entry -> %case_b probability is 0x06666666 / 0x80000000 = 5.00%
58; CHECK-NEXT:    edge %entry -> %case_c probability is 0x66666666 / 0x80000000 = 80.00%
59; CHECK-NEXT:    edge %entry -> %case_d probability is 0x06666666 / 0x80000000 = 5.00%
60; CHECK-NEXT:    edge %entry -> %case_e probability is 0x06666666 / 0x80000000 = 5.00%
61; CHECK-NEXT:    edge %case_a -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
62; CHECK-NEXT:    edge %case_b -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
63; CHECK-NEXT:    edge %case_c -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
64; CHECK-NEXT:    edge %case_d -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
65; CHECK-NEXT:    edge %case_e -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
66;
67entry:
68  switch i32 %i, label %case_a [ i32 1, label %case_b
69  i32 2, label %case_c
70  i32 3, label %case_d
71  i32 4, label %case_e ], !prof !1
72
73case_a:
74  br label %exit
75
76case_b:
77  br label %exit
78
79case_c:
80  br label %exit
81
82case_d:
83  br label %exit
84
85case_e:
86  br label %exit
87
88exit:
89  %result = phi i32 [ %a, %case_a ], [ %b, %case_b ], [ %c, %case_c ], [ %d, %case_d ], [ %e, %case_e ]
90  ret i32 %result
91}
92
93!1 = !{!"branch_weights", i32 4, i32 4, i32 64, i32 4, i32 4}
94
95define i32 @test4(i32 %x) nounwind uwtable readnone ssp {
96; CHECK-LABEL: 'test4'
97; CHECK-NEXT:  ---- Branch Probabilities ----
98; CHECK-NEXT:    edge %entry -> %return probability is 0x0a8a8a8b / 0x80000000 = 8.24%
99; CHECK-NEXT:    edge %entry -> %sw.bb probability is 0x15151515 / 0x80000000 = 16.47%
100; CHECK-NEXT:    edge %entry -> %sw.bb probability is 0x15151515 / 0x80000000 = 16.47%
101; CHECK-NEXT:    edge %entry -> %sw.bb probability is 0x15151515 / 0x80000000 = 16.47%
102; CHECK-NEXT:    edge %entry -> %sw.bb1 probability is 0x60606060 / 0x80000000 = 75.29%
103; CHECK-NEXT:    edge %sw.bb -> %return probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
104; CHECK-NEXT:    edge %sw.bb1 -> %return probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
105;
106entry:
107  %conv = sext i32 %x to i64
108  switch i64 %conv, label %return [
109  i64 0, label %sw.bb
110  i64 1, label %sw.bb
111  i64 2, label %sw.bb
112  i64 5, label %sw.bb1
113  ], !prof !2
114
115sw.bb:
116  br label %return
117
118sw.bb1:
119  br label %return
120
121return:
122  %retval.0 = phi i32 [ 5, %sw.bb1 ], [ 1, %sw.bb ], [ 0, %entry ]
123  ret i32 %retval.0
124}
125
126!2 = !{!"branch_weights", i32 7, i32 6, i32 4, i32 4, i32 64}
127
128declare void @coldfunc() cold
129
130define i32 @test5(i32 %a, i32 %b, i1 %flag) {
131; CHECK-LABEL: 'test5'
132; CHECK-NEXT:  ---- Branch Probabilities ----
133; CHECK-NEXT:    edge %entry -> %then probability is 0x078780e3 / 0x80000000 = 5.88%
134; CHECK-NEXT:    edge %entry -> %else probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]
135; CHECK-NEXT:    edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
136; CHECK-NEXT:    edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
137;
138entry:
139  br i1 %flag, label %then, label %else
140
141then:
142  call void @coldfunc()
143  br label %exit
144
145else:
146  br label %exit
147
148exit:
149  %result = phi i32 [ %a, %then ], [ %b, %else ]
150  ret i32 %result
151}
152
153define i32 @test_cold_loop(i32 %a, i32 %b) {
154; CHECK-LABEL: 'test_cold_loop'
155; CHECK-NEXT:  ---- Branch Probabilities ----
156; CHECK-NEXT:    edge %entry -> %header probability is 0x40000000 / 0x80000000 = 50.00%
157; CHECK-NEXT:    edge %entry -> %exit probability is 0x40000000 / 0x80000000 = 50.00%
158; CHECK-NEXT:    edge %header -> %body probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
159; CHECK-NEXT:    edge %body -> %header probability is 0x7fbe1203 / 0x80000000 = 99.80% [HOT edge]
160; CHECK-NEXT:    edge %body -> %exit probability is 0x0041edfd / 0x80000000 = 0.20%
161;
162entry:
163  %cond1 = icmp eq i32 %a, 42
164  br i1 %cond1, label %header, label %exit
165header:
166  br label %body
167
168body:
169  %cond2 = icmp eq i32 %b, 42
170  br i1 %cond2, label %header, label %exit
171exit:
172  call void @coldfunc()
173  ret i32 %b
174}
175
176declare i32 @regular_function(i32 %i)
177
178define i32 @test_cold_call_sites_with_prof(i32 %a, i32 %b, i1 %flag, i1 %flag2) {
179; CHECK-LABEL: 'test_cold_call_sites_with_prof'
180; CHECK-NEXT:  ---- Branch Probabilities ----
181; CHECK-NEXT:    edge %entry -> %then probability is 0x078780e3 / 0x80000000 = 5.88%
182; CHECK-NEXT:    edge %entry -> %else probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]
183; CHECK-NEXT:    edge %then -> %then2 probability is 0x7ebb907a / 0x80000000 = 99.01% [HOT edge]
184; CHECK-NEXT:    edge %then -> %else2 probability is 0x01446f86 / 0x80000000 = 0.99%
185; CHECK-NEXT:    edge %then2 -> %join probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
186; CHECK-NEXT:    edge %else2 -> %join probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
187; CHECK-NEXT:    edge %join -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
188; CHECK-NEXT:    edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
189;
190entry:
191  br i1 %flag, label %then, label %else
192
193then:
194  br i1 %flag2, label %then2, label %else2, !prof !3
195
196then2:
197  br label %join
198
199else2:
200  br label %join
201
202join:
203  %joinresult = phi i32 [ %a, %then2 ], [ %b, %else2 ]
204  call void @coldfunc()
205  br label %exit
206
207else:
208  br label %exit
209
210exit:
211  %result = phi i32 [ %joinresult, %join ], [ %b, %else ]
212  ret i32 %result
213}
214
215!3 = !{!"branch_weights", i32 100, i32 1}
216
217define i32 @test_cold_call_sites(ptr %a) {
218; Test that edges to blocks post-dominated by cold call sites
219; are marked as not expected to be taken.
220; TODO(dnovillo) The calls to regular_function should not be merged, but
221; they are currently being merged. Convert this into a code generation test
222; after that is fixed.
223; CHECK-LABEL: 'test_cold_call_sites'
224; CHECK-NEXT:  ---- Branch Probabilities ----
225; CHECK-NEXT:    edge %entry -> %then probability is 0x078780e3 / 0x80000000 = 5.88%
226; CHECK-NEXT:    edge %entry -> %else probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]
227; CHECK-NEXT:    edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
228; CHECK-NEXT:    edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
229;
230
231entry:
232  %gep1 = getelementptr i32, ptr %a, i32 1
233  %val1 = load i32, ptr %gep1
234  %cond1 = icmp ugt i32 %val1, 1
235  br i1 %cond1, label %then, label %else
236
237then:
238  ; This function is not declared cold, but this call site is.
239  %val4 = call i32 @regular_function(i32 %val1) cold
240  br label %exit
241
242else:
243  %gep2 = getelementptr i32, ptr %a, i32 2
244  %val2 = load i32, ptr %gep2
245  %val3 = call i32 @regular_function(i32 %val2)
246  br label %exit
247
248exit:
249  %ret = phi i32 [ %val4, %then ], [ %val3, %else ]
250  ret i32 %ret
251}
252
253define i32 @test_invoke_code_callsite1(i1 %c) personality ptr @__gxx_personality_v0 {
254; CHECK-LABEL: 'test_invoke_code_callsite1'
255; CHECK-NEXT:  ---- Branch Probabilities ----
256; CHECK-NEXT:    edge %entry -> %if.then probability is 0x078780e3 / 0x80000000 = 5.88%
257; CHECK-NEXT:    edge %entry -> %if.end probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]
258; CHECK-NEXT:    edge %if.then -> %invoke.cont probability is 0x7fff8000 / 0x80000000 = 100.00% [HOT edge]
259; CHECK-NEXT:    edge %if.then -> %lpad probability is 0x00008000 / 0x80000000 = 0.00%
260; CHECK-NEXT:    edge %invoke.cont -> %if.end probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
261; CHECK-NEXT:    edge %lpad -> %if.end probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
262;
263entry:
264  br i1 %c, label %if.then, label %if.end
265; Edge "entry->if.end" should have higher probability based on the cold call
266; heuristic which treat %if.then as a cold block because the normal destination
267; of the invoke instruction in %if.then is post-dominated by ColdFunc().
268
269if.then:
270  invoke i32 @InvokeCall()
271  to label %invoke.cont unwind label %lpad
272
273invoke.cont:
274  call void @ColdFunc() #0
275  br label %if.end
276
277lpad:
278  %ll = landingpad { ptr, i32 }
279  cleanup
280  br label %if.end
281
282if.end:
283  ret i32 0
284}
285
286define i32 @test_invoke_code_callsite2(i1 %c) personality ptr @__gxx_personality_v0 {
287; CHECK-LABEL: 'test_invoke_code_callsite2'
288; CHECK-NEXT:  ---- Branch Probabilities ----
289; CHECK-NEXT:    edge %entry -> %if.then probability is 0x40000000 / 0x80000000 = 50.00%
290; CHECK-NEXT:    edge %entry -> %if.end probability is 0x40000000 / 0x80000000 = 50.00%
291; CHECK-NEXT:    edge %if.then -> %invoke.cont probability is 0x7ffff800 / 0x80000000 = 100.00% [HOT edge]
292; CHECK-NEXT:    edge %if.then -> %lpad probability is 0x00000800 / 0x80000000 = 0.00%
293; CHECK-NEXT:    edge %invoke.cont -> %if.end probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
294; CHECK-NEXT:    edge %lpad -> %if.end probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
295;
296entry:
297  br i1 %c, label %if.then, label %if.end
298
299if.then:
300  invoke i32 @InvokeCall()
301  to label %invoke.cont unwind label %lpad
302; The cold call heuristic should not kick in when the cold callsite is in EH path.
303
304invoke.cont:
305  br label %if.end
306
307lpad:
308  %ll = landingpad { ptr, i32 }
309  cleanup
310  call void @ColdFunc() #0
311  br label %if.end
312
313if.end:
314  ret i32 0
315}
316
317define i32 @test_invoke_code_callsite3(i1 %c) personality ptr @__gxx_personality_v0 {
318; CHECK-LABEL: 'test_invoke_code_callsite3'
319; CHECK-NEXT:  ---- Branch Probabilities ----
320; CHECK-NEXT:    edge %entry -> %if.then probability is 0x078780e3 / 0x80000000 = 5.88%
321; CHECK-NEXT:    edge %entry -> %if.end probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]
322; CHECK-NEXT:    edge %if.then -> %invoke.cont probability is 0x7fff8000 / 0x80000000 = 100.00% [HOT edge]
323; CHECK-NEXT:    edge %if.then -> %lpad probability is 0x00008000 / 0x80000000 = 0.00%
324; CHECK-NEXT:    edge %invoke.cont -> %if.end probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
325; CHECK-NEXT:    edge %lpad -> %if.end probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
326;
327entry:
328  br i1 %c, label %if.then, label %if.end
329
330if.then:
331  invoke i32 @InvokeCall()
332  to label %invoke.cont unwind label %lpad
333; Regardless of cold calls, edge weights from a invoke instruction should be
334; determined by the invoke heuristic.
335
336invoke.cont:
337  call void @ColdFunc() #0
338  br label %if.end
339
340lpad:
341  %ll = landingpad { ptr, i32 }
342  cleanup
343  call void @ColdFunc() #0
344  br label %if.end
345
346if.end:
347  ret i32 0
348}
349
350define void @test_invoke_code_profiled(i1 %c) personality ptr @__gxx_personality_v0 {
351; CHECK-LABEL: 'test_invoke_code_profiled'
352; CHECK-NEXT:  ---- Branch Probabilities ----
353; CHECK-NEXT:    edge %entry -> %invoke.to0 probability is 0x7ffff800 / 0x80000000 = 100.00% [HOT edge]
354; CHECK-NEXT:    edge %entry -> %lpad probability is 0x00000800 / 0x80000000 = 0.00%
355; CHECK-NEXT:    edge %invoke.to0 -> %invoke.to1 probability is 0x7ffff800 / 0x80000000 = 100.00% [HOT edge]
356; CHECK-NEXT:    edge %invoke.to0 -> %lpad probability is 0x00000800 / 0x80000000 = 0.00%
357; CHECK-NEXT:    edge %invoke.to1 -> %invoke.to2 probability is 0x55555555 / 0x80000000 = 66.67%
358; CHECK-NEXT:    edge %invoke.to1 -> %lpad probability is 0x2aaaaaab / 0x80000000 = 33.33%
359;
360entry:
361  invoke i32 @InvokeCall() to label %invoke.to0 unwind label %lpad
362
363invoke.to0:
364  invoke i32 @InvokeCall() to label %invoke.to1 unwind label %lpad,
365  !prof !{!"branch_weights", i32 444}
366
367invoke.to1:
368  invoke i32 @InvokeCall() to label %invoke.to2 unwind label %lpad,
369  !prof !{!"branch_weights", i32 222, i32 111}
370  ret void
371
372invoke.to2:
373  ret void
374
375lpad:
376  %ll = landingpad { ptr, i32 }
377  cleanup
378  ret void
379}
380
381declare i32 @__gxx_personality_v0(...)
382declare void  @ColdFunc()
383declare i32 @InvokeCall()
384
385attributes #0 = { cold }
386
387
388define i32 @zero1(i32 %i, i32 %a, i32 %b) {
389; CHECK-LABEL: 'zero1'
390; CHECK-NEXT:  ---- Branch Probabilities ----
391; CHECK-NEXT:    edge %entry -> %then probability is 0x30000000 / 0x80000000 = 37.50%
392; CHECK-NEXT:    edge %entry -> %else probability is 0x50000000 / 0x80000000 = 62.50%
393; CHECK-NEXT:    edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
394; CHECK-NEXT:    edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
395;
396entry:
397  %cond = icmp eq i32 %i, 0
398  br i1 %cond, label %then, label %else
399
400then:
401  br label %exit
402
403else:
404  br label %exit
405
406exit:
407  %result = phi i32 [ %a, %then ], [ %b, %else ]
408  ret i32 %result
409}
410
411define i32 @zero2(i32 %i, i32 %a, i32 %b) {
412; CHECK-LABEL: 'zero2'
413; CHECK-NEXT:  ---- Branch Probabilities ----
414; CHECK-NEXT:    edge %entry -> %then probability is 0x50000000 / 0x80000000 = 62.50%
415; CHECK-NEXT:    edge %entry -> %else probability is 0x30000000 / 0x80000000 = 37.50%
416; CHECK-NEXT:    edge %then -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
417; CHECK-NEXT:    edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
418;
419entry:
420  %cond = icmp ne i32 %i, -1
421  br i1 %cond, label %then, label %else
422
423then:
424  br label %exit
425
426else:
427  br label %exit
428
429exit:
430  %result = phi i32 [ %a, %then ], [ %b, %else ]
431  ret i32 %result
432}
433
434define i32 @zero3(i32 %i, i32 %a, i32 %b) {
435; CHECK-LABEL: 'zero3'
436; CHECK-NEXT:  ---- Branch Probabilities ----
437; CHECK-NEXT:    edge %entry -> %then probability is 0x40000000 / 0x80000000 = 50.00%
438; CHECK-NEXT:    edge %entry -> %else probability is 0x40000000 / 0x80000000 = 50.00%
439; CHECK-NEXT:    edge %then -> %else probability is 0x30000000 / 0x80000000 = 37.50%
440; CHECK-NEXT:    edge %then -> %exit probability is 0x50000000 / 0x80000000 = 62.50%
441; CHECK-NEXT:    edge %else -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
442;
443entry:
444; AND'ing with a single bit bitmask essentially leads to a bool comparison,
445; meaning we don't have probability information.
446  %and = and i32 %i, 2
447  %tobool = icmp eq i32 %and, 0
448  br i1 %tobool, label %then, label %else
449
450then:
451; AND'ing with other bitmask might be something else, so we still assume the
452; usual probabilities.
453  %and2 = and i32 %i, 5
454  %tobool2 = icmp eq i32 %and2, 0
455  br i1 %tobool2, label %else, label %exit
456
457else:
458  br label %exit
459
460exit:
461  %result = phi i32 [ %a, %then ], [ %b, %else ]
462  ret i32 %result
463}
464
465define i32 @test_unreachable_with_prof_greater(i32 %a, i32 %b) {
466; CHECK-LABEL: 'test_unreachable_with_prof_greater'
467; CHECK-NEXT:  ---- Branch Probabilities ----
468; CHECK-NEXT:    edge %entry -> %exit probability is 0x7fffffff / 0x80000000 = 100.00% [HOT edge]
469; CHECK-NEXT:    edge %entry -> %unr probability is 0x00000001 / 0x80000000 = 0.00%
470;
471entry:
472  %cond = icmp eq i32 %a, 42
473  br i1 %cond, label %exit, label %unr, !prof !4
474
475
476unr:
477  unreachable
478
479exit:
480  ret i32 %b
481}
482
483!4 = !{!"branch_weights", i32 0, i32 1}
484
485define i32 @test_unreachable_with_prof_equal(i32 %a, i32 %b) {
486; CHECK-LABEL: 'test_unreachable_with_prof_equal'
487; CHECK-NEXT:  ---- Branch Probabilities ----
488; CHECK-NEXT:    edge %entry -> %exit probability is 0x7fffffff / 0x80000000 = 100.00% [HOT edge]
489; CHECK-NEXT:    edge %entry -> %unr probability is 0x00000001 / 0x80000000 = 0.00%
490;
491entry:
492  %cond = icmp eq i32 %a, 42
493  br i1 %cond, label %exit, label %unr, !prof !5
494
495
496unr:
497  unreachable
498
499exit:
500  ret i32 %b
501}
502
503!5 = !{!"branch_weights", i32 2147483647, i32 1}
504
505define i32 @test_unreachable_with_prof_zero(i32 %a, i32 %b) {
506; CHECK-LABEL: 'test_unreachable_with_prof_zero'
507; CHECK-NEXT:  ---- Branch Probabilities ----
508; CHECK-NEXT:    edge %entry -> %exit probability is 0x7fffffff / 0x80000000 = 100.00% [HOT edge]
509; CHECK-NEXT:    edge %entry -> %unr probability is 0x00000001 / 0x80000000 = 0.00%
510;
511entry:
512  %cond = icmp eq i32 %a, 42
513  br i1 %cond, label %exit, label %unr, !prof !6
514
515
516unr:
517  unreachable
518
519exit:
520  ret i32 %b
521}
522
523!6 = !{!"branch_weights", i32 0, i32 0}
524
525define i32 @test_unreachable_with_prof_less(i32 %a, i32 %b) {
526; CHECK-LABEL: 'test_unreachable_with_prof_less'
527; CHECK-NEXT:  ---- Branch Probabilities ----
528; CHECK-NEXT:    edge %entry -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
529; CHECK-NEXT:    edge %entry -> %unr probability is 0x00000000 / 0x80000000 = 0.00%
530;
531entry:
532  %cond = icmp eq i32 %a, 42
533  br i1 %cond, label %exit, label %unr, !prof !7
534
535
536unr:
537  unreachable
538
539exit:
540  ret i32 %b
541}
542
543!7 = !{!"branch_weights", i32 1, i32 0}
544
545define i32 @test_unreachable_with_switch_prof1(i32 %i, i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
546; CHECK-LABEL: 'test_unreachable_with_switch_prof1'
547; CHECK-NEXT:  ---- Branch Probabilities ----
548; CHECK-NEXT:    edge %entry -> %case_a probability is 0x00000001 / 0x80000000 = 0.00%
549; CHECK-NEXT:    edge %entry -> %case_b probability is 0x06bca1af / 0x80000000 = 5.26%
550; CHECK-NEXT:    edge %entry -> %case_c probability is 0x6bca1af3 / 0x80000000 = 84.21% [HOT edge]
551; CHECK-NEXT:    edge %entry -> %case_d probability is 0x06bca1af / 0x80000000 = 5.26%
552; CHECK-NEXT:    edge %entry -> %case_e probability is 0x06bca1af / 0x80000000 = 5.26%
553; CHECK-NEXT:    edge %case_b -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
554; CHECK-NEXT:    edge %case_c -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
555; CHECK-NEXT:    edge %case_d -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
556; CHECK-NEXT:    edge %case_e -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
557;
558entry:
559  switch i32 %i, label %case_a [
560  i32 1, label %case_b
561  i32 2, label %case_c
562  i32 3, label %case_d
563  i32 4, label %case_e ], !prof !8
564; Reachable probabilities keep their relation: 4/64/4/4 = 5.26% / 84.21% / 5.26% / 5.26%.
565
566case_a:
567  unreachable
568
569case_b:
570  br label %exit
571
572case_c:
573  br label %exit
574
575case_d:
576  br label %exit
577
578case_e:
579  br label %exit
580
581exit:
582  %result = phi i32 [ %b, %case_b ],
583  [ %c, %case_c ],
584  [ %d, %case_d ],
585  [ %e, %case_e ]
586  ret i32 %result
587}
588
589!8 = !{!"branch_weights", i32 4, i32 4, i32 64, i32 4, i32 4}
590
591define i32 @test_unreachable_with_switch_prof2(i32 %i, i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
592; CHECK-LABEL: 'test_unreachable_with_switch_prof2'
593; CHECK-NEXT:  ---- Branch Probabilities ----
594; CHECK-NEXT:    edge %entry -> %case_a probability is 0x00000001 / 0x80000000 = 0.00%
595; CHECK-NEXT:    edge %entry -> %case_b probability is 0x00000001 / 0x80000000 = 0.00%
596; CHECK-NEXT:    edge %entry -> %case_c probability is 0x71c71c71 / 0x80000000 = 88.89% [HOT edge]
597; CHECK-NEXT:    edge %entry -> %case_d probability is 0x071c71c7 / 0x80000000 = 5.56%
598; CHECK-NEXT:    edge %entry -> %case_e probability is 0x071c71c7 / 0x80000000 = 5.56%
599; CHECK-NEXT:    edge %case_c -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
600; CHECK-NEXT:    edge %case_d -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
601; CHECK-NEXT:    edge %case_e -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
602;
603entry:
604  switch i32 %i, label %case_a [ i32 1, label %case_b
605  i32 2, label %case_c
606  i32 3, label %case_d
607  i32 4, label %case_e ], !prof !9
608; Reachable probabilities keep their relation: 64/4/4 = 88.89% / 5.56% / 5.56%.
609
610
611case_a:
612  unreachable
613
614case_b:
615  unreachable
616
617case_c:
618  br label %exit
619
620case_d:
621  br label %exit
622
623case_e:
624  br label %exit
625
626exit:
627  %result = phi i32 [ %c, %case_c ],
628  [ %d, %case_d ],
629  [ %e, %case_e ]
630  ret i32 %result
631}
632
633!9 = !{!"branch_weights", i32 4, i32 4, i32 64, i32 4, i32 4}
634
635define i32 @test_unreachable_with_switch_prof3(i32 %i, i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
636; CHECK-LABEL: 'test_unreachable_with_switch_prof3'
637; CHECK-NEXT:  ---- Branch Probabilities ----
638; CHECK-NEXT:    edge %entry -> %case_a probability is 0x00000000 / 0x80000000 = 0.00%
639; CHECK-NEXT:    edge %entry -> %case_b probability is 0x00000001 / 0x80000000 = 0.00%
640; CHECK-NEXT:    edge %entry -> %case_c probability is 0x71c71c71 / 0x80000000 = 88.89% [HOT edge]
641; CHECK-NEXT:    edge %entry -> %case_d probability is 0x071c71c7 / 0x80000000 = 5.56%
642; CHECK-NEXT:    edge %entry -> %case_e probability is 0x071c71c7 / 0x80000000 = 5.56%
643; CHECK-NEXT:    edge %case_c -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
644; CHECK-NEXT:    edge %case_d -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
645; CHECK-NEXT:    edge %case_e -> %exit probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
646;
647entry:
648  switch i32 %i, label %case_a [ i32 1, label %case_b
649  i32 2, label %case_c
650  i32 3, label %case_d
651  i32 4, label %case_e ], !prof !10
652; Reachable probabilities keep their relation: 64/4/4 = 88.89% / 5.56% / 5.56%.
653
654case_a:
655  unreachable
656
657case_b:
658  unreachable
659
660case_c:
661  br label %exit
662
663case_d:
664  br label %exit
665
666case_e:
667  br label %exit
668
669exit:
670  %result = phi i32 [ %c, %case_c ],
671  [ %d, %case_d ],
672  [ %e, %case_e ]
673  ret i32 %result
674}
675
676!10 = !{!"branch_weights", i32 0, i32 4, i32 64, i32 4, i32 4}
677
678define i32 @test_unreachable_with_switch_prof4(i32 %i, i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
679; CHECK-LABEL: 'test_unreachable_with_switch_prof4'
680; CHECK-NEXT:  ---- Branch Probabilities ----
681; CHECK-NEXT:    edge %entry -> %case_a probability is 0x1999999a / 0x80000000 = 20.00%
682; CHECK-NEXT:    edge %entry -> %case_b probability is 0x1999999a / 0x80000000 = 20.00%
683; CHECK-NEXT:    edge %entry -> %case_c probability is 0x1999999a / 0x80000000 = 20.00%
684; CHECK-NEXT:    edge %entry -> %case_d probability is 0x1999999a / 0x80000000 = 20.00%
685; CHECK-NEXT:    edge %entry -> %case_e probability is 0x1999999a / 0x80000000 = 20.00%
686;
687entry:
688  switch i32 %i, label %case_a [ i32 1, label %case_b
689  i32 2, label %case_c
690  i32 3, label %case_d
691  i32 4, label %case_e ], !prof !11
692
693case_a:
694  unreachable
695
696case_b:
697  unreachable
698
699case_c:
700  unreachable
701
702case_d:
703  unreachable
704
705case_e:
706  unreachable
707
708}
709
710!11 = !{!"branch_weights", i32 0, i32 4, i32 64, i32 4, i32 4}
711