213 lines
7.1 KiB
LLVM
213 lines
7.1 KiB
LLVM
; 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}
|