174 lines · plain
1; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-even-count-distribution.prof | opt -passes='print<branch-prob>' -disable-output 2>&1 | FileCheck %s2; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-even-count-distribution.prof | opt -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s --check-prefix=CHECK23 4; The test verifies that counts are evenly distributed among branches with5; equal weights.6;7; +-----------+ +-----------+8; | b3 [0] | <-- | b1 [1000] |9; +-----------+ +-----------+10; | |11; | |12; | v13; | +-----------+14; | | b2 [0] |15; | +-----------+16; | |17; | |18; | v19; | +-----------+20; +-------------> | b4 [1000] |21; +-----------+22 23@yydebug = dso_local global i32 0, align 424 25; Function Attrs: nounwind uwtable26define dso_local i32 @foo1(i32 %0, i32 %1) #0 {27b11:28 call void @llvm.pseudoprobe(i64 7682762345278052905, i64 1, i32 0, i64 -1)29 %cmp = icmp ne i32 %0, 030 br i1 %cmp, label %b12, label %b1331; CHECK: edge %b11 -> %b12 probability is 0x40000000 / 0x80000000 = 50.00%32; CHECK: edge %b11 -> %b13 probability is 0x40000000 / 0x80000000 = 50.00%33; CHECK2: - b11: float = {{.*}}, int = {{.*}}, count = 100034 35b12:36 call void @llvm.pseudoprobe(i64 7682762345278052905, i64 2, i32 0, i64 -1)37 br label %b1438; CHECK2: - b12: float = {{.*}}, int = {{.*}}, count = 50039 40b13:41 call void @llvm.pseudoprobe(i64 7682762345278052905, i64 3, i32 0, i64 -1)42 br label %b1443; CHECK2: - b13: float = {{.*}}, int = {{.*}}, count = 50044 45b14:46 call void @llvm.pseudoprobe(i64 7682762345278052905, i64 4, i32 0, i64 -1)47 ret i32 %148; CHECK2: - b14: float = {{.*}}, int = {{.*}}, count = 100049}50 51 52; The test verifies that counts are evenly distributed when the entry basic53; block is dangling.54;55; +-----------+56; | b1 [?] | -+57; +-----------+ |58; | |59; | |60; v |61; +-----------+ |62; | b2 [?] | |63; +-----------+ |64; | |65; | |66; v |67; +-----------+ |68; | b3 [1000] | <+69; +-----------+70 71define dso_local i32 @foo2(i32 %0, i32 %1) #0 {72b21:73 call void @llvm.pseudoprobe(i64 2494702099028631698, i64 1, i32 0, i64 -1)74 %cmp = icmp ne i32 %0, 075 br i1 %cmp, label %b22, label %b2376; CHECK: edge %b21 -> %b22 probability is 0x40000000 / 0x80000000 = 50.00%77; CHECK: edge %b21 -> %b23 probability is 0x40000000 / 0x80000000 = 50.00%78; CHECK2: - b21: float = {{.*}}, int = {{.*}}, count = 100079 80b22:81 call void @llvm.pseudoprobe(i64 2494702099028631698, i64 2, i32 0, i64 -1)82 br label %b2383; CHECK2: - b22: float = {{.*}}, int = {{.*}}, count = 50084 85b23:86 call void @llvm.pseudoprobe(i64 2494702099028631698, i64 3, i32 0, i64 -1)87 ret i32 %188; CHECK2: - b23: float = {{.*}}, int = {{.*}}, count = 100089 90}91 92; The test verifies even count distribution in the presence of multiple sinks.93;94; +-----------+95; | b1 [1000] |96; +-----------+97; |98; |99; v100; +-----------+101; | b2 [?] | -+102; +-----------+ |103; | |104; | |105; v |106; +--------+ +-----------+ |107; | b5 [?] | <-- | b3 [?] | |108; +--------+ +-----------+ |109; | | |110; | | |111; | v |112; | +-----------+ |113; | | b4 [1000] | <+114; | +-----------+115; | |116; | |117; | v118; | +-----------+119; +----------> | b6 [1000] |120; +-----------+121;122 123define dso_local i32 @foo3(i32 %0, i32 %1) #0 {124b31:125 call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 1, i32 0, i64 -1)126 %cmp = icmp ne i32 %0, 0127 br label %b32128; CHECK2: - b31: float = {{.*}}, int = {{.*}}, count = 1000129 130b32:131 call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 2, i32 0, i64 -1)132 br i1 %cmp, label %b33, label %b34133; CHECK: edge %b32 -> %b33 probability is 0x40000000 / 0x80000000 = 50.00%134; CHECK: edge %b32 -> %b34 probability is 0x40000000 / 0x80000000 = 50.00%135; CHECK2: - b32: float = {{.*}}, int = {{.*}}, count = 1000136 137b33:138 call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 3, i32 0, i64 -1)139 br i1 %cmp, label %b35, label %b34140; CHECK: edge %b33 -> %b35 probability is 0x00000000 / 0x80000000 = 0.00%141; CHECK: edge %b33 -> %b34 probability is 0x80000000 / 0x80000000 = 100.00% [HOT edge]142; CHECK2: - b33: float = {{.*}}, int = {{.*}}, count = 500143 144b34:145 call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 4, i32 0, i64 -1)146 br label %b36147; CHECK2: - b34: float = {{.*}}, int = {{.*}}, count = 1000148 149b35:150 call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 5, i32 0, i64 -1)151 br label %b36152; CHECK2: - b35: float = {{.*}}, int = {{.*}}, count = 0153 154b36:155 call void @llvm.pseudoprobe(i64 -7908226060800700466, i64 6, i32 0, i64 -1)156 ret i32 %1157; CHECK2: - b36: float = {{.*}}, int = {{.*}}, count = 1000158}159 160 161 162; Function Attrs: inaccessiblememonly nounwind willreturn163declare void @llvm.pseudoprobe(i64, i64, i32, i64) #4164 165attributes #0 = { noinline nounwind uwtable "use-sample-profile" }166attributes #4 = { inaccessiblememonly nounwind willreturn }167 168!llvm.pseudo_probe_desc = !{!7, !8, !9, !10}169 170!7 = !{i64 7682762345278052905, i64 157181141624, !"foo1", null}171!8 = !{i64 2494702099028631698, i64 208782362068, !"foo2", null}172!9 = !{i64 -7908226060800700466, i64 189901498683, !"foo3", null}173!10 = !{i64 -6882312132165544686, i64 241030178952, !"foo4", null}174