1; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-islands.prof -S -o %t 2; RUN: FileCheck %s < %t -check-prefix=CHECK-ENTRY-COUNT 3; RUN: opt < %t -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s 4 5 6; The test contains an isolated flow component ("island") that needs to be 7; 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 v 16; +--------+ +----------+ 17; | b5 [0] | | b2 [100] | <+ 18; +--------+ +----------+ | 19; | | 20; | | 21; v | 22; +----------+ | 23; | b3 [100] | -+ 24; +----------+ 25; | 26; | 27; v 28; +----------+ 29; | b7 [0] | 30; +----------+ 31 32 33; Function Attrs: nounwind uwtable 34define 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, 0 38 br i1 %cmp, label %b2, label %b4 39; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 2 40 41b2: 42 call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 2, i32 0, i64 -1) 43 br label %b3 44; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 101 45 46b3: 47 call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 3, i32 0, i64 -1) 48 br i1 %cmp, label %b2, label %b7 49; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 101 50 51b4: 52 call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 4, i32 0, i64 -1) 53 br i1 %cmp, label %b5, label %b6 54; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 1 55 56b5: 57 call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 5, i32 0, i64 -1) 58 ret i32 %1 59; CHECK: - b5: float = {{.*}}, int = {{.*}}, count = 0 60 61b6: 62 call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 6, i32 0, i64 -1) 63 ret i32 %1 64; CHECK: - b6: float = {{.*}}, int = {{.*}}, count = 1 65 66b7: 67 call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 7, i32 0, i64 -1) 68 ret i32 %1 69; CHECK: - b7: float = {{.*}}, int = {{.*}}, count = 1 70 71} 72 73; Another test with an island. 74; 75; +----------+ 76; | b1 [0] | 77; +----------+ 78; | 79; | 80; v 81; +----------+ 82; | b2 [100] | <+ 83; +----------+ | 84; | | 85; | | 86; v | 87; +----------+ | 88; | b3 [100] | -+ 89; +----------+ 90; | 91; | 92; v 93; +----------+ 94; | b4 [0] | 95; +----------+ 96 97; Function Attrs: nounwind uwtable 98define 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, 0 102 br label %b2 103; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 1 104 105b2: 106 call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 2, i32 0, i64 -1) 107 br label %b3 108; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 10001 109 110b3: 111 call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 3, i32 0, i64 -1) 112 br i1 %cmp, label %b2, label %b4 113; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 10001 114 115b4: 116 call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 4, i32 0, i64 -1) 117 ret i32 %1 118; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 1 119} 120 121 122; The test verifies that the island is connected to the entry block via a 123; 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 v 137; | +-------------------------+ 138; +-----------> | b5 [100] | 139; +-------------------------+ 140; | ^ 141; | | 142; v | 143; +----------+ | 144; | b6 [100] | -+ 145; +----------+ 146; | 147; | 148; v 149; +----------+ 150; | b7 [0] | 151; +----------+ 152 153; Function Attrs: nounwind uwtable 154define 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, 0 158 switch i32 %1, label %b2 [ 159 i32 1, label %b3 160 i32 2, label %b4 161 ] 162; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 11 163 164b2: 165 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 2, i32 0, i64 -1) 166 br label %b5 167; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 0 168 169b3: 170 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 3, i32 0, i64 -1) 171 br i1 %cmp, label %b8, label %b5 172; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 11 173 174b4: 175 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 4, i32 0, i64 -1) 176 ret i32 %1 177; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 0 178 179b5: 180 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 5, i32 0, i64 -1) 181 br label %b6 182; CHECK: - b5: float = {{.*}}, int = {{.*}}, count = 1001 183 184b6: 185 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 6, i32 0, i64 -1) 186 br i1 %cmp, label %b7, label %b5 187; CHECK: - b6: float = {{.*}}, int = {{.*}}, count = 1001 188 189b7: 190 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 7, i32 0, i64 -1) 191 ret i32 %1 192; CHECK: - b7: float = {{.*}}, int = {{.*}}, count = 1 193 194b8: 195 call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 8, i32 0, i64 -1) 196 ret i32 %1 197; CHECK: - b8: float = {{.*}}, int = {{.*}}, count = 10 198} 199 200declare void @llvm.pseudoprobe(i64, i64, i32, i64) #2 201 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