1; 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 2; 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 3 4; The test verifies that profile inference correctly builds branch probabilities 5; from sampling-based block counts. 6; 7; +---------+ +----------+ 8; | b3 [40] | <-- | b1 [100] | 9; +---------+ +----------+ 10; | 11; | 12; v 13; +----------+ 14; | b2 [60] | 15; +----------+ 16 17@yydebug = dso_local global i32 0, align 4 18 19; Function Attrs: nounwind uwtable 20define dso_local i32 @test_1() #0 { 21b1: 22 call void @llvm.pseudoprobe(i64 7964825052912775246, i64 1, i32 0, i64 -1) 23 %0 = load i32, ptr @yydebug, align 4 24 %cmp = icmp ne i32 %0, 0 25 br i1 %cmp, label %b2, label %b3 26; CHECK: edge %b1 -> %b2 probability is 0x4ccccccd / 0x80000000 = 60.00% 27; CHECK: edge %b1 -> %b3 probability is 0x33333333 / 0x80000000 = 40.00% 28; CHECK2: - b1: float = {{.*}}, int = {{.*}}, count = 100 29 30b2: 31 call void @llvm.pseudoprobe(i64 7964825052912775246, i64 2, i32 0, i64 -1) 32 ret i32 %0 33; CHECK2: - b2: float = {{.*}}, int = {{.*}}, count = 60 34 35b3: 36 call void @llvm.pseudoprobe(i64 7964825052912775246, i64 3, i32 0, i64 -1) 37 ret i32 %0 38; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 40 39} 40 41 42; The test verifies that profile inference correctly builds branch probabilities 43; from sampling-based block counts in the presence of "dangling" probes (whose 44; block counts are missing). 45; 46; +---------+ +----------+ 47; | b3 [10] | <-- | b1 [100] | 48; +---------+ +----------+ 49; | 50; | 51; v 52; +----------+ 53; | b2 [?] | 54; +----------+ 55 56; Function Attrs: nounwind uwtable 57define dso_local i32 @test_2() #0 { 58b1: 59 call void @llvm.pseudoprobe(i64 -6216829535442445639, i64 1, i32 0, i64 -1) 60 %0 = load i32, ptr @yydebug, align 4 61 %cmp = icmp ne i32 %0, 0 62 br i1 %cmp, label %b2, label %b3 63; CHECK: edge %b1 -> %b2 probability is 0x73333333 / 0x80000000 = 90.00% 64; CHECK: edge %b1 -> %b3 probability is 0x0ccccccd / 0x80000000 = 10.00% 65; CHECK2: - b1: float = {{.*}}, int = {{.*}}, count = 100 66 67b2: 68 call void @llvm.pseudoprobe(i64 -6216829535442445639, i64 2, i32 0, i64 -1) 69 ret i32 %0 70; CHECK2: - b2: float = {{.*}}, int = {{.*}}, count = 90 71 72b3: 73 call void @llvm.pseudoprobe(i64 -6216829535442445639, i64 3, i32 0, i64 -1) 74 ret i32 %0 75} 76; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 10 77 78 79; The test verifies that profi is able to infer block counts from hot subgraphs. 80; 81; +---------+ +---------+ 82; | b4 [?] | <-- | b1 [?] | 83; +---------+ +---------+ 84; | | 85; | | 86; v v 87; +---------+ +---------+ 88; | b5 [89] | | b2 [?] | 89; +---------+ +---------+ 90; | 91; | 92; v 93; +---------+ 94; | b3 [13] | 95; +---------+ 96 97; Function Attrs: nounwind uwtable 98define dso_local i32 @test_3() #0 { 99b1: 100 call void @llvm.pseudoprobe(i64 1649282507922421973, i64 1, i32 0, i64 -1) 101 %0 = load i32, ptr @yydebug, align 4 102 %cmp = icmp ne i32 %0, 0 103 br i1 %cmp, label %b2, label %b4 104; CHECK: edge %b1 -> %b2 probability is 0x10505050 / 0x80000000 = 12.75% 105; CHECK: edge %b1 -> %b4 probability is 0x6fafafb0 / 0x80000000 = 87.25% 106; CHECK2: - b1: float = {{.*}}, int = {{.*}}, count = 102 107 108b2: 109 call void @llvm.pseudoprobe(i64 1649282507922421973, i64 2, i32 0, i64 -1) 110 br label %b3 111; CHECK: edge %b2 -> %b3 probability is 0x80000000 / 0x80000000 = 100.00% 112; CHECK2: - b2: float = {{.*}}, int = {{.*}}, count = 13 113 114b3: 115 call void @llvm.pseudoprobe(i64 1649282507922421973, i64 3, i32 0, i64 -1) 116 ret i32 %0 117; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 13 118 119b4: 120 call void @llvm.pseudoprobe(i64 1649282507922421973, i64 4, i32 0, i64 -1) 121 br label %b5 122; CHECK: edge %b4 -> %b5 probability is 0x80000000 / 0x80000000 = 100.00% 123; CHECK2: - b4: float = {{.*}}, int = {{.*}}, count = 89 124 125b5: 126 call void @llvm.pseudoprobe(i64 1649282507922421973, i64 5, i32 0, i64 -1) 127 ret i32 %0 128; CHECK2: - b5: float = {{.*}}, int = {{.*}}, count = 89 129} 130 131 132; A larger test to verify that profile inference correctly identifies hot parts 133; of the control-flow graph. 134; 135; +-----------+ 136; | b1 [?] | 137; +-----------+ 138; | 139; | 140; v 141; +--------+ +-----------+ 142; | b3 [1] | <-- | b2 [5993] | 143; +--------+ +-----------+ 144; | | 145; | | 146; | v 147; | +-----------+ +--------+ 148; | | b4 [5992] | --> | b6 [?] | 149; | +-----------+ +--------+ 150; | | | 151; | | | 152; | v | 153; | +-----------+ | 154; | | b5 [5992] | | 155; | +-----------+ | 156; | | | 157; | | | 158; | v | 159; | +-----------+ | 160; | | b7 [?] | | 161; | +-----------+ | 162; | | | 163; | | | 164; | v | 165; | +-----------+ | 166; | | b8 [5992] | <-----+ 167; | +-----------+ 168; | | 169; | | 170; | v 171; | +-----------+ 172; +----------> | b9 [?] | 173; +-----------+ 174 175; Function Attrs: nounwind uwtable 176define dso_local i32 @sum_of_squares() #0 { 177b1: 178 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 1, i32 0, i64 -1) 179 %0 = load i32, ptr @yydebug, align 4 180 %cmp = icmp ne i32 %0, 0 181 br label %b2 182; CHECK: edge %b1 -> %b2 probability is 0x80000000 / 0x80000000 = 100.00% 183; CHECK2: - b1: float = {{.*}}, int = {{.*}}, count = 5993 184 185b2: 186 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 2, i32 0, i64 -1) 187 br i1 %cmp, label %b4, label %b3 188; CHECK: edge %b2 -> %b4 probability is 0x7ffa8844 / 0x80000000 = 99.98% 189; CHECK: edge %b2 -> %b3 probability is 0x000577bc / 0x80000000 = 0.02% 190; CHECK2: - b2: float = {{.*}}, int = {{.*}}, count = 5993 191 192b3: 193 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 3, i32 0, i64 -1) 194 br label %b9 195; CHECK: edge %b3 -> %b9 probability is 0x80000000 / 0x80000000 = 100.00% 196; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 1 197 198b4: 199 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 4, i32 0, i64 -1) 200 br i1 %cmp, label %b5, label %b6 201; CHECK: edge %b4 -> %b5 probability is 0x80000000 / 0x80000000 = 100.00% 202; CHECK: edge %b4 -> %b6 probability is 0x00000000 / 0x80000000 = 0.00% 203; CHECK2: - b4: float = {{.*}}, int = {{.*}}, count = 5992 204 205b5: 206 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 5, i32 0, i64 -1) 207 br label %b7 208; CHECK: edge %b5 -> %b7 probability is 0x80000000 / 0x80000000 = 100.00% 209; CHECK2: - b5: float = {{.*}}, int = {{.*}}, count = 5992 210 211b6: 212 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 6, i32 0, i64 -1) 213 br label %b8 214; CHECK: edge %b6 -> %b8 probability is 0x80000000 / 0x80000000 = 100.00% 215; CHECK2: - b6: float = {{.*}}, int = {{.*}}, count = 0 216 217b7: 218 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 7, i32 0, i64 -1) 219 br label %b8 220; CHECK: edge %b7 -> %b8 probability is 0x80000000 / 0x80000000 = 100.00% 221; CHECK2: - b7: float = {{.*}}, int = {{.*}}, count = 5992 222 223b8: 224 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 8, i32 0, i64 -1) 225 br label %b9 226; CHECK: edge %b8 -> %b9 probability is 0x80000000 / 0x80000000 = 100.00% 227; CHECK2: - b8: float = {{.*}}, int = {{.*}}, count = 5992 228 229b9: 230 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 9, i32 0, i64 -1) 231 ret i32 %0 232} 233; CHECK2: - b9: float = {{.*}}, int = {{.*}}, count = 5993 234 235 236declare void @llvm.pseudoprobe(i64, i64, i32, i64) #1 237 238attributes #0 = { noinline nounwind uwtable "use-sample-profile"} 239attributes #1 = { nounwind } 240 241!llvm.pseudo_probe_desc = !{!6, !7, !8, !9} 242 243!6 = !{i64 7964825052912775246, i64 4294967295, !"test_1", null} 244!7 = !{i64 -6216829535442445639, i64 37753817093, !"test_2", null} 245!8 = !{i64 1649282507922421973, i64 69502983527, !"test_3", null} 246!9 = !{i64 -907520326213521421, i64 175862120757, !"sum_of_squares", null} 247