File: profile-inference-rebalance-large.ll

package info (click to toggle)
llvm-toolchain-14 1%3A14.0.6-12
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,496,180 kB
  • sloc: cpp: 5,593,972; ansic: 986,872; asm: 585,869; python: 184,223; objc: 72,530; lisp: 31,119; f90: 27,793; javascript: 9,780; pascal: 9,762; sh: 9,482; perl: 7,468; ml: 5,432; awk: 3,523; makefile: 2,538; xml: 953; cs: 573; fortran: 567
file content (387 lines) | stat: -rw-r--r-- 15,107 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-rebalance-large.prof | opt -analyze -branch-prob -enable-new-pm=0 | FileCheck %s
; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-rebalance-large.prof | opt -analyze -block-freq  -enable-new-pm=0 | FileCheck %s --check-prefix=CHECK2

; The test verifies that counts can rebalanced in switch statements that contain
; both 'known' and 'unknown' basic blocks.
;
;                      +---------+
;   +----------------- | b15 [?] |
;   |                  +---------+
;   |                    ^
;   |                    |
;   |                    |
;   |  +---------+     +--------------+     +---------+
;   |  | b13 [?] | <-- |  b11 [3300]  | --> | b14 [?] |
;   |  +---------+     +--------------+     +---------+
;   |    |               |          |         |
;   |    |               |          |         |
;   |    |               v          |         |
;   |    |             +---------+  |         |
;   |    |             | b12 [0] |  |         |
;   |    |             +---------+  |         |
;   |    |               |          |         |
;   |    |               |          |         |
;   |    |               v          v         |
;   |    |             +--------------+       |
;   |    +-----------> |              | <-----+
;   |                  |  b16 [3300]  |
;   +----------------> |              |
;                      +--------------+

@yydebug = dso_local global i32 0, align 4

; Function Attrs: nounwind uwtable
define dso_local i32 @foo1(i32 %0, i32 %1) #0 {
b11:
  call void @llvm.pseudoprobe(i64 7682762345278052905, i64 1, i32 0, i64 -1)
  %cmp = icmp ne i32 %0, 0
  switch i32 %1, label %b12 [
    i32 1, label %b13
    i32 2, label %b14
    i32 3, label %b15
    i32 4, label %b16
  ]
; CHECK:  edge b11 -> b12 probability is 0x00000000 / 0x80000000 = 0.00%
; CHECK:  edge b11 -> b13 probability is 0x20000000 / 0x80000000 = 25.00%
; CHECK:  edge b11 -> b14 probability is 0x20000000 / 0x80000000 = 25.00%
; CHECK:  edge b11 -> b15 probability is 0x20000000 / 0x80000000 = 25.00%
; CHECK:  edge b11 -> b16 probability is 0x20000000 / 0x80000000 = 25.00%
; CHECK2: - b11: float = {{.*}}, int = {{.*}}, count = 3300

b12:
  call void @llvm.pseudoprobe(i64 7682762345278052905, i64 2, i32 0, i64 -1)
  br label %b16
; CHECK2: - b12: float = {{.*}}, int = {{.*}}, count = 0

b13:
  call void @llvm.pseudoprobe(i64 7682762345278052905, i64 3, i32 0, i64 -1)
  br label %b16
; CHECK2: - b13: float = {{.*}}, int = {{.*}}, count = 825

b14:
  call void @llvm.pseudoprobe(i64 7682762345278052905, i64 4, i32 0, i64 -1)
  br label %b16
; CHECK2: - b14: float = {{.*}}, int = {{.*}}, count = 825

b15:
  call void @llvm.pseudoprobe(i64 7682762345278052905, i64 5, i32 0, i64 -1)
  br label %b16
; CHECK2: - b15: float = {{.*}}, int = {{.*}}, count = 825

b16:
  call void @llvm.pseudoprobe(i64 7682762345278052905, i64 6, i32 0, i64 -1)
  ret i32 %1
; CHECK2: - b16: float = {{.*}}, int = {{.*}}, count = 3300
}


