xref: /llvm-project/llvm/test/Transforms/SampleProfile/profile-inference-islands.ll (revision f72b76cde5a36bcf1bd8a9f5ffa69e4c9d9f318d)
1; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-islands.prof -S -o %t
2; RUN: FileCheck %s < %t -check-prefix=CHECK-ENTRY-COUNT
3; RUN: opt < %t -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s
4
5
6; The test contains an isolated flow component ("island") that needs to be
7; reconnected to the entry point via edges with a positive flow.
8; The corresponding CFG is shown below:
9;
10; +--------+     +--------+     +----------+
11; | b6 [1] | <-- | b4 [1] | <-- |  b1 [1]  |
12; +--------+     +--------+     +----------+
13;                  |              |
14;                  |              |
15;                  v              v
16;                +--------+     +----------+
17;                | b5 [0] |     | b2 [100] | <+
18;                +--------+     +----------+  |
19;                                 |           |
20;                                 |           |
21;                                 v           |
22;                               +----------+  |
23;                               | b3 [100] | -+
24;                               +----------+
25;                                 |
26;                                 |
27;                                 v
28;                               +----------+
29;                               |  b7 [0]  |
30;                               +----------+
31
32
33; Function Attrs: nounwind uwtable
34define dso_local i32 @islands_1(i32 %0, i32 %1) #0 {
35b1:
36  call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 1, i32 0, i64 -1)
37  %cmp = icmp ne i32 %0, 0
38  br i1 %cmp, label %b2, label %b4
39; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 2
40
41b2:
42  call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 2, i32 0, i64 -1)
43  br label %b3
44; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 101
45
46b3:
47  call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 3, i32 0, i64 -1)
48  br i1 %cmp, label %b2, label %b7
49; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 101
50
51b4:
52  call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 4, i32 0, i64 -1)
53  br i1 %cmp, label %b5, label %b6
54; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 1
55
56b5:
57  call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 5, i32 0, i64 -1)
58  ret i32 %1
59; CHECK: - b5: float = {{.*}}, int = {{.*}}, count = 0
60
61b6:
62  call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 6, i32 0, i64 -1)
63  ret i32 %1
64; CHECK: - b6: float = {{.*}}, int = {{.*}}, count = 1
65
66b7:
67  call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 7, i32 0, i64 -1)
68  ret i32 %1
69; CHECK: - b7: float = {{.*}}, int = {{.*}}, count = 1
70
71}
72
73; Another test with an island.
74;
75;  +----------+
76;  |  b1 [0]  |
77;  +----------+
78;   |
79;   |
80;   v
81;  +----------+
82;  | b2 [100] | <+
83;  +----------+  |
84;   |            |
85;   |            |
86;   v            |
87;  +----------+  |
88;  | b3 [100] | -+
89;  +----------+
90;   |
91;   |
92;   v
93;  +----------+
94;  |  b4 [0]  |
95;  +----------+
96
97; Function Attrs: nounwind uwtable
98define dso_local i32 @islands_2(i32 %0, i32 %1) #1 {
99b1:
100  call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 1, i32 0, i64 -1)
101  %cmp = icmp ne i32 %0, 0
102  br label %b2
103; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 1
104
105b2:
106  call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 2, i32 0, i64 -1)
107  br label %b3
108; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 10001
109
110b3:
111  call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 3, i32 0, i64 -1)
112  br i1 %cmp, label %b2, label %b4
113; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 10001
114
115b4:
116  call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 4, i32 0, i64 -1)
117  ret i32 %1
118; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 1
119}
120
121
122; The test verifies that the island is connected to the entry block via a
123; cheapest path (that is, passing through blocks with large counts).
124;
125; +---------+     +---------+     +----------+     +--------+
126; | b8 [10] | <-- | b3 [10] | <-- | b1 [10]  | --> | b4 [0] |
127; +---------+     +---------+     +----------+     +--------+
128;                   |               |                |
129;                   |               |                |
130;                   |               v                |
131;                   |             +----------+       |
132;                   |             |  b2 [0]  |       |
133;                   |             +----------+       |
134;                   |               |                |
135;                   |               |                |
136;                   |               v                v
137;                   |             +-------------------------+
138;                   +-----------> |        b5 [100]         |
139;                                 +-------------------------+
140;                                   |           ^
141;                                   |           |
142;                                   v           |
143;                                 +----------+  |
144;                                 | b6 [100] | -+
145;                                 +----------+
146;                                   |
147;                                   |
148;                                   v
149;                                 +----------+
150;                                 |  b7 [0]  |
151;                                 +----------+
152
153; Function Attrs: nounwind uwtable
154define dso_local i32 @islands_3(i32 %0, i32 %1) #1 {
155b1:
156  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 1, i32 0, i64 -1)
157  %cmp = icmp ne i32 %0, 0
158  switch i32 %1, label %b2 [
159    i32 1, label %b3
160    i32 2, label %b4
161  ]
162; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 11
163
164b2:
165  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 2, i32 0, i64 -1)
166  br label %b5
167; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 0
168
169b3:
170  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 3, i32 0, i64 -1)
171  br i1 %cmp, label %b8, label %b5
172; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 11
173
174b4:
175  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 4, i32 0, i64 -1)
176  ret i32 %1
177; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 0
178
179b5:
180  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 5, i32 0, i64 -1)
181  br label %b6
182; CHECK: - b5: float = {{.*}}, int = {{.*}}, count = 1001
183
184b6:
185  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 6, i32 0, i64 -1)
186  br i1 %cmp, label %b7, label %b5
187; CHECK: - b6: float = {{.*}}, int = {{.*}}, count = 1001
188
189b7:
190  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 7, i32 0, i64 -1)
191  ret i32 %1
192; CHECK: - b7: float = {{.*}}, int = {{.*}}, count = 1
193
194b8:
195  call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 8, i32 0, i64 -1)
196  ret i32 %1
197; CHECK: - b8: float = {{.*}}, int = {{.*}}, count = 10
198}
199
200declare void @llvm.pseudoprobe(i64, i64, i32, i64) #2
201
202attributes #0 = { noinline nounwind uwtable "use-sample-profile"}
203attributes #1 = { noinline nounwind uwtable "use-sample-profile"}
204attributes #2 = { nounwind }
205
206!llvm.pseudo_probe_desc = !{!7, !8}
207
208!7 = !{i64 -5646793257986063976, i64 120879332589, !"islands_1"}
209!8 = !{i64 -7683376842751444845, i64 69495280403, !"islands_2"}
210!9 = !{i64 -9095645063288297061, i64 156608410269, !"islands_3"}
211
212; CHECK-ENTRY-COUNT: = !{!"function_entry_count", i64 2}
213