xref: /llvm-project/llvm/test/Transforms/SampleProfile/profile-inference-rebalance.ll (revision bb6497ffa6a88d1b3a32101d9b6519094d75ef2a)
1f72b76cdSArthur Eubanks; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-rebalance.prof | opt -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s
2f72b76cdSArthur Eubanks; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-rebalance.prof | opt -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s --check-prefix=CHECK2
393a2c291Sspupyrev
413d1364aSspupyrev; The test contains a "diamond" and a "triangle" that needs to be rebalanced
593a2c291Sspupyrev; after basic profile inference.
693a2c291Sspupyrev;
793a2c291Sspupyrev;                  +----------------+
893a2c291Sspupyrev;                  |    b11 [?]     |
993a2c291Sspupyrev;                  +----------------+
1093a2c291Sspupyrev;                    |
1193a2c291Sspupyrev;                    v
1293a2c291Sspupyrev; +----------+     +----------------+
1393a2c291Sspupyrev; | b13 [10] | <-- | b12 [65536]    |
1493a2c291Sspupyrev; +----------+     +----------------+
1593a2c291Sspupyrev;                    |
1693a2c291Sspupyrev;                    v
1793a2c291Sspupyrev; +----------+     +----------------+
1893a2c291Sspupyrev; | b16 [?]  | <-- | b14 [65536]    |
1993a2c291Sspupyrev; +----------+     +----------------+
2093a2c291Sspupyrev;   |                |
2193a2c291Sspupyrev;   |                v
2293a2c291Sspupyrev;   |              +----------------+
2393a2c291Sspupyrev;   |              |    b15 [?]     |
2493a2c291Sspupyrev;   |              +----------------+
2593a2c291Sspupyrev;   |                |
2693a2c291Sspupyrev;   |                v
2793a2c291Sspupyrev;   |              +----------------+
2893a2c291Sspupyrev;   +------------> | b17 [65536]  | -+
2993a2c291Sspupyrev;                  +----------------+  |
3093a2c291Sspupyrev;                    |                 |
3193a2c291Sspupyrev;                    v                 |
3293a2c291Sspupyrev;                  +----------------+  |
3393a2c291Sspupyrev;                  |    b18 [?]     |  |
3493a2c291Sspupyrev;                  +----------------+  |
3593a2c291Sspupyrev;                    |                 |
3693a2c291Sspupyrev;                    v                 |
3793a2c291Sspupyrev;                  +----------------+  |
3893a2c291Sspupyrev;                  | b19 [65536]    | <+
3993a2c291Sspupyrev;                  +----------------+
4093a2c291Sspupyrev;                    |
4193a2c291Sspupyrev;                    v
4293a2c291Sspupyrev;                  +----------------+
4393a2c291Sspupyrev;                  | b110 [65536]   |
4493a2c291Sspupyrev;                  +----------------+
4593a2c291Sspupyrev
4693a2c291Sspupyrev@yydebug = dso_local global i32 0, align 4
4793a2c291Sspupyrev
4893a2c291Sspupyrev; Function Attrs: nounwind uwtable
4993a2c291Sspupyrevdefine dso_local i32 @countMultipliers(i32 %0, i32 %1) #0 {
5093a2c291Sspupyrevb11:
5193a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 1, i32 0, i64 -1)
5293a2c291Sspupyrev  %cmp = icmp ne i32 %0, 0
5393a2c291Sspupyrev  br label %b12
5493a2c291Sspupyrev; CHECK2: - b11: float = {{.*}}, int = {{.*}}, count = 65546
5593a2c291Sspupyrev
5693a2c291Sspupyrevb12:
5793a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 2, i32 0, i64 -1)
5893a2c291Sspupyrev  br i1 %cmp, label %b14, label %b13
5993a2c291Sspupyrev; CHECK2: - b12: float = {{.*}}, int = {{.*}}, count = 65546
6093a2c291Sspupyrev
6193a2c291Sspupyrevb13:
6293a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 3, i32 0, i64 -1)
6393a2c291Sspupyrev  ret i32 %1
6493a2c291Sspupyrev; CHECK2: - b13: float = {{.*}}, int = {{.*}}, count = 10
6593a2c291Sspupyrev
6693a2c291Sspupyrevb14:
6793a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 4, i32 0, i64 -1)
6893a2c291Sspupyrev  br i1 %cmp, label %b15, label %b16
69*bb6497ffSMircea Trofin; CHECK:  edge %b14 -> %b15 probability is 0x40000000 / 0x80000000 = 50.00%
70*bb6497ffSMircea Trofin; CHECK:  edge %b14 -> %b16 probability is 0x40000000 / 0x80000000 = 50.00%
7193a2c291Sspupyrev; CHECK2: - b14: float = {{.*}}, int = {{.*}}, count = 65536
7293a2c291Sspupyrev
7393a2c291Sspupyrevb15:
7493a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 5, i32 0, i64 -1)
7593a2c291Sspupyrev  br label %b17
7693a2c291Sspupyrev; CHECK2: - b15: float = {{.*}}, int = {{.*}}, count = 32768
7793a2c291Sspupyrev
7893a2c291Sspupyrevb16:
7993a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 6, i32 0, i64 -1)
8093a2c291Sspupyrev  br label %b17
8193a2c291Sspupyrev; CHECK2: - b16: float = {{.*}}, int = {{.*}}, count = 32768
8293a2c291Sspupyrev
8393a2c291Sspupyrevb17:
8493a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 7, i32 0, i64 -1)
8593a2c291Sspupyrev  br i1 %cmp, label %b18, label %b19
86*bb6497ffSMircea Trofin; CHECK:  edge %b17 -> %b18 probability is 0x40000000 / 0x80000000 = 50.00%
87*bb6497ffSMircea Trofin; CHECK:  edge %b17 -> %b19 probability is 0x40000000 / 0x80000000 = 50.00%
8893a2c291Sspupyrev; CHECK2: - b17: float = {{.*}}, int = {{.*}}, count = 65536
8993a2c291Sspupyrev
9093a2c291Sspupyrevb18:
9193a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 8, i32 0, i64 -1)
9293a2c291Sspupyrev  br label %b19
9393a2c291Sspupyrev; CHECK2: - b18: float = {{.*}}, int = {{.*}}, count = 32768
9493a2c291Sspupyrev
9593a2c291Sspupyrevb19:
9693a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 9, i32 0, i64 -1)
9793a2c291Sspupyrev  br label %b110
9893a2c291Sspupyrev; CHECK2: - b19: float = {{.*}}, int = {{.*}}, count = 65536
9993a2c291Sspupyrev
10093a2c291Sspupyrevb110:
10193a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -5758218299531803684, i64 10, i32 0, i64 -1)
10293a2c291Sspupyrev  ret i32 %1
10393a2c291Sspupyrev; CHECK2: - b110: float = {{.*}}, int = {{.*}}, count = 65536
10493a2c291Sspupyrev}
10593a2c291Sspupyrev
10693a2c291Sspupyrev
10793a2c291Sspupyrev; The test contains a triangle comprised of dangling blocks.
10893a2c291Sspupyrev;
10993a2c291Sspupyrev;                     +-----------+
11093a2c291Sspupyrev;                     | b0 [2100] | -+
11193a2c291Sspupyrev;                     +-----------+  |
11293a2c291Sspupyrev;                       |            |
11393a2c291Sspupyrev;                       |            |
11493a2c291Sspupyrev;                       v            |
11593a2c291Sspupyrev;                     +-----------+  |
11693a2c291Sspupyrev;                  +- | b1 [2000] |  |
11793a2c291Sspupyrev;                  |  +-----------+  |
11893a2c291Sspupyrev;                  |    |            |
11993a2c291Sspupyrev;                  |    |            |
12093a2c291Sspupyrev;                  |    v            |
12193a2c291Sspupyrev; +--------+       |  +-----------+  |
12293a2c291Sspupyrev; | b4 [?] | <-----+- |  b2 [?]   |  |
12393a2c291Sspupyrev; +--------+       |  +-----------+  |
12493a2c291Sspupyrev;   |              |    |            |
12593a2c291Sspupyrev;   |              |    |            |
12693a2c291Sspupyrev;   |              |    v            |
12793a2c291Sspupyrev;   |              |  +-----------+  |
12893a2c291Sspupyrev;   |              +> |  b3 [?]   |  |
12993a2c291Sspupyrev;   |                 +-----------+  |
13093a2c291Sspupyrev;   |                   |            |
13193a2c291Sspupyrev;   |                   |            |
13293a2c291Sspupyrev;   |                   v            |
13393a2c291Sspupyrev;   |                 +-----------+  |
13493a2c291Sspupyrev;   +---------------> | b5 [2100] | <+
13593a2c291Sspupyrev;                     +-----------+
13693a2c291Sspupyrev
13793a2c291Sspupyrevdefine dso_local i32 @countMultipliers2(i32 %0, i32 %1) #0 {
13893a2c291Sspupyrevb0:
13993a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 2506109673213838996, i64 1, i32 0, i64 -1)
14093a2c291Sspupyrev  %cmp = icmp ne i32 %0, 0
14193a2c291Sspupyrev  br i1 %cmp, label %b1, label %b5
142*bb6497ffSMircea Trofin; CHECK:  edge %b0 -> %b1 probability is 0x79e79e7a / 0x80000000 = 95.24% [HOT edge]
143*bb6497ffSMircea Trofin; CHECK:  edge %b0 -> %b5 probability is 0x06186186 / 0x80000000 = 4.76%
14493a2c291Sspupyrev; CHECK2: - b0: float = {{.*}}, int = {{.*}}, count = 2100
14593a2c291Sspupyrev
14693a2c291Sspupyrevb1:
14793a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 2506109673213838996, i64 2, i32 0, i64 -1)
14893a2c291Sspupyrev  br i1 %cmp, label %b2, label %b3
149*bb6497ffSMircea Trofin; CHECK:  edge %b1 -> %b2 probability is 0x40000000 / 0x80000000 = 50.00%
150*bb6497ffSMircea Trofin; CHECK:  edge %b1 -> %b3 probability is 0x40000000 / 0x80000000 = 50.00%
151e3cf80c5SMatthias Braun; CHECK2: - b1: float = {{.*}}, int = {{.*}}, count = 2000
15293a2c291Sspupyrev
15393a2c291Sspupyrevb2:
15493a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 2506109673213838996, i64 3, i32 0, i64 -1)
15593a2c291Sspupyrev  br i1 %cmp, label %b3, label %b4
156*bb6497ffSMircea Trofin; CHECK:  edge %b2 -> %b3 probability is 0x40000000 / 0x80000000 = 50.00%
157*bb6497ffSMircea Trofin; CHECK:  edge %b2 -> %b4 probability is 0x40000000 / 0x80000000 = 50.00%
158e3cf80c5SMatthias Braun; CHECK2: - b2: float = {{.*}}, int = {{.*}}, count = 1000
15993a2c291Sspupyrev
16093a2c291Sspupyrevb3:
16193a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 2506109673213838996, i64 4, i32 0, i64 -1)
16293a2c291Sspupyrev  br label %b5
163*bb6497ffSMircea Trofin; CHECK:  edge %b3 -> %b5 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
164e3cf80c5SMatthias Braun; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 1500
16593a2c291Sspupyrev
16693a2c291Sspupyrevb4:
16793a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 2506109673213838996, i64 5, i32 0, i64 -1)
16893a2c291Sspupyrev  br label %b5
169*bb6497ffSMircea Trofin; CHECK:  edge %b4 -> %b5 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
170e3cf80c5SMatthias Braun; CHECK2: - b4: float = {{.*}}, int = {{.*}}, count = 500
17193a2c291Sspupyrev
17293a2c291Sspupyrevb5:
17393a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 2506109673213838996, i64 6, i32 0, i64 -1)
17493a2c291Sspupyrev  ret i32 %1
17593a2c291Sspupyrev; CHECK2: - b5: float = {{.*}}, int = {{.*}}, count = 2100
17693a2c291Sspupyrev
17793a2c291Sspupyrev}
17893a2c291Sspupyrev
17993a2c291Sspupyrev
18093a2c291Sspupyrev; The test contains a dangling subgraph that contains an exit dangling block.
18193a2c291Sspupyrev; No rebalancing is necessary here.
18293a2c291Sspupyrev;
18393a2c291Sspupyrev;                 +-----------+
18493a2c291Sspupyrev;                 | b31 [100] |
18593a2c291Sspupyrev;                 +-----------+
18693a2c291Sspupyrev;                   |
18793a2c291Sspupyrev;                   |
18893a2c291Sspupyrev;                   v
18993a2c291Sspupyrev; +---------+     +-----------+
19093a2c291Sspupyrev; | b34 [?] | <-- | b32 [100] |
19193a2c291Sspupyrev; +---------+     +-----------+
19293a2c291Sspupyrev;                   |
19393a2c291Sspupyrev;                   |
19493a2c291Sspupyrev;                   v
19593a2c291Sspupyrev;                 +-----------+
19693a2c291Sspupyrev;                 | b33 [100] |
19793a2c291Sspupyrev;                 +-----------+
19893a2c291Sspupyrev
19993a2c291Sspupyrevdefine dso_local i32 @countMultipliers3(i32 %0, i32 %1) #0 {
20093a2c291Sspupyrevb31:
20193a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -544905447084884130, i64 1, i32 0, i64 -1)
20293a2c291Sspupyrev  br label %b32
20393a2c291Sspupyrev; CHECK2: - b31: float = {{.*}}, int = {{.*}}, count = 100
20493a2c291Sspupyrev
20593a2c291Sspupyrevb32:
20693a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -544905447084884130, i64 2, i32 0, i64 -1)
20793a2c291Sspupyrev  %cmp = icmp ne i32 %0, 0
20893a2c291Sspupyrev  br i1 %cmp, label %b34, label %b33
209*bb6497ffSMircea Trofin; CHECK:  edge %b32 -> %b34 probability is 0x00000000 / 0x80000000 = 0.00%
210*bb6497ffSMircea Trofin; CHECK:  edge %b32 -> %b33 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]
21193a2c291Sspupyrev; CHECK2: - b32: float = {{.*}}, int = {{.*}}, count = 100
21293a2c291Sspupyrev
21393a2c291Sspupyrevb33:
21493a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -544905447084884130, i64 3, i32 0, i64 -1)
21593a2c291Sspupyrev  ret i32 %1
21693a2c291Sspupyrev; CHECK2: - b33: float = {{.*}}, int = {{.*}}, count = 100
21793a2c291Sspupyrev
21893a2c291Sspupyrevb34:
21993a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -544905447084884130, i64 4, i32 0, i64 -1)
22093a2c291Sspupyrev  ret i32 %1
22193a2c291Sspupyrev; CHECK2: - b34: float = {{.*}}, int = {{.*}}, count = 0
22293a2c291Sspupyrev
22393a2c291Sspupyrev}
22493a2c291Sspupyrev
22593a2c291Sspupyrev; Another dangling subgraph (b42, b43, b44) containing a single dangling block.
22693a2c291Sspupyrev;
22793a2c291Sspupyrev;      +----------+     +-----------+
22893a2c291Sspupyrev;   +- | b42 [50] | <-- | b40 [100] |
22993a2c291Sspupyrev;   |  +----------+     +-----------+
23093a2c291Sspupyrev;   |    |                |
23193a2c291Sspupyrev;   |    |                |
23293a2c291Sspupyrev;   |    |                v
23393a2c291Sspupyrev;   |    |              +-----------+
23493a2c291Sspupyrev;   |    |              | b41 [50]  |
23593a2c291Sspupyrev;   |    |              +-----------+
23693a2c291Sspupyrev;   |    |                |
23793a2c291Sspupyrev;   |    |                |
23893a2c291Sspupyrev;   |    |                v
23993a2c291Sspupyrev;   |    |              +-----------+
24093a2c291Sspupyrev;   |    +------------> |  b43 [?]  |
24193a2c291Sspupyrev;   |                   +-----------+
24293a2c291Sspupyrev;   |                     |
24393a2c291Sspupyrev;   |                     |
24493a2c291Sspupyrev;   |                     v
24593a2c291Sspupyrev;   |                   +-----------+
24693a2c291Sspupyrev;   +-----------------> | b44 [100] |
24793a2c291Sspupyrev;                       +-----------+
24893a2c291Sspupyrev
24993a2c291Sspupyrevdefine dso_local i32 @countMultipliers4(i32 %0, i32 %1) #0 {
25093a2c291Sspupyrevb40:
25193a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 1, i32 0, i64 -1)
25293a2c291Sspupyrev  %cmp = icmp ne i32 %0, 0
25393a2c291Sspupyrev  br i1 %cmp, label %b41, label %b42
25493a2c291Sspupyrev; CHECK2: - b40: float = {{.*}}, int = {{.*}}, count = 100
25593a2c291Sspupyrev
25693a2c291Sspupyrevb41:
25793a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 2, i32 0, i64 -1)
25893a2c291Sspupyrev  br label %b43
25993a2c291Sspupyrev; CHECK2: - b41: float = {{.*}}, int = {{.*}}, count = 50
26093a2c291Sspupyrev
26193a2c291Sspupyrevb42:
26293a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 3, i32 0, i64 -1)
26393a2c291Sspupyrev  br i1 %cmp, label %b43, label %b44
264*bb6497ffSMircea Trofin; CHECK:  edge %b42 -> %b43 probability is 0x40000000 / 0x80000000 = 50.00%
265*bb6497ffSMircea Trofin; CHECK:  edge %b42 -> %b44 probability is 0x40000000 / 0x80000000 = 50.00%
26693a2c291Sspupyrev; CHECK2: - b42: float = {{.*}}, int = {{.*}}, count = 50
26793a2c291Sspupyrev
26893a2c291Sspupyrevb43:
26993a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 4, i32 0, i64 -1)
27093a2c291Sspupyrev  br label %b44
27193a2c291Sspupyrev; CHECK2: - b43: float = {{.*}}, int = {{.*}}, count = 75
27293a2c291Sspupyrev
27393a2c291Sspupyrevb44:
27493a2c291Sspupyrev  call void @llvm.pseudoprobe(i64 -2989539179265513123, i64 5, i32 0, i64 -1)
27593a2c291Sspupyrev  ret i32 %1
27693a2c291Sspupyrev; CHECK2: - b44: float = {{.*}}, int = {{.*}}, count = 100
27793a2c291Sspupyrev}
27893a2c291Sspupyrev
27993a2c291Sspupyrev; Function Attrs: inaccessiblememonly nounwind willreturn
28093a2c291Sspupyrevdeclare void @llvm.pseudoprobe(i64, i64, i32, i64) #4
28193a2c291Sspupyrev
28293a2c291Sspupyrevattributes #0 = { noinline nounwind uwtable "use-sample-profile" }
28393a2c291Sspupyrevattributes #4 = { inaccessiblememonly nounwind willreturn }
28493a2c291Sspupyrev
28593a2c291Sspupyrev!llvm.pseudo_probe_desc = !{!7, !8, !9, !10}
28693a2c291Sspupyrev
28793a2c291Sspupyrev!7 = !{i64 -5758218299531803684, i64 223598586707, !"countMultipliers", null}
28893a2c291Sspupyrev!8 = !{i64 2506109673213838996, i64 2235985, !"countMultipliers2", null}
28993a2c291Sspupyrev!9 = !{i64 -544905447084884130, i64 22985, !"countMultipliers3", null}
29093a2c291Sspupyrev!10 = !{i64 -2989539179265513123, i64 2298578, !"countMultipliers4", null}
291