Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions llvm/include/llvm/ProfileData/SampleProf.h
Original file line number Diff line number Diff line change
Expand Up @@ -868,6 +868,17 @@ class FunctionSamples {
}
}

// Propagate the given attribute to this profile context and all callee
// contexts.
void setContextAttribute(ContextAttributeMask Attr) {
Context.setAttribute(Attr);
for (auto &I : CallsiteSamples) {
for (auto &CS : I.second) {
CS.second.setContextAttribute(Attr);
}
}
}

// Query the stale profile matching results and remap the location.
const LineLocation &mapIRLocToProfileLoc(const LineLocation &IRLoc) const {
// There is no remapping if the profile is not stale or the matching gives
Expand Down
25 changes: 24 additions & 1 deletion llvm/test/tools/llvm-profgen/inline-cs-pseudoprobe.test
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-UNWINDER-OFFSET2
; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-pseudoprobe.perfscript --binary=%S/Inputs/inline-cs-pseudoprobe.perfbin --output=%t --profile-summary-cold-count=0 --csspgo-preinliner=0 --gen-cs-nested-profile=0
; RUN: FileCheck %s --input-file %t
; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-pseudoprobe.perfscript --binary=%S/Inputs/inline-cs-pseudoprobe.perfbin --output=%t --profile-summary-cold-count=0 --csspgo-preinliner=0 --gen-cs-nested-profile=0 --force-profile-preinlined
; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-FORCE-PREINLINED


; CHECK: [main:2 @ foo]:74:0
; CHECK-NEXT: 1: 0
Expand All @@ -18,10 +21,30 @@
; CHECK-NEXT: 8: 14 bar:14
; CHECK-NEXT: 9: 0
; CHECK-NEXT: !CFGChecksum: 563088904013236
; CHECK:[main:2 @ foo:8 @ bar]:28:14
; CHECK-NEXT: !Attributes: 1
; CHECK-NEXT:[main:2 @ foo:8 @ bar]:28:14
; CHECK-NEXT: 1: 14
; CHECK-NEXT: 4: 14
; CHECK-NEXT: !CFGChecksum: 72617220756
; CHECK-NEXT: !Attributes: 1

; CHECK-FORCE-PREINLINED: [main:2 @ foo]:74:0
; CHECK-FORCE-PREINLINED-NEXT: 1: 0
; CHECK-FORCE-PREINLINED-NEXT: 2: 15
; CHECK-FORCE-PREINLINED-NEXT: 3: 15
; CHECK-FORCE-PREINLINED-NEXT: 4: 14
; CHECK-FORCE-PREINLINED-NEXT: 5: 1
; CHECK-FORCE-PREINLINED-NEXT: 6: 15
; CHECK-FORCE-PREINLINED-NEXT: 7: 0
; CHECK-FORCE-PREINLINED-NEXT: 8: 14 bar:14
; CHECK-FORCE-PREINLINED-NEXT: 9: 0
; CHECK-FORCE-PREINLINED-NEXT: !CFGChecksum: 563088904013236
; CHECK-FORCE-PREINLINED-NEXT: !Attributes: 3
; CHECK-FORCE-PREINLINED-NEXT:[main:2 @ foo:8 @ bar]:28:14
; CHECK-FORCE-PREINLINED-NEXT: 1: 14
; CHECK-FORCE-PREINLINED-NEXT: 4: 14
; CHECK-FORCE-PREINLINED-NEXT: !CFGChecksum: 72617220756
; CHECK-FORCE-PREINLINED-NEXT: !Attributes: 3

; CHECK-UNWINDER: 3
; CHECK-UNWINDER-NEXT: 201800-201858:1
Expand Down
50 changes: 36 additions & 14 deletions llvm/test/tools/llvm-profgen/inline-noprobe.test
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,48 @@
; RUN: FileCheck %s --input-file %t1 --check-prefix=CHECK-UPDATE-TOTAL-SAMPLE
; RUN: llvm-profgen --format=text --use-dwarf-correlation --perfscript=%S/Inputs/inline-noprobe.perfscript --binary=%S/Inputs/inline-noprobe.perfbin --output=%t
; RUN: FileCheck %s --input-file %t --check-prefix=CHECK
; RUN: llvm-profgen --format=text --use-dwarf-correlation --perfscript=%S/Inputs/inline-noprobe.perfscript --binary=%S/Inputs/inline-noprobe.perfbin --output=%t --force-profile-preinlined
; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-FORCE-PREINLINED

; RUN: echo -e "0\n0" > %t
; RUN: llvm-profgen --format=text --unsymbolized-profile=%t --binary=%S/Inputs/inline-noprobe.perfbin --output=%t1 --fill-zero-for-all-funcs
; RUN: FileCheck %s --input-file %t1 --check-prefix=CHECK-ALL-ZERO
; RUN: llvm-profgen --format=text --unsymbolized-profile=%S/Inputs/out-of-bounds.raw.prof --binary=%S/Inputs/inline-noprobe.perfbin --output=%t1
; RUN: FileCheck %s --input-file %t1 --check-prefix=CHECK-OB

CHECK: main:2609:0
CHECK: 0: 0
CHECK: 2: 0
CHECK: 1: foo:2609
CHECK: 2.1: 42
CHECK: 3: 62
CHECK: 3.2: 21
CHECK: 4: 0
CHECK: 65526: 62
CHECK: 3.1: bar:546
CHECK: 1: 42
CHECK: 65533: 42
CHECK: 3.2: bar:189
CHECK: 1: 21
CHECK: main:2609:0
CHECK-NEXT: 0: 0
CHECK-NEXT: 2: 0
CHECK-NEXT: 1: foo:2609
CHECK-NEXT: 2.1: 42
CHECK-NEXT: 3: 62
CHECK-NEXT: 3.2: 21
CHECK-NEXT: 4: 0
CHECK-NEXT: 65526: 62
CHECK-NEXT: 3.1: bar:546
CHECK-NEXT: 1: 42
CHECK-NEXT: 65533: 42
CHECK-NEXT: 3.2: bar:189
CHECK-NEXT: 1: 21

CHECK-FORCE-PREINLINED: main:2609:0
CHECK-FORCE-PREINLINED-NEXT: 0: 0
CHECK-FORCE-PREINLINED-NEXT: 2: 0
CHECK-FORCE-PREINLINED-NEXT: 1: foo:2609
CHECK-FORCE-PREINLINED-NEXT: 2.1: 42
CHECK-FORCE-PREINLINED-NEXT: 3: 62
CHECK-FORCE-PREINLINED-NEXT: 3.2: 21
CHECK-FORCE-PREINLINED-NEXT: 4: 0
CHECK-FORCE-PREINLINED-NEXT: 65526: 62
CHECK-FORCE-PREINLINED-NEXT: 3.1: bar:546
CHECK-FORCE-PREINLINED-NEXT: 1: 42
CHECK-FORCE-PREINLINED-NEXT: 65533: 42
CHECK-FORCE-PREINLINED-NEXT: !Attributes: 2
CHECK-FORCE-PREINLINED-NEXT: 3.2: bar:189
CHECK-FORCE-PREINLINED-NEXT: 1: 21
CHECK-FORCE-PREINLINED-NEXT: !Attributes: 2
CHECK-FORCE-PREINLINED-NEXT: !Attributes: 2
CHECK-FORCE-PREINLINED-NEXT: !Attributes: 2

CHECK-UPDATE-TOTAL-SAMPLE: main:292:0
CHECK-UPDATE-TOTAL-SAMPLE: 0: 0
Expand Down
22 changes: 22 additions & 0 deletions llvm/test/tools/llvm-profgen/inline-pseudoprobe.test
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
; RUN: llvm-profgen --format=text --ignore-stack-samples --perfscript=%S/Inputs/inline-cs-pseudoprobe.perfscript --binary=%S/Inputs/inline-cs-pseudoprobe.perfbin --output=%t --profile-summary-cold-count=0
; RUN: FileCheck %s --input-file %t
; RUN: llvm-profgen --format=text --ignore-stack-samples --perfscript=%S/Inputs/inline-cs-pseudoprobe.perfscript --binary=%S/Inputs/inline-cs-pseudoprobe.perfbin --output=%t1 --profile-summary-cold-count=0 --force-profile-preinlined
; RUN: FileCheck %s --input-file %t1 --check-prefix=CHECK-FORCE-PREINLINED

; CHECK: main:88:0
; CHECK-NEXT: 1: 0
Expand All @@ -19,6 +21,26 @@
; CHECK-NEXT: !CFGChecksum: 563088904013236
; CHECK-NEXT: !CFGChecksum: 281479271677951

; CHECK-FORCE-PREINLINED: main:88:0
; CHECK-FORCE-PREINLINED-NEXT: 1: 0
; CHECK-FORCE-PREINLINED-NEXT: 2: foo:88
; CHECK-FORCE-PREINLINED-NEXT: 1: 0
; CHECK-FORCE-PREINLINED-NEXT: 2: 15
; CHECK-FORCE-PREINLINED-NEXT: 3: 15
; CHECK-FORCE-PREINLINED-NEXT: 4: 14
; CHECK-FORCE-PREINLINED-NEXT: 5: 1
; CHECK-FORCE-PREINLINED-NEXT: 6: 15
; CHECK-FORCE-PREINLINED-NEXT: 7: 0
; CHECK-FORCE-PREINLINED-NEXT: 9: 0
; CHECK-FORCE-PREINLINED-NEXT: 8: bar:28
; CHECK-FORCE-PREINLINED-NEXT: 1: 14
; CHECK-FORCE-PREINLINED-NEXT: 4: 14
; CHECK-FORCE-PREINLINED-NEXT: !CFGChecksum: 72617220756
; CHECK-FORCE-PREINLINED-NEXT: !Attributes: 2
; CHECK-FORCE-PREINLINED-NEXT: !CFGChecksum: 563088904013236
; CHECK-FORCE-PREINLINED-NEXT: !Attributes: 2
; CHECK-FORCE-PREINLINED-NEXT: !CFGChecksum: 281479271677951
; CHECK-FORCE-PREINLINED-NEXT: !Attributes: 2

; clang -O3 -fuse-ld=lld -fpseudo-probe-for-profiling
; -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer -Xclang -mdisable-tail-calls
Expand Down
16 changes: 16 additions & 0 deletions llvm/tools/llvm-profgen/ProfileGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,12 @@ static cl::opt<bool>
"than threshold, it will be trimmed."),
cl::cat(ProfGenCategory));

