xref: /llvm-project/llvm/test/Transforms/SampleProfile/profile-inference.ll (revision bb6497ffa6a88d1b3a32101d9b6519094d75ef2a)
1f72b76cdSArthur Eubanks; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference.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.prof | opt -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s --check-prefix=CHECK2
37cc2493dSspupyrev
47cc2493dSspupyrev; The test verifies that profile inference correctly builds branch probabilities
57cc2493dSspupyrev; from sampling-based block counts.
67cc2493dSspupyrev;
77cc2493dSspupyrev; +---------+     +----------+
87cc2493dSspupyrev; | b3 [40] | <-- | b1 [100] |
97cc2493dSspupyrev; +---------+     +----------+
107cc2493dSspupyrev;                   |
117cc2493dSspupyrev;                   |
127cc2493dSspupyrev;                   v
137cc2493dSspupyrev;                 +----------+
147cc2493dSspupyrev;                 | b2 [60]  |
157cc2493dSspupyrev;                 +----------+
167cc2493dSspupyrev
177cc2493dSspupyrev@yydebug = dso_local global i32 0, align 4
187cc2493dSspupyrev
197cc2493dSspupyrev; Function Attrs: nounwind uwtable
207cc2493dSspupyrevdefine dso_local i32 @test_1() #0 {
217cc2493dSspupyrevb1:
227cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 7964825052912775246, i64 1, i32 0, i64 -1)
230271ae65SFangrui Song  %0 = load i32, ptr @yydebug, align 4
247cc2493dSspupyrev  %cmp = icmp ne i32 %0, 0
257cc2493dSspupyrev  br i1 %cmp, label %b2, label %b3
26*bb6497ffSMircea Trofin; CHECK:  edge %b1 -> %b2 probability is 0x4ccccccd / 0x80000000 = 60.00%
27*bb6497ffSMircea Trofin; CHECK:  edge %b1 -> %b3 probability is 0x33333333 / 0x80000000 = 40.00%
287cc2493dSspupyrev; CHECK2: - b1: float = {{.*}}, int = {{.*}}, count = 100
297cc2493dSspupyrev
307cc2493dSspupyrevb2:
317cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 7964825052912775246, i64 2, i32 0, i64 -1)
327cc2493dSspupyrev  ret i32 %0
337cc2493dSspupyrev; CHECK2: - b2: float = {{.*}}, int = {{.*}}, count = 60
347cc2493dSspupyrev
357cc2493dSspupyrevb3:
367cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 7964825052912775246, i64 3, i32 0, i64 -1)
377cc2493dSspupyrev  ret i32 %0
387cc2493dSspupyrev; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 40
397cc2493dSspupyrev}
407cc2493dSspupyrev
417cc2493dSspupyrev
427cc2493dSspupyrev; The test verifies that profile inference correctly builds branch probabilities
437cc2493dSspupyrev; from sampling-based block counts in the presence of "dangling" probes (whose
447cc2493dSspupyrev; block counts are missing).
457cc2493dSspupyrev;
467cc2493dSspupyrev; +---------+     +----------+
477cc2493dSspupyrev; | b3 [10] | <-- | b1 [100] |
487cc2493dSspupyrev; +---------+     +----------+
497cc2493dSspupyrev;                   |
507cc2493dSspupyrev;                   |
517cc2493dSspupyrev;                   v
527cc2493dSspupyrev;                 +----------+
537cc2493dSspupyrev;                 | b2 [?]  |
547cc2493dSspupyrev;                 +----------+
557cc2493dSspupyrev
567cc2493dSspupyrev; Function Attrs: nounwind uwtable
577cc2493dSspupyrevdefine dso_local i32 @test_2() #0 {
587cc2493dSspupyrevb1:
597cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 -6216829535442445639, i64 1, i32 0, i64 -1)
600271ae65SFangrui Song  %0 = load i32, ptr @yydebug, align 4
617cc2493dSspupyrev  %cmp = icmp ne i32 %0, 0
627cc2493dSspupyrev  br i1 %cmp, label %b2, label %b3
63*bb6497ffSMircea Trofin; CHECK:  edge %b1 -> %b2 probability is 0x73333333 / 0x80000000 = 90.00%
64*bb6497ffSMircea Trofin; CHECK:  edge %b1 -> %b3 probability is 0x0ccccccd / 0x80000000 = 10.00%
657cc2493dSspupyrev; CHECK2: - b1: float = {{.*}}, int = {{.*}}, count = 100
667cc2493dSspupyrev
677cc2493dSspupyrevb2:
687cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 -6216829535442445639, i64 2, i32 0, i64 -1)
697cc2493dSspupyrev  ret i32 %0
707cc2493dSspupyrev; CHECK2: - b2: float = {{.*}}, int = {{.*}}, count = 90
717cc2493dSspupyrev
727cc2493dSspupyrevb3:
737cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 -6216829535442445639, i64 3, i32 0, i64 -1)
747cc2493dSspupyrev  ret i32 %0
757cc2493dSspupyrev}
767cc2493dSspupyrev; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 10
777cc2493dSspupyrev
787cc2493dSspupyrev
797cc2493dSspupyrev; The test verifies that profi is able to infer block counts from hot subgraphs.
807cc2493dSspupyrev;
817cc2493dSspupyrev; +---------+     +---------+
827cc2493dSspupyrev; | b4 [?]  | <-- | b1 [?]  |
837cc2493dSspupyrev; +---------+     +---------+
847cc2493dSspupyrev;   |               |
857cc2493dSspupyrev;   |               |
867cc2493dSspupyrev;   v               v
877cc2493dSspupyrev; +---------+     +---------+
887cc2493dSspupyrev; | b5 [89] |     | b2 [?]  |
897cc2493dSspupyrev; +---------+     +---------+
907cc2493dSspupyrev;                   |
917cc2493dSspupyrev;                   |
927cc2493dSspupyrev;                   v
937cc2493dSspupyrev;                 +---------+
947cc2493dSspupyrev;                 | b3 [13] |
957cc2493dSspupyrev;                 +---------+
967cc2493dSspupyrev
977cc2493dSspupyrev; Function Attrs: nounwind uwtable
987cc2493dSspupyrevdefine dso_local i32 @test_3() #0 {
997cc2493dSspupyrevb1:
1007cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 1649282507922421973, i64 1, i32 0, i64 -1)
1010271ae65SFangrui Song  %0 = load i32, ptr @yydebug, align 4
1027cc2493dSspupyrev  %cmp = icmp ne i32 %0, 0
1037cc2493dSspupyrev  br i1 %cmp, label %b2, label %b4
104*bb6497ffSMircea Trofin; CHECK:  edge %b1 -> %b2 probability is 0x10505050 / 0x80000000 = 12.75%
105*bb6497ffSMircea Trofin; CHECK:  edge %b1 -> %b4 probability is 0x6fafafb0 / 0x80000000 = 87.25%
1067cc2493dSspupyrev; CHECK2: - b1: float = {{.*}}, int = {{.*}}, count = 102
1077cc2493dSspupyrev
1087cc2493dSspupyrevb2:
1097cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 1649282507922421973, i64 2, i32 0, i64 -1)
1107cc2493dSspupyrev  br label %b3
111*bb6497ffSMircea Trofin; CHECK:  edge %b2 -> %b3 probability is 0x80000000 / 0x80000000 = 100.00%
1127cc2493dSspupyrev; CHECK2: - b2: float = {{.*}}, int = {{.*}}, count = 13
1137cc2493dSspupyrev
1147cc2493dSspupyrevb3:
1157cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 1649282507922421973, i64 3, i32 0, i64 -1)
1167cc2493dSspupyrev  ret i32 %0
1177cc2493dSspupyrev; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 13
1187cc2493dSspupyrev
1197cc2493dSspupyrevb4:
1207cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 1649282507922421973, i64 4, i32 0, i64 -1)
1217cc2493dSspupyrev  br label %b5
122*bb6497ffSMircea Trofin; CHECK:  edge %b4 -> %b5 probability is 0x80000000 / 0x80000000 = 100.00%
1237cc2493dSspupyrev; CHECK2: - b4: float = {{.*}}, int = {{.*}}, count = 89
1247cc2493dSspupyrev
1257cc2493dSspupyrevb5:
1267cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 1649282507922421973, i64 5, i32 0, i64 -1)
1277cc2493dSspupyrev  ret i32 %0
1287cc2493dSspupyrev; CHECK2: - b5: float = {{.*}}, int = {{.*}}, count = 89
1297cc2493dSspupyrev}
1307cc2493dSspupyrev
1317cc2493dSspupyrev
1327cc2493dSspupyrev; A larger test to verify that profile inference correctly identifies hot parts
1337cc2493dSspupyrev; of the control-flow graph.
1347cc2493dSspupyrev;
1357cc2493dSspupyrev;                +-----------+
1367cc2493dSspupyrev;                |  b1 [?]   |
1377cc2493dSspupyrev;                +-----------+
1387cc2493dSspupyrev;                  |
1397cc2493dSspupyrev;                  |
1407cc2493dSspupyrev;                  v
1417cc2493dSspupyrev; +--------+     +-----------+
1427cc2493dSspupyrev; | b3 [1] | <-- | b2 [5993] |
1437cc2493dSspupyrev; +--------+     +-----------+
1447cc2493dSspupyrev;   |              |
1457cc2493dSspupyrev;   |              |
1467cc2493dSspupyrev;   |              v
1477cc2493dSspupyrev;   |            +-----------+     +--------+
1487cc2493dSspupyrev;   |            | b4 [5992] | --> | b6 [?] |
1497cc2493dSspupyrev;   |            +-----------+     +--------+
1507cc2493dSspupyrev;   |              |                 |
1517cc2493dSspupyrev;   |              |                 |
1527cc2493dSspupyrev;   |              v                 |
1537cc2493dSspupyrev;   |            +-----------+       |
1547cc2493dSspupyrev;   |            | b5 [5992] |       |
1557cc2493dSspupyrev;   |            +-----------+       |
1567cc2493dSspupyrev;   |              |                 |
1577cc2493dSspupyrev;   |              |                 |
1587cc2493dSspupyrev;   |              v                 |
1597cc2493dSspupyrev;   |            +-----------+       |
1607cc2493dSspupyrev;   |            |  b7 [?]   |       |
1617cc2493dSspupyrev;   |            +-----------+       |
1627cc2493dSspupyrev;   |              |                 |
1637cc2493dSspupyrev;   |              |                 |
1647cc2493dSspupyrev;   |              v                 |
1657cc2493dSspupyrev;   |            +-----------+       |
1667cc2493dSspupyrev;   |            | b8 [5992] | <-----+
1677cc2493dSspupyrev;   |            +-----------+
1687cc2493dSspupyrev;   |              |
1697cc2493dSspupyrev;   |              |
1707cc2493dSspupyrev;   |              v
1717cc2493dSspupyrev;   |            +-----------+
1727cc2493dSspupyrev;   +----------> |  b9 [?]   |
1737cc2493dSspupyrev;                +-----------+
1747cc2493dSspupyrev
1757cc2493dSspupyrev; Function Attrs: nounwind uwtable
1767cc2493dSspupyrevdefine dso_local i32 @sum_of_squares() #0 {
1777cc2493dSspupyrevb1:
1787cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 -907520326213521421, i64 1, i32 0, i64 -1)
1790271ae65SFangrui Song  %0 = load i32, ptr @yydebug, align 4
1807cc2493dSspupyrev  %cmp = icmp ne i32 %0, 0
1817cc2493dSspupyrev  br label %b2
182*bb6497ffSMircea Trofin; CHECK:  edge %b1 -> %b2 probability is 0x80000000 / 0x80000000 = 100.00%
1837cc2493dSspupyrev; CHECK2: - b1: float = {{.*}}, int = {{.*}}, count = 5993
1847cc2493dSspupyrev
1857cc2493dSspupyrevb2:
1867cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 -907520326213521421, i64 2, i32 0, i64 -1)
1877cc2493dSspupyrev  br i1 %cmp, label %b4, label %b3
188*bb6497ffSMircea Trofin; CHECK:  edge %b2 -> %b4 probability is 0x7ffa8844 / 0x80000000 = 99.98%
189*bb6497ffSMircea Trofin; CHECK:  edge %b2 -> %b3 probability is 0x000577bc / 0x80000000 = 0.02%
1907cc2493dSspupyrev; CHECK2: - b2: float = {{.*}}, int = {{.*}}, count = 5993
1917cc2493dSspupyrev
1927cc2493dSspupyrevb3:
1937cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 -907520326213521421, i64 3, i32 0, i64 -1)
1947cc2493dSspupyrev  br label %b9
195*bb6497ffSMircea Trofin; CHECK:  edge %b3 -> %b9 probability is 0x80000000 / 0x80000000 = 100.00%
1967cc2493dSspupyrev; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 1
1977cc2493dSspupyrev
1987cc2493dSspupyrevb4:
1997cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 -907520326213521421, i64 4, i32 0, i64 -1)
2007cc2493dSspupyrev  br i1 %cmp, label %b5, label %b6
201*bb6497ffSMircea Trofin; CHECK:  edge %b4 -> %b5 probability is 0x80000000 / 0x80000000 = 100.00%
202*bb6497ffSMircea Trofin; CHECK:  edge %b4 -> %b6 probability is 0x00000000 / 0x80000000 = 0.00%
2037cc2493dSspupyrev; CHECK2: - b4: float = {{.*}}, int = {{.*}}, count = 5992
2047cc2493dSspupyrev
2057cc2493dSspupyrevb5:
2067cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 -907520326213521421, i64 5, i32 0, i64 -1)
2077cc2493dSspupyrev  br label %b7
208*bb6497ffSMircea Trofin; CHECK:  edge %b5 -> %b7 probability is 0x80000000 / 0x80000000 = 100.00%
2097cc2493dSspupyrev; CHECK2: - b5: float = {{.*}}, int = {{.*}}, count = 5992
2107cc2493dSspupyrev
2117cc2493dSspupyrevb6:
2127cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 -907520326213521421, i64 6, i32 0, i64 -1)
2137cc2493dSspupyrev  br label %b8
214*bb6497ffSMircea Trofin; CHECK:  edge %b6 -> %b8 probability is 0x80000000 / 0x80000000 = 100.00%
2157cc2493dSspupyrev; CHECK2: - b6: float = {{.*}}, int = {{.*}}, count = 0
2167cc2493dSspupyrev
2177cc2493dSspupyrevb7:
2187cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 -907520326213521421, i64 7, i32 0, i64 -1)
2197cc2493dSspupyrev  br label %b8
220*bb6497ffSMircea Trofin; CHECK:  edge %b7 -> %b8 probability is 0x80000000 / 0x80000000 = 100.00%
2217cc2493dSspupyrev; CHECK2: - b7: float = {{.*}}, int = {{.*}}, count = 5992
2227cc2493dSspupyrev
2237cc2493dSspupyrevb8:
2247cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 -907520326213521421, i64 8, i32 0, i64 -1)
2257cc2493dSspupyrev  br label %b9
226*bb6497ffSMircea Trofin; CHECK:  edge %b8 -> %b9 probability is 0x80000000 / 0x80000000 = 100.00%
2277cc2493dSspupyrev; CHECK2: - b8: float = {{.*}}, int = {{.*}}, count = 5992
2287cc2493dSspupyrev
2297cc2493dSspupyrevb9:
2307cc2493dSspupyrev  call void @llvm.pseudoprobe(i64 -907520326213521421, i64 9, i32 0, i64 -1)
2317cc2493dSspupyrev  ret i32 %0
2327cc2493dSspupyrev}
2337cc2493dSspupyrev; CHECK2: - b9: float = {{.*}}, int = {{.*}}, count = 5993
2347cc2493dSspupyrev
23593a2c291Sspupyrev
2367cc2493dSspupyrevdeclare void @llvm.pseudoprobe(i64, i64, i32, i64) #1
2377cc2493dSspupyrev
2387cc2493dSspupyrevattributes #0 = { noinline nounwind uwtable "use-sample-profile"}
2397cc2493dSspupyrevattributes #1 = { nounwind }
2407cc2493dSspupyrev
2417cc2493dSspupyrev!llvm.pseudo_probe_desc = !{!6, !7, !8, !9}
2427cc2493dSspupyrev
2437cc2493dSspupyrev!6 = !{i64 7964825052912775246, i64 4294967295, !"test_1", null}
2447cc2493dSspupyrev!7 = !{i64 -6216829535442445639, i64 37753817093, !"test_2", null}
2457cc2493dSspupyrev!8 = !{i64 1649282507922421973, i64 69502983527, !"test_3", null}
2467cc2493dSspupyrev!9 = !{i64 -907520326213521421, i64 175862120757, !"sum_of_squares", null}
247