1; Test the static branch probability heuristics for no-return functions.
2; RUN: opt < %s -analyze -branch-prob | FileCheck %s
3
4declare void @abort() noreturn
5
6define i32 @test1(i32 %a, i32 %b) {
7; CHECK: Printing analysis {{.*}} for function 'test1'
8entry:
9  %cond = icmp eq i32 %a, 42
10  br i1 %cond, label %exit, label %abort
11; CHECK: edge entry -> exit probability is 1048575 / 1048576
12; CHECK: edge entry -> abort probability is 1 / 1048576
13
14abort:
15  call void @abort() noreturn
16  unreachable
17
18exit:
19  ret i32 %b
20}
21
22define i32 @test2(i32 %a, i32 %b) {
23; CHECK: Printing analysis {{.*}} for function 'test2'
24entry:
25  switch i32 %a, label %exit [i32 1, label %case_a
26                              i32 2, label %case_b
27                              i32 3, label %case_c
28                              i32 4, label %case_d]
29; CHECK: edge entry -> exit probability is 1048575 / 1048579
30; CHECK: edge entry -> case_a probability is 1 / 1048579
31; CHECK: edge entry -> case_b probability is 1 / 1048579
32; CHECK: edge entry -> case_c probability is 1 / 1048579
33; CHECK: edge entry -> case_d probability is 1 / 1048579
34
35case_a:
36  br label %case_b
37
38case_b:
39  br label %case_c
40
41case_c:
42  br label %case_d
43
44case_d:
45  call void @abort() noreturn
46  unreachable
47
48exit:
49  ret i32 %b
50}
51
52define i32 @test3(i32 %a, i32 %b) {
53; CHECK: Printing analysis {{.*}} for function 'test3'
54; Make sure we unify across multiple conditional branches.
55entry:
56  %cond1 = icmp eq i32 %a, 42
57  br i1 %cond1, label %exit, label %dom
58; CHECK: edge entry -> exit probability is 1048575 / 1048576
59; CHECK: edge entry -> dom probability is 1 / 1048576
60
61dom:
62  %cond2 = icmp ult i32 %a, 42
63  br i1 %cond2, label %idom1, label %idom2
64; CHECK: edge dom -> idom1 probability is 1 / 2
65; CHECK: edge dom -> idom2 probability is 1 / 2
66
67idom1:
68  br label %abort
69
70idom2:
71  br label %abort
72
73abort:
74  call void @abort() noreturn
75  unreachable
76
77exit:
78  ret i32 %b
79}
80