xref: /llvm-project/llvm/test/Transforms/SampleProfile/profile-inference-even-count-distribution.ll (revision bb6497ffa6a88d1b3a32101d9b6519094d75ef2a)
1; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-even-count-distribution.prof | opt -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s
2; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-even-count-distribution.prof | opt -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s --check-prefix=CHECK2
3
4; The test verifies that counts are evenly distributed among branches with
5; equal weights.
6;
7; +-----------+     +-----------+
8; | b3 [0]    | <-- | b1 [1000] |
9; +-----------+     +-----------+
10;   |                 |
11;   |                 |
12;   |                 v
13;   |               +-----------+
14;   |               | b2 [0]    |
15;   |               +-----------+
16;   |                 |
17;   |                 |
18;   |                 v
19;   |               +-----------+
20;   +-------------> | b4 [1000] |
21;                   +-----------+
22
23@yydebug = dso_local global i32 0, align 4
24
25; Function Attrs: nounwind uwtable
26define dso_local i32 @foo1(i32 %0, i32 %1) #0 {
27b11:
28  call void @llvm.pseudoprobe(i64 7682762345278052905, i64 1, i32 0, i64 -1)
29  %cmp = icmp ne i32 %0, 0
30  br i1 %cmp, label %b12, label %b13
31; CHECK:  edge %b11 -> %b12 probability is 0x40000000 / 0x80000000 = 50.00%
32; CHECK:  edge %b11 -> %b13 probability is 0x40000000 / 0x80000000 = 50.00%
33; CHECK2: - b11: float = {{.*}}, int = {{.*}}, count = 1000
34
35b12:
36  call void @llvm.pseudoprobe(i64 7682762345278052905, i64 2, i32 0, i64 -1)
37  br label %b14
38; CHECK2: - b12: float = {{.*}}, int = {{.*}}, count = 500
39
40b13:
41  call void @llvm.pseudoprobe(i64 7682762345278052905, i64 3, i32 0, i64 -1)
42  br label %b14
43; CHECK2: - b13: float = {{.*}}, int = {{.*}}, count = 500
44
45b14:
46  call void @llvm.pseudoprobe(i64 7682762345278052905, i64 4, i32 0, i64 -1)
47  ret i32 %1
48; CHECK2: - b14: float = {{.*}}, int = {{.*}}, count = 1000
49}
50
51
52; The test verifies that counts are evenly distributed when the entry basic
53; block is dangling.
54;
55; +-----------+
56; |  b1 [?]   | -+
57; +-----------+  |
58;   |            |
59;   |            |
60;   v            |
61; +-----------+  |
62; |  b2 [?]   |  |
63; +-----------+  |
64;   |            |
65;   |            |
66;   v            |
67; +-----------+  |
68; | b3 [1000] | <+
69; +-----------+
70
71define dso_local i32 @foo2(i32 %0, i32 %1) #0 {
72b21:
73  call void @llvm.pseudoprobe(i64 2494702099028631698, i64 1, i32 0, i64 -1)
74  %cmp = icmp ne i32 %0, 0
75  br i1 %cmp, label %b22, label %b23
76; CHECK:  edge %b21 -> %b22 probability is 0x40000000 / 0x80000000 = 50.00%
77; CHECK:  edge %b21 -> %b23 probability is 0x40000000 / 0x80000000 = 50.00%
78; CHECK2: - b21: float = {{.*}}, int = {{.*}}, count = 1000
79
80b22:
81  call void @llvm.pseudoprobe(i64 2494702099028631698, i64 2, i32 0, i64 -1)
82  br label %b23
83; CHECK2: - b22: float = {{.*}}, int = {{.*}}, count = 500
84
85b23:
86  call void @llvm.pseudoprobe(i64 2494702099028631698, i64 3, i32 0, i64 -1)
87  ret i32 %1
88; CHECK2: - b23: float = {{.*}}, int = {{.*}}, count = 1000
89
90}
91
92; The test verifies even count distribution in the presence of multiple sinks.
93;
94;                +-----------+
95;                | b1 [1000] |
96;                +-----------+
97;                  |
98;                  |
99;                  v
100;                +-----------+
101;                |  b2 [?]   | -+
102;                +-----------+  |
103;                  |            |
104;                  |            |
105;                  v            |
106; +--------+     +-----------+  |
107; | b5 [?] | <-- |  b3 [?]   |  |
108; +--------+     +-----------+  |
109;   |              |            |
110;   |              |            |
111;   |              v            |
112;   |            +-----------+  |
113;   |            | b4 [1000] | <+
114;   |            +-----------+
115;   |              |
116;   |              |
117;   |              v
118;   |            +-----------+
119;   +----------> | b6 [1000] |
120;                +-----------+
121;
122
123define dso_local i32 @foo3(i32 %0, i32 %1) #0 {
124b31:
125  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 1, i32 0, i64 -1)
126  %cmp = icmp ne i32 %0, 0
127  br label %b32
128; CHECK2: - b31: float = {{.*}}, int = {{.*}}, count = 1000
129
130b32:
131  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 2, i32 0, i64 -1)
132  br i1 %cmp, label %b33, label %b34
133; CHECK:  edge %b32 -> %b33 probability is 0x40000000 / 0x80000000 = 50.00%
134; CHECK:  edge %b32 -> %b34 probability is 0x40000000 / 0x80000000 = 50.00%
135; CHECK2: - b32: float = {{.*}}, int = {{.*}}, count = 1000
136
137b33:
138  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 3, i32 0, i64 -1)
139  br i1 %cmp, label %b35, label %b34
140; CHECK:  edge %b33 -> %b35 probability is 0x00000000 / 0x80000000 = 0.00%
141; CHECK:  edge %b33 -> %b34 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
142; CHECK2: - b33: float = {{.*}}, int = {{.*}}, count = 500
143
144b34:
145  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 4, i32 0, i64 -1)
146  br label %b36
147; CHECK2: - b34: float = {{.*}}, int = {{.*}}, count = 1000
148
149b35:
150  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 5, i32 0, i64 -1)
151  br label %b36
152; CHECK2: - b35: float = {{.*}}, int = {{.*}}, count = 0
153
154b36:
155  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 6, i32 0, i64 -1)
156  ret i32 %1
157; CHECK2: - b36: float = {{.*}}, int = {{.*}}, count = 1000
158}
159
160
161
162; Function Attrs: inaccessiblememonly nounwind willreturn
163declare void @llvm.pseudoprobe(i64, i64, i32, i64) #4
164
165attributes #0 = { noinline nounwind uwtable "use-sample-profile" }
166attributes #4 = { inaccessiblememonly nounwind willreturn }
167
168!llvm.pseudo_probe_desc = !{!7, !8, !9, !10}
169
170!7 = !{i64 7682762345278052905, i64 157181141624, !"foo1", null}
171!8 = !{i64 2494702099028631698, i64 208782362068, !"foo2", null}
172!9 = !{i64 -7908226060800700466, i64 189901498683, !"foo3", null}
173!10 = !{i64 -6882312132165544686, i64 241030178952, !"foo4", null}
174