; 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}