xref: /llvm-project/llvm/test/Analysis/BranchProbabilityInfo/unreachable.ll (revision 1469d82e1cb3edc939d6b93089046edfef0cf36c)
1; RUN: opt < %s -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s
2
3declare void @bar() cold
4
5; Both 'l1' and 'r1' has one edge leading to 'cold' and another one to
6; 'unreachable' blocks. Check that 'cold' paths are preferred. Also ensure both
7; paths from 'entry' block are equal.
8define void @test1(i32 %0, i1 %arg) {
9;CHECK: edge %entry -> %l1 probability is 0x40000000 / 0x80000000 = 50.00%
10;CHECK: edge %entry -> %r1 probability is 0x40000000 / 0x80000000 = 50.00%
11;CHECK: edge %l1 -> %cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
12;CHECK: edge %l1 -> %unreached probability is 0x00000000 / 0x80000000 = 0.00%
13;CHECK: edge %r1 -> %unreached probability is 0x00000000 / 0x80000000 = 0.00%
14;CHECK: edge %r1 -> %cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
15
16entry:
17  br i1 %arg, label %l1, label %r1
18
19l1:
20  br i1 %arg, label %cold, label %unreached
21
22r1:
23  br i1 %arg, label %unreached, label %cold
24
25unreached:
26  unreachable
27
28cold:
29  call void @bar()
30  ret void
31}
32
33; Both edges of 'l1' leads to 'cold' blocks while one edge of 'r1' leads to
34; 'unreachable' block. Check that 'l1' has 50/50 while 'r1' has 0/100
35; distributuion. Also ensure both paths from 'entry' block are equal.
36define void @test2(i32 %0, i1 %arg) {
37;CHECK: edge %entry -> %l1 probability is 0x40000000 / 0x80000000 = 50.00%
38;CHECK: edge %entry -> %r1 probability is 0x40000000 / 0x80000000 = 50.00%
39;CHECK: edge %l1 -> %cold probability is 0x40000000 / 0x80000000 = 50.00%
40;CHECK: edge %l1 -> %cold2 probability is 0x40000000 / 0x80000000 = 50.00%
41;CHECK: edge %r1 -> %unreached probability is 0x00000000 / 0x80000000 = 0.00%
42;CHECK: edge %r1 -> %cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
43
44entry:
45  br i1 %arg, label %l1, label %r1
46
47l1:
48  br i1 %arg, label %cold, label %cold2
49
50r1:
51  br i1 %arg, label %unreached, label %cold
52
53unreached:
54  unreachable
55
56cold:
57  call void @bar()
58  ret void
59
60cold2:
61  call void @bar()
62  ret void
63}
64
65; Both edges of 'r1' leads to 'unreachable' blocks while one edge of 'l1' leads to
66; 'cold' block. Ensure that path leading to 'cold' block is preferred.
67define void @test3(i32 %0, i1 %arg) {
68;CHECK: edge %entry -> %l1 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
69;CHECK: edge %entry -> %r1 probability is 0x00000000 / 0x80000000 = 0.00%
70;CHECK: edge %l1 -> %cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
71;CHECK: edge %l1 -> %unreached probability is 0x00000000 / 0x80000000 = 0.00%
72;CHECK: edge %r1 -> %unreached probability is 0x40000000 / 0x80000000 = 50.00%
73;CHECK: edge %r1 -> %unreached2 probability is 0x40000000 / 0x80000000 = 50.00%
74
75entry:
76  br i1 %arg, label %l1, label %r1
77
78l1:
79  br i1 %arg, label %cold, label %unreached
80
81r1:
82  br i1 %arg, label %unreached, label %unreached2
83
84unreached:
85  unreachable
86
87unreached2:
88  unreachable
89
90cold:
91  call void @bar()
92  ret void
93}
94
95; Left edge of 'entry' leads to 'cold' block while right edge is 'normal' continuation.
96; Check that we able to propagate 'cold' weight to 'entry' block. Also ensure
97; both edges from 'l1' are equally likely.
98define void @test4(i32 %0, i1 %arg) {
99;CHECK: edge %entry -> %l1 probability is 0x078780e3 / 0x80000000 = 5.88%
100;CHECK: edge %entry -> %r1 probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]
101;CHECK: edge %l1 -> %l2 probability is 0x40000000 / 0x80000000 = 50.00%
102;CHECK: edge %l1 -> %r2 probability is 0x40000000 / 0x80000000 = 50.00%
103;CHECK: edge %l2 -> %to.cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
104;CHECK: edge %r2 -> %to.cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
105;CHECK: edge %to.cold -> %cold probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
106
107entry:
108  br i1 %arg, label %l1, label %r1
109
110l1:
111  br i1 %arg, label %l2, label %r2
112
113l2:
114  br label %to.cold
115
116r2:
117  br label %to.cold
118
119to.cold:
120 br label %cold
121
122r1:
123 ret void
124
125cold:
126  call void @bar()
127  ret void
128}
129
130; Check that most likely path from 'entry' to 'l2' through 'r1' is preferred.
131define void @test5(i32 %0, i1 %arg) {
132;CHECK: edge %entry -> %cold probability is 0x078780e3 / 0x80000000 = 5.88%
133;CHECK: edge %entry -> %r1 probability is 0x78787f1d / 0x80000000 = 94.12% [HOT edge]
134;CHECK: edge %cold -> %l2 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
135;CHECK: edge %r1 -> %l2 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
136;CHECK: edge %r1 -> %unreached probability is 0x00000000 / 0x80000000 = 0.00%
137
138entry:
139  br i1 %arg, label %cold, label %r1
140
141cold:
142  call void @bar()
143  br label %l2
144
145r1:
146  br i1 %arg, label %l2, label %unreached
147
148l2:
149  ret void
150
151unreached:
152  unreachable
153}
154