; The test verifies that counts can rebalanced even when control-flow ends at
; a basic block with an unknown count.
;
;                 +-----------+
;                 | b21 [128] | -+
;                 +-----------+  |
;                   |            |
;                   v            |
;                 +-----------+  |
;                 | b22 [128] |  |
;                 +-----------+  |
;                   |            |
;                   v            |
;                 +-----------+  |
;   +------------ | b23 [128] | <+
;   |             +-----------+
;   |               |
;   v               v
; +---------+     +-----------+
; | b26 [?] | <-- | b24 [128] |
; +---------+     +-----------+
;   |               |
;   |               v
;   |             +-----------+
;   |             |  b25 [?]  |
;   |             +-----------+
;   |               |
;   |               v
;   |             +-----------+
;   +-----------> |  b27 [?]  | -+
;                 +-----------+  |
;                   |            |
;                   v            |
;                 +-----------+  |
;                 |  b28 [?]  |  |
;                 +-----------+  |
;                   |            |
;                   v            |
;                 +-----------+  |
;                 |  b29 [?]  | <+
;                 +-----------+

define dso_local i32 @foo2(i32 %0, i32 %1) #0 {
b21:
  call void @llvm.pseudoprobe(i64 2494702099028631698, i64 1, i32 0, i64 -1)
  %cmp = icmp ne i32 %0, 0
  br i1 %cmp, label %b22, label %b23
; CHECK:  edge b21 -> b22 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
; CHECK:  edge b21 -> b23 probability is 0x00000000 / 0x80000000 = 0.00%
; CHECK2: - b21: float = {{.*}}, int = {{.*}}, count = 128

b22:
  call void @llvm.pseudoprobe(i64 2494702099028631698, i64 2, i32 0, i64 -1)
  br label %b23

b23:
  call void @llvm.pseudoprobe(i64 2494702099028631698, i64 3, i32 0, i64 -1)
  br i1 %cmp, label %b24, label %b26
; CHECK:  edge b23 -> b24 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
; CHECK:  edge b23 -> b26 probability is 0x00000000 / 0x80000000 = 0.00%
; CHECK2: - b23: float = {{.*}}, int = {{.*}}, count = 128

b24:
  call void @llvm.pseudoprobe(i64 2494702099028631698, i64 4, i32 0, i64 -1)
  br i1 %cmp, label %b25, label %b26
; CHECK:  edge b24 -> b25 probability is 0x40000000 / 0x80000000 = 50.00%
; CHECK:  edge b24 -> b26 probability is 0x40000000 / 0x80000000 = 50.00%

b25:
  call void @llvm.pseudoprobe(i64 2494702099028631698, i64 5, i32 0, i64 -1)
  br label %b27
; CHECK2: - b25: float = {{.*}}, int = {{.*}}, count = 64

b26:
  call void @llvm.pseudoprobe(i64 2494702099028631698, i64 6, i32 0, i64 -1)
  br label %b27
; CHECK2: - b26: float = {{.*}}, int = {{.*}}, count = 64

b27:
  call void @llvm.pseudoprobe(i64 2494702099028631698, i64 7, i32 0, i64 -1)
  br i1 %cmp, label %b28, label %b29
; CHECK:  edge b27 -> b28 probability is 0x40000000 / 0x80000000 = 50.00%
; CHECK:  edge b27 -> b29 probability is 0x40000000 / 0x80000000 = 50.00%
; CHECK2: - b27: float = {{.*}}, int = {{.*}}, count = 128

b28:
  call void @llvm.pseudoprobe(i64 2494702099028631698, i64 8, i32 0, i64 -1)
  br label %b29
; CHECK2: - b28: float = {{.*}}, int = {{.*}}, count = 64

b29:
  call void @llvm.pseudoprobe(i64 2494702099028631698, i64 9, i32 0, i64 -1)
  ret i32 %1
; CHECK2: - b29: float = {{.*}}, int = {{.*}}, count = 128
}


