; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-islands.prof -S -o %t ; RUN: FileCheck %s < %t -check-prefix=CHECK-ENTRY-COUNT ; RUN: opt < %t -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s ; The test contains an isolated flow component ("island") that needs to be ; reconnected to the entry point via edges with a positive flow. ; The corresponding CFG is shown below: ; ; +--------+ +--------+ +----------+ ; | b6 [1] | <-- | b4 [1] | <-- | b1 [1] | ; +--------+ +--------+ +----------+ ; | | ; | | ; v v ; +--------+ +----------+ ; | b5 [0] | | b2 [100] | <+ ; +--------+ +----------+ | ; | | ; | | ; v | ; +----------+ | ; | b3 [100] | -+ ; +----------+ ; | ; | ; v ; +----------+ ; | b7 [0] | ; +----------+ ; Function Attrs: nounwind uwtable define dso_local i32 @islands_1(i32 %0, i32 %1) #0 { b1: call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 1, i32 0, i64 -1) %cmp = icmp ne i32 %0, 0 br i1 %cmp, label %b2, label %b4 ; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 2 b2: call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 2, i32 0, i64 -1) br label %b3 ; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 101 b3: call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 3, i32 0, i64 -1) br i1 %cmp, label %b2, label %b7 ; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 101 b4: call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 4, i32 0, i64 -1) br i1 %cmp, label %b5, label %b6 ; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 1 b5: call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 5, i32 0, i64 -1) ret i32 %1 ; CHECK: - b5: float = {{.*}}, int = {{.*}}, count = 0 b6: call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 6, i32 0, i64 -1) ret i32 %1 ; CHECK: - b6: float = {{.*}}, int = {{.*}}, count = 1 b7: call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 7, i32 0, i64 -1) ret i32 %1 ; CHECK: - b7: float = {{.*}}, int = {{.*}}, count = 1 } ; Another test with an island. ; ; +----------+ ; | b1 [0] | ; +----------+ ; | ; | ; v ; +----------+ ; | b2 [100] | <+ ; +----------+ | ; | | ; | | ; v | ; +----------+ | ; | b3 [100] | -+ ; +----------+ ; | ; | ; v ; +----------+ ; | b4 [0] | ; +----------+ ; Function Attrs: nounwind uwtable define dso_local i32 @islands_2(i32 %0, i32 %1) #1 { b1: call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 1, i32 0, i64 -1) %cmp = icmp ne i32 %0, 0 br label %b2 ; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 1 b2: call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 2, i32 0, i64 -1) br label %b3 ; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 10001 b3: call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 3, i32 0, i64 -1) br i1 %cmp, label %b2, label %b4 ; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 10001 b4: call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 4, i32 0, i64 -1) ret i32 %1 ; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 1 } ; The test verifies that the island is connected to the entry block via a ; cheapest path (that is, passing through blocks with large counts). ; ; +---------+ +---------+ +----------+ +--------+ ; | b8 [10] | <-- | b3 [10] | <-- | b1 [10] | --> | b4 [0] | ; +---------+ +---------+ +----------+ +--------+ ; | | | ; | | | ; | v | ; | +----------+ | ; | | b2 [0] | | ; | +----------+ | ; | | | ; | | | ; | v v ; | +-------------------------+ ; +-----------> | b5 [100] | ; +-------------------------+ ; | ^ ; | | ; v | ; +----------+ | ; | b6 [100] | -+ ; +----------+ ; | ; | ; v ; +----------+ ; | b7 [0] | ; +----------+ ; Function Attrs: nounwind uwtable define dso_local i32 @islands_3(i32 %0, i32 %1) #1 { b1: call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 1, i32 0, i64 -1) %cmp = icmp ne i32 %0, 0 switch i32 %1, label %b2 [ i32 1, label %b3 i32 2, label %b4 ] ; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 11 b2: call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 2, i32 0, i64 -1) br label %b5 ; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 0 b3: call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 3, i32 0, i64 -1) br i1 %cmp, label %b8, label %b5 ; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 11 b4: call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 4, i32 0, i64 -1) ret i32 %1 ; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 0 b5: call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 5, i32 0, i64 -1) br label %b6 ; CHECK: - b5: float = {{.*}}, int = {{.*}}, count = 1001 b6: call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 6, i32 0, i64 -1) br i1 %cmp, label %b7, label %b5 ; CHECK: - b6: float = {{.*}}, int = {{.*}}, count = 1001 b7: call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 7, i32 0, i64 -1) ret i32 %1 ; CHECK: - b7: float = {{.*}}, int = {{.*}}, count = 1 b8: call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 8, i32 0, i64 -1) ret i32 %1 ; CHECK: - b8: float = {{.*}}, int = {{.*}}, count = 10 } declare void @llvm.pseudoprobe(i64, i64, i32, i64) #2 attributes #0 = { noinline nounwind uwtable "use-sample-profile"} attributes #1 = { noinline nounwind uwtable "use-sample-profile"} attributes #2 = { nounwind } !llvm.pseudo_probe_desc = !{!7, !8} !7 = !{i64 -5646793257986063976, i64 120879332589, !"islands_1"} !8 = !{i64 -7683376842751444845, i64 69495280403, !"islands_2"} !9 = !{i64 -9095645063288297061, i64 156608410269, !"islands_3"} ; CHECK-ENTRY-COUNT: = !{!"function_entry_count", i64 2}