213 lines · plain
1; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-islands.prof -S -o %t2; RUN: FileCheck %s < %t -check-prefix=CHECK-ENTRY-COUNT3; RUN: opt < %t -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s4 5 6; The test contains an isolated flow component ("island") that needs to be7; reconnected to the entry point via edges with a positive flow.8; The corresponding CFG is shown below:9;10; +--------+ +--------+ +----------+11; | b6 [1] | <-- | b4 [1] | <-- | b1 [1] |12; +--------+ +--------+ +----------+13; | |14; | |15; v v16; +--------+ +----------+17; | b5 [0] | | b2 [100] | <+18; +--------+ +----------+ |19; | |20; | |21; v |22; +----------+ |23; | b3 [100] | -+24; +----------+25; |26; |27; v28; +----------+29; | b7 [0] |30; +----------+31 32 33; Function Attrs: nounwind uwtable34define dso_local i32 @islands_1(i32 %0, i32 %1) #0 {35b1:36 call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 1, i32 0, i64 -1)37 %cmp = icmp ne i32 %0, 038 br i1 %cmp, label %b2, label %b439; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 240 41b2:42 call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 2, i32 0, i64 -1)43 br label %b344; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 10145 46b3:47 call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 3, i32 0, i64 -1)48 br i1 %cmp, label %b2, label %b749; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 10150 51b4:52 call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 4, i32 0, i64 -1)53 br i1 %cmp, label %b5, label %b654; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 155 56b5:57 call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 5, i32 0, i64 -1)58 ret i32 %159; CHECK: - b5: float = {{.*}}, int = {{.*}}, count = 060 61b6:62 call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 6, i32 0, i64 -1)63 ret i32 %164; CHECK: - b6: float = {{.*}}, int = {{.*}}, count = 165 66b7:67 call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 7, i32 0, i64 -1)68 ret i32 %169; CHECK: - b7: float = {{.*}}, int = {{.*}}, count = 170 71}72 73; Another test with an island.74;75; +----------+76; | b1 [0] |77; +----------+78; |79; |80; v81; +----------+82; | b2 [100] | <+83; +----------+ |84; | |85; | |86; v |87; +----------+ |88; | b3 [100] | -+89; +----------+90; |91; |92; v93; +----------+94; | b4 [0] |95; +----------+96 97; Function Attrs: nounwind uwtable98define dso_local i32 @islands_2(i32 %0, i32 %1) #1 {99b1:100 call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 1, i32 0, i64 -1)101 %cmp = icmp ne i32 %0, 0102 br label %b2103; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 1104 105b2:106 call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 2, i32 0, i64 -1)107 br label %b3108; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 10001109 110b3:111 call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 3, i32 0, i64 -1)112 br i1 %cmp, label %b2, label %b4113; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 10001114 115b4:116 call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 4, i32 0, i64 -1)117 ret i32 %1118; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 1119}120 121 122; The test verifies that the island is connected to the entry block via a123; cheapest path (that is, passing through blocks with large counts).124;125; +---------+ +---------+ +----------+ +--------+126; | b8 [10] | <-- | b3 [10] | <-- | b1 [10] | --> | b4 [0] |127; +---------+ +---------+ +----------+ +--------+128; | | |129; | | |130; | v |131; | +----------+ |132; | | b2 [0] | |133; | +----------+ |134; | | |135; | | |136; | v v137; | +-------------------------+138; +-----------> | b5 [100] |139; +-------------------------+140; | ^141; | |142; v |143; +----------+ |144; | b6 [100] | -+145; +----------+146; |147; |148; v149; +----------+150; | b7 [0] |151; +----------+152 153; Function Attrs: nounwind uwtable154define dso_local i32 @islands_3(i32 %0, i32 %1) #1 {155b1:156 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 1, i32 0, i64 -1)157 %cmp = icmp ne i32 %0, 0158 switch i32 %1, label %b2 [159 i32 1, label %b3160 i32 2, label %b4161 ]162; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 11163 164b2:165 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 2, i32 0, i64 -1)166 br label %b5167; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 0168 169b3:170 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 3, i32 0, i64 -1)171 br i1 %cmp, label %b8, label %b5172; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 11173 174b4:175 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 4, i32 0, i64 -1)176 ret i32 %1177; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 0178 179b5:180 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 5, i32 0, i64 -1)181 br label %b6182; CHECK: - b5: float = {{.*}}, int = {{.*}}, count = 1001183 184b6:185 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 6, i32 0, i64 -1)186 br i1 %cmp, label %b7, label %b5187; CHECK: - b6: float = {{.*}}, int = {{.*}}, count = 1001188 189b7:190 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 7, i32 0, i64 -1)191 ret i32 %1192; CHECK: - b7: float = {{.*}}, int = {{.*}}, count = 1193 194b8:195 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 8, i32 0, i64 -1)196 ret i32 %1197; CHECK: - b8: float = {{.*}}, int = {{.*}}, count = 10198}199 200declare void @llvm.pseudoprobe(i64, i64, i32, i64) #2201 202attributes #0 = { noinline nounwind uwtable "use-sample-profile"}203attributes #1 = { noinline nounwind uwtable "use-sample-profile"}204attributes #2 = { nounwind }205 206!llvm.pseudo_probe_desc = !{!7, !8}207 208!7 = !{i64 -5646793257986063976, i64 120879332589, !"islands_1"}209!8 = !{i64 -7683376842751444845, i64 69495280403, !"islands_2"}210!9 = !{i64 -9095645063288297061, i64 156608410269, !"islands_3"}211 212; CHECK-ENTRY-COUNT: = !{!"function_entry_count", i64 2}213