; The test verifies a flexible mode of rebalancing in which some jumps to known
; basic blocks are ignored.
;
;                 +------------+
;                 | b31 [500]  |
;                 +------------+
;                   |
;                   v
; +---------+     +------------+
; | b33 [?] | <-- | b32 [1500] | <-----+
; +---------+     +------------+       |
;   |               |                  |
;   |               v                  |
;   |             +------------+     +-----------+
;   |             | b34 [1200] | --> | b36 [900] |
;   |             +------------+     +-----------+
;   |               |
;   |               v
;   |             +------------+
;   |             |  b35 [?]   |
;   |             +------------+
;   |               |
;   |               v
;   |             +------------+
;   +-----------> |  b37 [?]   | -+
;                 +------------+  |
;                   |             |
;                   v             |
;                 +------------+  |
;                 |  b38 [?]   |  |
;                 +------------+  |
;                   |             |
;                   v             |
;                 +------------+  |
;                 | b39 [500]  | <+
;                 +------------+
;

define dso_local i32 @foo3(i32 %0, i32 %1) #0 {
b31:
  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 1, i32 0, i64 -1)
  %cmp = icmp ne i32 %0, 0
  br label %b32
; CHECK2: - b31: float = {{.*}}, int = {{.*}}, count = 500

b32:
  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 2, i32 0, i64 -1)
  br i1 %cmp, label %b33, label %b34
; CHECK:  edge b32 -> b33 probability is 0x1999999a / 0x80000000 = 20.00%
; CHECK:  edge b32 -> b34 probability is 0x66666666 / 0x80000000 = 80.00%
; CHECK2: - b32: float = {{.*}}, int = {{.*}}, count = 1500

b33:
  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 3, i32 0, i64 -1)
  br label %b37
; CHECK2: - b33: float = {{.*}}, int = {{.*}}, count = 300

b34:
  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 4, i32 0, i64 -1)
  br i1 %cmp, label %b35, label %b36
; CHECK:  edge b34 -> b35 probability is 0x15555555 / 0x80000000 = 16.67%
; CHECK:  edge b34 -> b36 probability is 0x6aaaaaab / 0x80000000 = 83.33% [HOT edge]
; CHECK2: - b34: float = {{.*}}, int = {{.*}}, count = 1200

b35:
  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 5, i32 0, i64 -1)
  br label %b37
; CHECK2: - b35: float = {{.*}}, int = {{.*}}, count = 200

b36:
  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 6, i32 0, i64 -1)
  br label %b32
; CHECK2: - b36: float = {{.*}}, int = {{.*}}, count = 1000

b37:
  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 7, i32 0, i64 -1)
  br i1 %cmp, label %b38, label %b39
; CHECK:  edge b37 -> b38 probability is 0x40000000 / 0x80000000 = 50.00%
; CHECK:  edge b37 -> b39 probability is 0x40000000 / 0x80000000 = 50.00%
; CHECK2: - b37: float = {{.*}}, int = {{.*}}, count = 500

b38:
  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 8, i32 0, i64 -1)
  br label %b39
; CHECK2: - b38: float = {{.*}}, int = {{.*}}, count = 250

b39:
  call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 9, i32 0, i64 -1)
  ret i32 %1
; CHECK2: - b39: float = {{.*}}, int = {{.*}}, count = 500
}


; The test verifies that flow rebalancer can ignore 'unlikely' jumps.
;
;                            +-----------+
;                            | b41 [400] | -+
;                            +-----------+  |
;                              |            |
;                              |            |
;                              v            |
;                            +-----------+  |
;                            |  b42 [?]  |  |
;                            +-----------+  |
;                              |            |
;                              |            |
;                              v            v
; +---------++---------+     +---------------------------+     +---------++---------+
; | b48 [?] || b46 [?] | <-- |                           | --> | b47 [?] || b49 [?] |
; +---------++---------+     |                           |     +---------++---------+
;   |  ^       |             |                           |       |          ^
;   |  |       |             |         b43 [400]         |       |          |
;   |  +-------+-------------|                           |       |          |
;   |          |             |                           |       |          |
;   |          |             |                           | ------+----------+
;   |          |             +---------------------------+       |
;   |          |               |                 |               |
;   |          |               |                 |               |
;   |          |               v                 v               |
;   |          |             +-----------+     +---------+       |
;   |          |             |  b44 [?]  |     | b45 [?] |       |
;   |          |             +-----------+     +---------+       |
;   |          |               |                 |               |
;   |          |               |                 |               |
;   |          |               v                 v               |
;   |          |             +---------------------------+       |
;   |          +-----------> |                           | <-----+
;   |                        |        b410 [400]         |
;   |                        |                           |
;   +----------------------> |                           |
;                            +---------------------------+