static cl::opt<bool> ForceProfilePreinlined(
"force-profile-preinlined",
cl::desc("Force marking all function samples as preinlined(set "
"ContextShouldBeInlined attribute)."),
cl::init(false));

static cl::opt<bool> CSProfMergeColdContext(
"csprof-merge-cold-context", cl::init(true),
cl::desc("If the total count of context profile is smaller than "
Expand Down Expand Up @@ -511,10 +517,18 @@ void ProfileGenerator::generateProfile() {
postProcessProfiles();
}

void ProfileGeneratorBase::markProfilePreinlined(SampleProfileMap &ProfileMap) {
for (auto &I : ProfileMap)
I.second.setContextAttribute(ContextShouldBeInlined);
FunctionSamples::ProfileIsPreInlined = true;
}

void ProfileGenerator::postProcessProfiles() {
computeSummaryAndThreshold(ProfileMap);
trimColdProfiles(ProfileMap, ColdCountThreshold);
filterAmbiguousProfile(ProfileMap);
if (ForceProfilePreinlined)
markProfilePreinlined(ProfileMap);
calculateAndShowDensity(ProfileMap);
}

Expand Down Expand Up @@ -1130,6 +1144,8 @@ void CSProfileGenerator::postProcessProfiles() {
FunctionSamples::ProfileIsCS = false;
}
filterAmbiguousProfile(ProfileMap);
if (ForceProfilePreinlined)
markProfilePreinlined(ProfileMap);
ProfileGeneratorBase::calculateAndShowDensity(ProfileMap);
}

Expand Down
2 changes: 2 additions & 0 deletions llvm/tools/llvm-profgen/ProfileGenerator.h
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,8 @@ class ProfileGeneratorBase {

void showDensitySuggestion(double Density);

void markProfilePreinlined(SampleProfileMap &ProfileMap);

void collectProfiledFunctions();

bool collectFunctionsFromRawProfile(
Expand Down
Loading