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