define dso_local void @foo4(i32 %0, i32 %1) #0 {
b41:
  call void @llvm.pseudoprobe(i64 -6882312132165544686, i64 1, i32 0, i64 -1)
  %cmp = icmp ne i32 %0, 0
  br i1 %cmp, label %b42, label %b43
; CHECK:  edge b41 -> b42 probability is 0x40000000 / 0x80000000 = 50.00%
; CHECK:  edge b41 -> b43 probability is 0x40000000 / 0x80000000 = 50.00%
; CHECK2: - b41: float = {{.*}}, int = {{.*}}, count = 400

b42:
  call void @llvm.pseudoprobe(i64 -6882312132165544686, i64 2, i32 0, i64 -1)
  br label %b43
; CHECK2: - b42: float = {{.*}}, int = {{.*}}, count = 200

b43:
  call void @llvm.pseudoprobe(i64 -6882312132165544686, i64 3, i32 0, i64 -1)
  switch i32 %1, label %b49 [
    i32 1, label %b44
    i32 2, label %b45
    i32 3, label %b46
    i32 4, label %b47
    i32 5, label %b48
  ]
; CHECK:  edge b43 -> b49 probability is 0x00000000 / 0x80000000 = 0.00%
; CHECK:  edge b43 -> b44 probability is 0x1999999a / 0x80000000 = 20.00%
; CHECK:  edge b43 -> b45 probability is 0x1999999a / 0x80000000 = 20.00%
; CHECK:  edge b43 -> b46 probability is 0x1999999a / 0x80000000 = 20.00%
; CHECK:  edge b43 -> b47 probability is 0x1999999a / 0x80000000 = 20.00%
; CHECK:  edge b43 -> b48 probability is 0x1999999a / 0x80000000 = 20.00%
; CHECK2: - b43: float = {{.*}}, int = {{.*}}, count = 400

b44:
  call void @llvm.pseudoprobe(i64 -6882312132165544686, i64 4, i32 0, i64 -1)
  br label %b410
; CHECK2: - b44: float = {{.*}}, int = {{.*}}, count = 80

b45:
  call void @llvm.pseudoprobe(i64 -6882312132165544686, i64 5, i32 0, i64 -1)
  br label %b410
; CHECK2: - b45: float = {{.*}}, int = {{.*}}, count = 80

b46:
  call void @llvm.pseudoprobe(i64 -6882312132165544686, i64 6, i32 0, i64 -1)
  br label %b410
; CHECK2: - b46: float = {{.*}}, int = {{.*}}, count = 80

b47:
  call void @llvm.pseudoprobe(i64 -6882312132165544686, i64 7, i32 0, i64 -1)
  br label %b410
; CHECK2: - b47: float = {{.*}}, int = {{.*}}, count = 80

b48:
  call void @llvm.pseudoprobe(i64 -6882312132165544686, i64 8, i32 0, i64 -1)
  br label %b410
; CHECK2: - b48: float = {{.*}}, int = {{.*}}, count = 80

b49:
  call void @llvm.pseudoprobe(i64 -6882312132165544686, i64 9, i32 0, i64 -1)
  unreachable
; CHECK2: - b49: float = {{.*}}, int = {{.*}}, count = 0

b410:
  call void @llvm.pseudoprobe(i64 -6882312132165544686, i64 10, i32 0, i64 -1)
  ret void
; CHECK2: - b410: float = {{.*}}, int = {{.*}}, count = 400
}


; Function Attrs: inaccessiblememonly nounwind willreturn
declare void @llvm.pseudoprobe(i64, i64, i32, i64) #4

attributes #0 = { noinline nounwind uwtable "use-sample-profile" }
attributes #4 = { inaccessiblememonly nounwind willreturn }

!llvm.pseudo_probe_desc = !{!7, !8, !9, !10}

!7 = !{i64 7682762345278052905, i64 157181141624, !"foo1", null}
!8 = !{i64 2494702099028631698, i64 208782362068, !"foo2", null}
!9 = !{i64 -7908226060800700466, i64 189901498683, !"foo3", null}
!10 = !{i64 -6882312132165544686, i64 241030178952, !"foo4", null}