247 lines · plain
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 %s2; 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=CHECK23 4; The test verifies that profile inference correctly builds branch probabilities5; from sampling-based block counts.6;7; +---------+ +----------+8; | b3 [40] | <-- | b1 [100] |9; +---------+ +----------+10; |11; |12; v13; +----------+14; | b2 [60] |15; +----------+16 17@yydebug = dso_local global i32 0, align 418 19; Function Attrs: nounwind uwtable20define 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 424 %cmp = icmp ne i32 %0, 025 br i1 %cmp, label %b2, label %b326; 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 = 10029 30b2:31 call void @llvm.pseudoprobe(i64 7964825052912775246, i64 2, i32 0, i64 -1)32 ret i32 %033; CHECK2: - b2: float = {{.*}}, int = {{.*}}, count = 6034 35b3:36 call void @llvm.pseudoprobe(i64 7964825052912775246, i64 3, i32 0, i64 -1)37 ret i32 %038; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 4039}40 41 42; The test verifies that profile inference correctly builds branch probabilities43; from sampling-based block counts in the presence of "dangling" probes (whose44; block counts are missing).45;46; +---------+ +----------+47; | b3 [10] | <-- | b1 [100] |48; +---------+ +----------+49; |50; |51; v52; +----------+53; | b2 [?] |54; +----------+55 56; Function Attrs: nounwind uwtable57define 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 461 %cmp = icmp ne i32 %0, 062 br i1 %cmp, label %b2, label %b363; 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 = 10066 67b2:68 call void @llvm.pseudoprobe(i64 -6216829535442445639, i64 2, i32 0, i64 -1)69 ret i32 %070; CHECK2: - b2: float = {{.*}}, int = {{.*}}, count = 9071 72b3:73 call void @llvm.pseudoprobe(i64 -6216829535442445639, i64 3, i32 0, i64 -1)74 ret i32 %075}76; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 1077 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 v87; +---------+ +---------+88; | b5 [89] | | b2 [?] |89; +---------+ +---------+90; |91; |92; v93; +---------+94; | b3 [13] |95; +---------+96 97; Function Attrs: nounwind uwtable98define 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 4102 %cmp = icmp ne i32 %0, 0103 br i1 %cmp, label %b2, label %b4104; 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 = 102107 108b2:109 call void @llvm.pseudoprobe(i64 1649282507922421973, i64 2, i32 0, i64 -1)110 br label %b3111; CHECK: edge %b2 -> %b3 probability is 0x80000000 / 0x80000000 = 100.00%112; CHECK2: - b2: float = {{.*}}, int = {{.*}}, count = 13113 114b3:115 call void @llvm.pseudoprobe(i64 1649282507922421973, i64 3, i32 0, i64 -1)116 ret i32 %0117; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 13118 119b4:120 call void @llvm.pseudoprobe(i64 1649282507922421973, i64 4, i32 0, i64 -1)121 br label %b5122; CHECK: edge %b4 -> %b5 probability is 0x80000000 / 0x80000000 = 100.00%123; CHECK2: - b4: float = {{.*}}, int = {{.*}}, count = 89124 125b5:126 call void @llvm.pseudoprobe(i64 1649282507922421973, i64 5, i32 0, i64 -1)127 ret i32 %0128; CHECK2: - b5: float = {{.*}}, int = {{.*}}, count = 89129}130 131 132; A larger test to verify that profile inference correctly identifies hot parts133; of the control-flow graph.134;135; +-----------+136; | b1 [?] |137; +-----------+138; |139; |140; v141; +--------+ +-----------+142; | b3 [1] | <-- | b2 [5993] |143; +--------+ +-----------+144; | |145; | |146; | v147; | +-----------+ +--------+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; | v171; | +-----------+172; +----------> | b9 [?] |173; +-----------+174 175; Function Attrs: nounwind uwtable176define 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 4180 %cmp = icmp ne i32 %0, 0181 br label %b2182; CHECK: edge %b1 -> %b2 probability is 0x80000000 / 0x80000000 = 100.00%183; CHECK2: - b1: float = {{.*}}, int = {{.*}}, count = 5993184 185b2:186 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 2, i32 0, i64 -1)187 br i1 %cmp, label %b4, label %b3188; 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 = 5993191 192b3:193 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 3, i32 0, i64 -1)194 br label %b9195; CHECK: edge %b3 -> %b9 probability is 0x80000000 / 0x80000000 = 100.00%196; CHECK2: - b3: float = {{.*}}, int = {{.*}}, count = 1197 198b4:199 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 4, i32 0, i64 -1)200 br i1 %cmp, label %b5, label %b6201; 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 = 5992204 205b5:206 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 5, i32 0, i64 -1)207 br label %b7208; CHECK: edge %b5 -> %b7 probability is 0x80000000 / 0x80000000 = 100.00%209; CHECK2: - b5: float = {{.*}}, int = {{.*}}, count = 5992210 211b6:212 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 6, i32 0, i64 -1)213 br label %b8214; CHECK: edge %b6 -> %b8 probability is 0x80000000 / 0x80000000 = 100.00%215; CHECK2: - b6: float = {{.*}}, int = {{.*}}, count = 0216 217b7:218 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 7, i32 0, i64 -1)219 br label %b8220; CHECK: edge %b7 -> %b8 probability is 0x80000000 / 0x80000000 = 100.00%221; CHECK2: - b7: float = {{.*}}, int = {{.*}}, count = 5992222 223b8:224 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 8, i32 0, i64 -1)225 br label %b9226; CHECK: edge %b8 -> %b9 probability is 0x80000000 / 0x80000000 = 100.00%227; CHECK2: - b8: float = {{.*}}, int = {{.*}}, count = 5992228 229b9:230 call void @llvm.pseudoprobe(i64 -907520326213521421, i64 9, i32 0, i64 -1)231 ret i32 %0232}233; CHECK2: - b9: float = {{.*}}, int = {{.*}}, count = 5993234 235 236declare void @llvm.pseudoprobe(i64, i64, i32, i64) #1237 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