When we collect a contextual profile, we sample the threads entering its root and only collect on one at a time (see `ContextRoot::Taken`). If we want to compare profiles between contextual profiles, and/or flat profiles, we have a problem: we don't know how to compare the counter values relative to each other. To that end, we add `ContextRoot::TotalEntries`, which is incremented every time a root is entered and serves as multiplier for the counter values collected under that root. We expose this in the profile and leave the normalization to the user of the profile, for a few reasons: * it's only needed if reasoning about all profiles in aggregate. * the goal, in compiler_rt, is to flush out the profile as quickly as possible, and performing multiplications adds an overhead that may not even be necessary if the consumer of the profile doesn't care about combining profiles * the information itself may be interesting as an indication of relative sampling of various contexts.
102 lines
2.9 KiB
LLVM
102 lines
2.9 KiB
LLVM
; REQUIRES: x86_64-linux
|
|
;
|
|
; RUN: rm -rf %t
|
|
; RUN: split-file %s %t
|
|
; RUN: llvm-ctxprof-util fromYAML --input=%t/profile.yaml --output=%t/profile.ctxprofdata
|
|
; RUN: opt -passes='require<ctx-prof-analysis>,print<ctx-prof-analysis>' -ctx-profile-printer-level=everything \
|
|
; RUN: %t/example.ll -S 2>&1 | FileCheck %s --check-prefix=NO-CTX
|
|
|
|
; RUN: not opt -passes='require<ctx-prof-analysis>,print<ctx-prof-analysis>' -ctx-profile-printer-level=everything \
|
|
; RUN: -use-ctx-profile=does_not_exist.ctxprofdata %t/example.ll -S 2>&1 | FileCheck %s --check-prefix=NO-FILE
|
|
|
|
; RUN: opt -module-summary -passes='thinlto-pre-link<O2>' \
|
|
; RUN: -use-ctx-profile=%t/profile.ctxprofdata %t/example.ll -S -o %t/prelink.ll
|
|
|
|
; RUN: opt -module-summary -passes='thinlto-pre-link<O2>' -use-ctx-profile=%t/profile.ctxprofdata \
|
|
; RUN: %t/example.ll -S -o %t/prelink.ll
|
|
; RUN: opt -passes='require<ctx-prof-analysis>,print<ctx-prof-analysis>' -ctx-profile-printer-level=everything \
|
|
; RUN: -use-ctx-profile=%t/profile.ctxprofdata %t/prelink.ll -S 2> %t/output.txt
|
|
; RUN: diff %t/expected-profile-output.txt %t/output.txt
|
|
|
|
; NO-FILE: error: could not open contextual profile file
|
|
; NO-CTX: No contextual profile was provided
|
|
;
|
|
; This is the reference profile, laid out in the format the json formatter will
|
|
; output it from opt.
|
|
;--- profile.yaml
|
|
Contexts:
|
|
- Guid: 12341
|
|
TotalRootEntryCount: 90
|
|
Counters: [9]
|
|
- Guid: 12074870348631550642
|
|
TotalRootEntryCount: 24
|
|
Counters: [5]
|
|
- Guid: 11872291593386833696
|
|
TotalRootEntryCount: 4
|
|
Counters: [1]
|
|
Callsites: -
|
|
- Guid: 728453322856651412
|
|
Counters: [6, 7]
|
|
;--- expected-profile-output.txt
|
|
Function Info:
|
|
4909520559318251808 : an_entrypoint. MaxCounterID: 2. MaxCallsiteID: 1
|
|
11872291593386833696 : foo. MaxCounterID: 1. MaxCallsiteID: 1
|
|
12074870348631550642 : another_entrypoint_no_callees. MaxCounterID: 1. MaxCallsiteID: 0
|
|
|
|
Current Profile:
|
|
|
|
Contexts:
|
|
- Guid: 11872291593386833696
|
|
TotalRootEntryCount: 4
|
|
Counters: [ 1 ]
|
|
Callsites:
|
|
- - Guid: 728453322856651412
|
|
Counters: [ 6, 7 ]
|
|
- Guid: 12074870348631550642
|
|
TotalRootEntryCount: 24
|
|
Counters: [ 5 ]
|
|
|
|
Flat Profile:
|
|
728453322856651412 : 6 7
|
|
11872291593386833696 : 1
|
|
12074870348631550642 : 5
|
|
;--- example.ll
|
|
declare void @bar()
|
|
|
|
define private void @foo(i32 %a, ptr %fct) #0 !guid !0 {
|
|
%t = icmp eq i32 %a, 0
|
|
br i1 %t, label %yes, label %no
|
|
yes:
|
|
call void %fct(i32 %a)
|
|
br label %exit
|
|
no:
|
|
call void @bar()
|
|
br label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
define void @an_entrypoint(i32 %a) {
|
|
%t = icmp eq i32 %a, 0
|
|
br i1 %t, label %yes, label %no
|
|
|
|
yes:
|
|
call void @foo(i32 1, ptr null)
|
|
ret void
|
|
no:
|
|
ret void
|
|
}
|
|
|
|
define void @another_entrypoint_no_callees(i32 %a) {
|
|
%t = icmp eq i32 %a, 0
|
|
br i1 %t, label %yes, label %no
|
|
|
|
yes:
|
|
ret void
|
|
no:
|
|
ret void
|
|
}
|
|
|
|
attributes #0 = { noinline }
|
|
!0 = !{ i64 11872291593386833696 }
|