198dd2f9eSspupyrev; RUN: opt < %s -passes=pseudo-probe,sample-profile -sample-profile-use-profi -sample-profile-file=%S/Inputs/profile-inference-islands.prof -S -o %t 298dd2f9eSspupyrev; RUN: FileCheck %s < %t -check-prefix=CHECK-ENTRY-COUNT 3*f72b76cdSArthur Eubanks; RUN: opt < %t -passes='print<block-freq>' -disable-output 2>&1 | FileCheck %s 498dd2f9eSspupyrev 598dd2f9eSspupyrev 698dd2f9eSspupyrev; The test contains an isolated flow component ("island") that needs to be 798dd2f9eSspupyrev; reconnected to the entry point via edges with a positive flow. 898dd2f9eSspupyrev; The corresponding CFG is shown below: 998dd2f9eSspupyrev; 1098dd2f9eSspupyrev; +--------+ +--------+ +----------+ 1198dd2f9eSspupyrev; | b6 [1] | <-- | b4 [1] | <-- | b1 [1] | 1298dd2f9eSspupyrev; +--------+ +--------+ +----------+ 1398dd2f9eSspupyrev; | | 1498dd2f9eSspupyrev; | | 1598dd2f9eSspupyrev; v v 1698dd2f9eSspupyrev; +--------+ +----------+ 1798dd2f9eSspupyrev; | b5 [0] | | b2 [100] | <+ 1898dd2f9eSspupyrev; +--------+ +----------+ | 1998dd2f9eSspupyrev; | | 2098dd2f9eSspupyrev; | | 2198dd2f9eSspupyrev; v | 2298dd2f9eSspupyrev; +----------+ | 2398dd2f9eSspupyrev; | b3 [100] | -+ 2498dd2f9eSspupyrev; +----------+ 2598dd2f9eSspupyrev; | 2698dd2f9eSspupyrev; | 2798dd2f9eSspupyrev; v 2898dd2f9eSspupyrev; +----------+ 2998dd2f9eSspupyrev; | b7 [0] | 3098dd2f9eSspupyrev; +----------+ 3198dd2f9eSspupyrev 3298dd2f9eSspupyrev 3398dd2f9eSspupyrev; Function Attrs: nounwind uwtable 3498dd2f9eSspupyrevdefine dso_local i32 @islands_1(i32 %0, i32 %1) #0 { 3598dd2f9eSspupyrevb1: 3698dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 1, i32 0, i64 -1) 3798dd2f9eSspupyrev %cmp = icmp ne i32 %0, 0 3898dd2f9eSspupyrev br i1 %cmp, label %b2, label %b4 3998dd2f9eSspupyrev; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 2 4098dd2f9eSspupyrev 4198dd2f9eSspupyrevb2: 4298dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 2, i32 0, i64 -1) 4398dd2f9eSspupyrev br label %b3 4498dd2f9eSspupyrev; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 101 4598dd2f9eSspupyrev 4698dd2f9eSspupyrevb3: 4798dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 3, i32 0, i64 -1) 4898dd2f9eSspupyrev br i1 %cmp, label %b2, label %b7 4998dd2f9eSspupyrev; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 101 5098dd2f9eSspupyrev 5198dd2f9eSspupyrevb4: 5298dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 4, i32 0, i64 -1) 5398dd2f9eSspupyrev br i1 %cmp, label %b5, label %b6 5498dd2f9eSspupyrev; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 1 5598dd2f9eSspupyrev 5698dd2f9eSspupyrevb5: 5798dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 5, i32 0, i64 -1) 5898dd2f9eSspupyrev ret i32 %1 5998dd2f9eSspupyrev; CHECK: - b5: float = {{.*}}, int = {{.*}}, count = 0 6098dd2f9eSspupyrev 6198dd2f9eSspupyrevb6: 6298dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 6, i32 0, i64 -1) 6398dd2f9eSspupyrev ret i32 %1 6498dd2f9eSspupyrev; CHECK: - b6: float = {{.*}}, int = {{.*}}, count = 1 6598dd2f9eSspupyrev 6698dd2f9eSspupyrevb7: 6798dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -5646793257986063976, i64 7, i32 0, i64 -1) 6898dd2f9eSspupyrev ret i32 %1 6998dd2f9eSspupyrev; CHECK: - b7: float = {{.*}}, int = {{.*}}, count = 1 7098dd2f9eSspupyrev 7198dd2f9eSspupyrev} 7298dd2f9eSspupyrev 7398dd2f9eSspupyrev; Another test with an island. 7498dd2f9eSspupyrev; 7598dd2f9eSspupyrev; +----------+ 7698dd2f9eSspupyrev; | b1 [0] | 7798dd2f9eSspupyrev; +----------+ 7898dd2f9eSspupyrev; | 7998dd2f9eSspupyrev; | 8098dd2f9eSspupyrev; v 8198dd2f9eSspupyrev; +----------+ 8298dd2f9eSspupyrev; | b2 [100] | <+ 8398dd2f9eSspupyrev; +----------+ | 8498dd2f9eSspupyrev; | | 8598dd2f9eSspupyrev; | | 8698dd2f9eSspupyrev; v | 8798dd2f9eSspupyrev; +----------+ | 8898dd2f9eSspupyrev; | b3 [100] | -+ 8998dd2f9eSspupyrev; +----------+ 9098dd2f9eSspupyrev; | 9198dd2f9eSspupyrev; | 9298dd2f9eSspupyrev; v 9398dd2f9eSspupyrev; +----------+ 9498dd2f9eSspupyrev; | b4 [0] | 9598dd2f9eSspupyrev; +----------+ 9698dd2f9eSspupyrev 9798dd2f9eSspupyrev; Function Attrs: nounwind uwtable 9898dd2f9eSspupyrevdefine dso_local i32 @islands_2(i32 %0, i32 %1) #1 { 9998dd2f9eSspupyrevb1: 10098dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 1, i32 0, i64 -1) 10198dd2f9eSspupyrev %cmp = icmp ne i32 %0, 0 10298dd2f9eSspupyrev br label %b2 10398dd2f9eSspupyrev; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 1 10498dd2f9eSspupyrev 10598dd2f9eSspupyrevb2: 10698dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 2, i32 0, i64 -1) 10798dd2f9eSspupyrev br label %b3 10898dd2f9eSspupyrev; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 10001 10998dd2f9eSspupyrev 11098dd2f9eSspupyrevb3: 11198dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 3, i32 0, i64 -1) 11298dd2f9eSspupyrev br i1 %cmp, label %b2, label %b4 11398dd2f9eSspupyrev; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 10001 11498dd2f9eSspupyrev 11598dd2f9eSspupyrevb4: 11698dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -7683376842751444845, i64 4, i32 0, i64 -1) 11798dd2f9eSspupyrev ret i32 %1 11898dd2f9eSspupyrev; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 1 11998dd2f9eSspupyrev} 12098dd2f9eSspupyrev 12198dd2f9eSspupyrev 12298dd2f9eSspupyrev; The test verifies that the island is connected to the entry block via a 12398dd2f9eSspupyrev; cheapest path (that is, passing through blocks with large counts). 12498dd2f9eSspupyrev; 12598dd2f9eSspupyrev; +---------+ +---------+ +----------+ +--------+ 12698dd2f9eSspupyrev; | b8 [10] | <-- | b3 [10] | <-- | b1 [10] | --> | b4 [0] | 12798dd2f9eSspupyrev; +---------+ +---------+ +----------+ +--------+ 12898dd2f9eSspupyrev; | | | 12998dd2f9eSspupyrev; | | | 13098dd2f9eSspupyrev; | v | 13198dd2f9eSspupyrev; | +----------+ | 13298dd2f9eSspupyrev; | | b2 [0] | | 13398dd2f9eSspupyrev; | +----------+ | 13498dd2f9eSspupyrev; | | | 13598dd2f9eSspupyrev; | | | 13698dd2f9eSspupyrev; | v v 13798dd2f9eSspupyrev; | +-------------------------+ 13898dd2f9eSspupyrev; +-----------> | b5 [100] | 13998dd2f9eSspupyrev; +-------------------------+ 14098dd2f9eSspupyrev; | ^ 14198dd2f9eSspupyrev; | | 14298dd2f9eSspupyrev; v | 14398dd2f9eSspupyrev; +----------+ | 14498dd2f9eSspupyrev; | b6 [100] | -+ 14598dd2f9eSspupyrev; +----------+ 14698dd2f9eSspupyrev; | 14798dd2f9eSspupyrev; | 14898dd2f9eSspupyrev; v 14998dd2f9eSspupyrev; +----------+ 15098dd2f9eSspupyrev; | b7 [0] | 15198dd2f9eSspupyrev; +----------+ 15298dd2f9eSspupyrev 15398dd2f9eSspupyrev; Function Attrs: nounwind uwtable 15498dd2f9eSspupyrevdefine dso_local i32 @islands_3(i32 %0, i32 %1) #1 { 15598dd2f9eSspupyrevb1: 15698dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 1, i32 0, i64 -1) 15798dd2f9eSspupyrev %cmp = icmp ne i32 %0, 0 15898dd2f9eSspupyrev switch i32 %1, label %b2 [ 15998dd2f9eSspupyrev i32 1, label %b3 16098dd2f9eSspupyrev i32 2, label %b4 16198dd2f9eSspupyrev ] 16298dd2f9eSspupyrev; CHECK: - b1: float = {{.*}}, int = {{.*}}, count = 11 16398dd2f9eSspupyrev 16498dd2f9eSspupyrevb2: 16598dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 2, i32 0, i64 -1) 16698dd2f9eSspupyrev br label %b5 16798dd2f9eSspupyrev; CHECK: - b2: float = {{.*}}, int = {{.*}}, count = 0 16898dd2f9eSspupyrev 16998dd2f9eSspupyrevb3: 17098dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 3, i32 0, i64 -1) 17198dd2f9eSspupyrev br i1 %cmp, label %b8, label %b5 17298dd2f9eSspupyrev; CHECK: - b3: float = {{.*}}, int = {{.*}}, count = 11 17398dd2f9eSspupyrev 17498dd2f9eSspupyrevb4: 17598dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 4, i32 0, i64 -1) 17698dd2f9eSspupyrev ret i32 %1 17798dd2f9eSspupyrev; CHECK: - b4: float = {{.*}}, int = {{.*}}, count = 0 17898dd2f9eSspupyrev 17998dd2f9eSspupyrevb5: 18098dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 5, i32 0, i64 -1) 18198dd2f9eSspupyrev br label %b6 18298dd2f9eSspupyrev; CHECK: - b5: float = {{.*}}, int = {{.*}}, count = 1001 18398dd2f9eSspupyrev 18498dd2f9eSspupyrevb6: 18598dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 6, i32 0, i64 -1) 18698dd2f9eSspupyrev br i1 %cmp, label %b7, label %b5 18798dd2f9eSspupyrev; CHECK: - b6: float = {{.*}}, int = {{.*}}, count = 1001 18898dd2f9eSspupyrev 18998dd2f9eSspupyrevb7: 19098dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 7, i32 0, i64 -1) 19198dd2f9eSspupyrev ret i32 %1 19298dd2f9eSspupyrev; CHECK: - b7: float = {{.*}}, int = {{.*}}, count = 1 19398dd2f9eSspupyrev 19498dd2f9eSspupyrevb8: 19598dd2f9eSspupyrev call void @llvm.pseudoprobe(i64 -9095645063288297061, i64 8, i32 0, i64 -1) 19698dd2f9eSspupyrev ret i32 %1 19798dd2f9eSspupyrev; CHECK: - b8: float = {{.*}}, int = {{.*}}, count = 10 19898dd2f9eSspupyrev} 19998dd2f9eSspupyrev 20098dd2f9eSspupyrevdeclare void @llvm.pseudoprobe(i64, i64, i32, i64) #2 20198dd2f9eSspupyrev 20298dd2f9eSspupyrevattributes #0 = { noinline nounwind uwtable "use-sample-profile"} 20398dd2f9eSspupyrevattributes #1 = { noinline nounwind uwtable "use-sample-profile"} 20498dd2f9eSspupyrevattributes #2 = { nounwind } 20598dd2f9eSspupyrev 20698dd2f9eSspupyrev!llvm.pseudo_probe_desc = !{!7, !8} 20798dd2f9eSspupyrev 20898dd2f9eSspupyrev!7 = !{i64 -5646793257986063976, i64 120879332589, !"islands_1"} 20998dd2f9eSspupyrev!8 = !{i64 -7683376842751444845, i64 69495280403, !"islands_2"} 21098dd2f9eSspupyrev!9 = !{i64 -9095645063288297061, i64 156608410269, !"islands_3"} 21198dd2f9eSspupyrev 21298dd2f9eSspupyrev; CHECK-ENTRY-COUNT: = !{!"function_entry_count", i64 2} 213