Mircea Trofin 93b74f7178
[ctxprof] Scale up everything under a root by its TotalRootEntryCount (#136015)
`TotalRootEntryCount` captures how many times that root was entered - regardless if a profile was also collected or not (profile collection for a given root happens on only one thread at a time).

We don't do this in compiler_rt because the goal there is to flush out the data as fast as possible, so traversing and multiplying vectors is punted to the profile user.

We really just need to do this when flattening the profile so that the values across roots and flat profiles match. We could do it earlier, too - like when loading the profile - but it seems beneficial (at least for debugging) to keep the counter values the same as the loaded ones. We can revisit this later.
2025-04-21 08:43:21 -07:00

95 lines
3.3 KiB
LLVM

; REQUIRES: asserts && x86_64-linux
; Check that the profile annotator works: we hit an exit and non-zero paths to
; already visited blocks count as taken (i.e. the flow continues through them).
;
; RUN: split-file %s %t
; RUN: llvm-ctxprof-util fromYAML --input=%t/profile_ok.yaml --output=%t/profile_ok.ctxprofdata
; RUN: llvm-ctxprof-util fromYAML --input=%t/profile_pump.yaml --output=%t/profile_pump.ctxprofdata
; RUN: llvm-ctxprof-util fromYAML --input=%t/profile_unreachable.yaml --output=%t/profile_unreachable.ctxprofdata
;
; RUN: opt -passes=ctx-prof-flatten %t/example_ok.ll -ctx-profile-force-is-specialized -use-ctx-profile=%t/profile_ok.ctxprofdata -S -o - | FileCheck %s
; RUN: not --crash opt -passes=ctx-prof-flatten %t/message_pump.ll -ctx-profile-force-is-specialized -use-ctx-profile=%t/profile_pump.ctxprofdata -S 2>&1 | FileCheck %s --check-prefix=ASSERTION
; RUN: not --crash opt -passes=ctx-prof-flatten %t/unreachable.ll -ctx-profile-force-is-specialized -use-ctx-profile=%t/profile_unreachable.ctxprofdata -S 2>&1 | FileCheck %s --check-prefix=ASSERTION
; CHECK: br i1 %x, label %b1, label %exit, !prof ![[PROF1:[0-9]+]]
; CHECK: br i1 %y, label %blk, label %exit, !prof ![[PROF2:[0-9]+]]
; CHECK: ![[PROF1]] = !{!"branch_weights", i32 2, i32 2}
; CHECK: ![[PROF2]] = !{!"branch_weights", i32 0, i32 2}
; ASSERTION: Assertion `allTakenPathsExit()
; b1->exit is the only way out from b1, but the exit block would have been
; already visited from blk. That should not result in an assertion, though.
;--- example_ok.ll
define void @foo(i32 %t) !guid !0 {
entry:
call void @llvm.instrprof.increment(ptr @foo, i64 42, i32 42, i32 0)
br label %blk
blk:
call void @llvm.instrprof.increment(ptr @foo, i64 42, i32 42, i32 1)
%x = icmp eq i32 %t, 0
br i1 %x, label %b1, label %exit
b1:
call void @llvm.instrprof.increment(ptr @foo, i64 42, i32 42, i32 2)
%y = icmp eq i32 %t, 0
br i1 %y, label %blk, label %exit
exit:
call void @llvm.instrprof.increment(ptr @foo, i64 42, i32 42, i32 3)
ret void
}
!0 = !{i64 1234}
;--- profile_ok.yaml
Contexts:
- Guid: 1234
TotalRootEntryCount: 2
Counters: [2, 2, 1, 2]
;--- message_pump.ll
; This is a message pump: the loop never exits. This should result in an
; assertion because we can't reach an exit BB
define void @foo(i32 %t) !guid !0 {
entry:
call void @llvm.instrprof.increment(ptr @foo, i64 42, i32 42, i32 0)
br label %blk
blk:
call void @llvm.instrprof.increment(ptr @foo, i64 42, i32 42, i32 1)
%x = icmp eq i32 %t, 0
br i1 %x, label %blk, label %exit
exit:
call void @llvm.instrprof.increment(ptr @foo, i64 42, i32 42, i32 2)
ret void
}
!0 = !{i64 1234}
;--- profile_pump.yaml
Contexts:
- Guid: 1234
TotalRootEntryCount: 2
Counters: [2, 10, 0]
;--- unreachable.ll
; An unreachable block is reached, that's an error
define void @foo(i32 %t) !guid !0 {
entry:
call void @llvm.instrprof.increment(ptr @foo, i64 42, i32 42, i32 0)
br label %blk
blk:
call void @llvm.instrprof.increment(ptr @foo, i64 42, i32 42, i32 1)
%x = icmp eq i32 %t, 0
br i1 %x, label %b1, label %exit
b1:
call void @llvm.instrprof.increment(ptr @foo, i64 42, i32 42, i32 2)
unreachable
exit:
call void @llvm.instrprof.increment(ptr @foo, i64 42, i32 42, i32 3)
ret void
}
!0 = !{i64 1234}
;--- profile_unreachable.yaml
Contexts:
- Guid: 1234
TotalRootEntryCount: 2
Counters: [2, 1, 1, 2]