[llvm] e36786d - [CSSPGO] Rename ProfileIsCSNested and ProfileIsCSFlat
Hongtao Yu via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 29 17:04:01 PDT 2022
Author: Hongtao Yu
Date: 2022-04-29T17:03:52-07:00
New Revision: e36786d15fd82f2b1107d21020af918ad908702e
URL: https://github.com/llvm/llvm-project/commit/e36786d15fd82f2b1107d21020af918ad908702e
DIFF: https://github.com/llvm/llvm-project/commit/e36786d15fd82f2b1107d21020af918ad908702e.diff
LOG: [CSSPGO] Rename ProfileIsCSNested and ProfileIsCSFlat
To be more clear and definitive, I'm renaming `ProfileIsCSFlat` back to `ProfileIsCS` which stands for full context-sensitive flat profiles. `ProfileIsCSNested` is now renamed to `ProfileIsPreInlined` and is extended to be applicable for CS flat profiles too. More specifically, `ProfileIsPreInlined` is for any kind of profiles (flat or nested) that contain 'ShouldBeInlined' contexts. The flag is encoded in the profile summary section for extbinary profiles and is computed on-the-fly for text profiles.
Reviewed By: wenlei
Differential Revision: https://reviews.llvm.org/D122602
Added:
Modified:
llvm/include/llvm/ProfileData/SampleProf.h
llvm/include/llvm/ProfileData/SampleProfReader.h
llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h
llvm/lib/ProfileData/ProfileSummaryBuilder.cpp
llvm/lib/ProfileData/SampleProf.cpp
llvm/lib/ProfileData/SampleProfReader.cpp
llvm/lib/ProfileData/SampleProfWriter.cpp
llvm/lib/Transforms/IPO/SampleProfile.cpp
llvm/test/tools/llvm-profdata/cs-sample-nested-profile.test
llvm/test/tools/llvm-profgen/cs-preinline.test
llvm/tools/llvm-profdata/llvm-profdata.cpp
llvm/tools/llvm-profgen/CSPreInliner.cpp
llvm/tools/llvm-profgen/PerfReader.cpp
llvm/tools/llvm-profgen/PerfReader.h
llvm/tools/llvm-profgen/ProfileGenerator.cpp
llvm/tools/llvm-profgen/ProfileGenerator.h
llvm/tools/llvm-profgen/llvm-profgen.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/ProfileData/SampleProf.h b/llvm/include/llvm/ProfileData/SampleProf.h
index 178bfced88a0..224d808e5f5f 100644
--- a/llvm/include/llvm/ProfileData/SampleProf.h
+++ b/llvm/include/llvm/ProfileData/SampleProf.h
@@ -200,9 +200,9 @@ enum class SecProfSummaryFlags : uint32_t {
/// SecFlagFSDiscriminator means this profile uses flow-sensitive
/// discriminators.
SecFlagFSDiscriminator = (1 << 2),
- /// SecFlagIsCSNested means this is context-sensitive nested profile for
- /// CSSPGO
- SecFlagIsCSNested = (1 << 4),
+ /// SecFlagIsPreInlined means this profile contains ShouldBeInlined
+ /// contexts thus this is CS preinliner computed.
+ SecFlagIsPreInlined = (1 << 4),
};
enum class SecFuncMetadataFlags : uint32_t {
@@ -830,7 +830,7 @@ class FunctionSamples {
/// Return the sample count of the first instruction of the function.
/// The function can be either a standalone symbol or an inlined function.
uint64_t getEntrySamples() const {
- if (FunctionSamples::ProfileIsCSFlat && getHeadSamples()) {
+ if (FunctionSamples::ProfileIsCS && getHeadSamples()) {
// For CS profile, if we already have more accurate head samples
// counted by branch sample from caller, use them as entry samples.
return getHeadSamples();
@@ -1047,9 +1047,9 @@ class FunctionSamples {
static bool ProfileIsProbeBased;
- static bool ProfileIsCSFlat;
+ static bool ProfileIsCS;
- static bool ProfileIsCSNested;
+ static bool ProfileIsPreInlined;
SampleContext &getContext() const { return Context; }
diff --git a/llvm/include/llvm/ProfileData/SampleProfReader.h b/llvm/include/llvm/ProfileData/SampleProfReader.h
index b5523a252b64..7da336b9f61b 100644
--- a/llvm/include/llvm/ProfileData/SampleProfReader.h
+++ b/llvm/include/llvm/ProfileData/SampleProfReader.h
@@ -470,11 +470,11 @@ class SampleProfileReader {
/// Whether input profile is based on pseudo probes.
bool profileIsProbeBased() const { return ProfileIsProbeBased; }
- /// Whether input profile is fully context-sensitive and flat.
- bool profileIsCSFlat() const { return ProfileIsCSFlat; }
+ /// Whether input profile is fully context-sensitive.
+ bool profileIsCS() const { return ProfileIsCS; }
- /// Whether input profile is fully context-sensitive and nested.
- bool profileIsCSNested() const { return ProfileIsCSNested; }
+ /// Whether input profile contains ShouldBeInlined contexts.
+ bool profileIsPreInlined() const { return ProfileIsPreInlined; }
virtual std::unique_ptr<ProfileSymbolList> getProfileSymbolList() {
return nullptr;
@@ -534,10 +534,10 @@ class SampleProfileReader {
bool ProfileIsProbeBased = false;
/// Whether function profiles are context-sensitive flat profiles.
- bool ProfileIsCSFlat = false;
+ bool ProfileIsCS = false;
- /// Whether function profiles are context-sensitive nested profiles.
- bool ProfileIsCSNested = false;
+ /// Whether function profile contains ShouldBeInlined contexts.
+ bool ProfileIsPreInlined = false;
/// Number of context-sensitive profiles.
uint32_t CSProfileCount = 0;
diff --git a/llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h b/llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h
index 21c5cc827fd9..fff06da22cf3 100644
--- a/llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h
+++ b/llvm/include/llvm/Transforms/IPO/ProfiledCallGraph.h
@@ -65,7 +65,7 @@ class ProfiledCallGraph {
// Constructor for non-CS profile.
ProfiledCallGraph(SampleProfileMap &ProfileMap) {
- assert(!FunctionSamples::ProfileIsCSFlat &&
+ assert(!FunctionSamples::ProfileIsCS &&
"CS flat profile is not handled here");
for (const auto &Samples : ProfileMap) {
addProfiledCalls(Samples.second);
diff --git a/llvm/lib/ProfileData/ProfileSummaryBuilder.cpp b/llvm/lib/ProfileData/ProfileSummaryBuilder.cpp
index 7503ec8076dc..54f99dfa720c 100644
--- a/llvm/lib/ProfileData/ProfileSummaryBuilder.cpp
+++ b/llvm/lib/ProfileData/ProfileSummaryBuilder.cpp
@@ -196,7 +196,7 @@ SampleProfileSummaryBuilder::computeSummaryForProfiles(
// more function profiles each with lower counts, which in turn leads to lower
// hot thresholds. To compensate for that, by default we merge context
// profiles before computing profile summary.
- if (UseContextLessSummary || (sampleprof::FunctionSamples::ProfileIsCSFlat &&
+ if (UseContextLessSummary || (sampleprof::FunctionSamples::ProfileIsCS &&
!UseContextLessSummary.getNumOccurrences())) {
for (const auto &I : Profiles) {
ContextLessProfiles[I.second.getName()].merge(I.second);
diff --git a/llvm/lib/ProfileData/SampleProf.cpp b/llvm/lib/ProfileData/SampleProf.cpp
index 710751cf0b04..0243e5f9d32b 100644
--- a/llvm/lib/ProfileData/SampleProf.cpp
+++ b/llvm/lib/ProfileData/SampleProf.cpp
@@ -42,8 +42,8 @@ cl::opt<bool> GenerateMergedBaseProfiles(
namespace llvm {
namespace sampleprof {
bool FunctionSamples::ProfileIsProbeBased = false;
-bool FunctionSamples::ProfileIsCSFlat = false;
-bool FunctionSamples::ProfileIsCSNested = false;
+bool FunctionSamples::ProfileIsCS = false;
+bool FunctionSamples::ProfileIsPreInlined = false;
bool FunctionSamples::UseMD5 = false;
bool FunctionSamples::HasUniqSuffix = true;
bool FunctionSamples::ProfileIsFS = false;
@@ -535,11 +535,6 @@ void CSProfileConverter::convertProfiles(CSProfileConverter::FrameNode &Node) {
ContextDuplicatedIntoBase);
}
- // Contexts coming with a `ContextShouldBeInlined` attribute indicate this
- // is a preinliner-computed profile.
- if (OrigChildContext.hasAttribute(ContextShouldBeInlined))
- FunctionSamples::ProfileIsCSNested = true;
-
// Remove the original child profile.
ProfileMap.erase(OrigChildContext);
}
diff --git a/llvm/lib/ProfileData/SampleProfReader.cpp b/llvm/lib/ProfileData/SampleProfReader.cpp
index de1cdc6bce6a..280e3c6cb8d1 100644
--- a/llvm/lib/ProfileData/SampleProfReader.cpp
+++ b/llvm/lib/ProfileData/SampleProfReader.cpp
@@ -348,7 +348,7 @@ std::error_code SampleProfileReaderText::readImpl() {
}
FProfile.getContext().setAllAttributes(Attributes);
if (Attributes & (uint32_t)ContextShouldBeInlined)
- ProfileIsCSNested = true;
+ ProfileIsPreInlined = true;
DepthMetadata = Depth;
break;
}
@@ -358,14 +358,14 @@ std::error_code SampleProfileReaderText::readImpl() {
assert((CSProfileCount == 0 || CSProfileCount == Profiles.size()) &&
"Cannot have both context-sensitive and regular profile");
- ProfileIsCSFlat = (CSProfileCount > 0);
+ ProfileIsCS = (CSProfileCount > 0);
assert((TopLevelProbeProfileCount == 0 ||
TopLevelProbeProfileCount == Profiles.size()) &&
"Cannot have both probe-based profiles and regular profiles");
ProfileIsProbeBased = (TopLevelProbeProfileCount > 0);
FunctionSamples::ProfileIsProbeBased = ProfileIsProbeBased;
- FunctionSamples::ProfileIsCSFlat = ProfileIsCSFlat;
- FunctionSamples::ProfileIsCSNested = ProfileIsCSNested;
+ FunctionSamples::ProfileIsCS = ProfileIsCS;
+ FunctionSamples::ProfileIsPreInlined = ProfileIsPreInlined;
if (Result == sampleprof_error::success)
computeSummary();
@@ -630,7 +630,7 @@ SampleProfileReaderExtBinaryBase::readContextFromTable() {
ErrorOr<SampleContext>
SampleProfileReaderExtBinaryBase::readSampleContextFromTable() {
- if (ProfileIsCSFlat) {
+ if (ProfileIsCS) {
auto FContext(readContextFromTable());
if (std::error_code EC = FContext.getError())
return EC;
@@ -654,9 +654,9 @@ std::error_code SampleProfileReaderExtBinaryBase::readOneSection(
if (hasSecFlag(Entry, SecProfSummaryFlags::SecFlagPartial))
Summary->setPartialProfile(true);
if (hasSecFlag(Entry, SecProfSummaryFlags::SecFlagFullContext))
- FunctionSamples::ProfileIsCSFlat = ProfileIsCSFlat = true;
- if (hasSecFlag(Entry, SecProfSummaryFlags::SecFlagIsCSNested))
- FunctionSamples::ProfileIsCSNested = ProfileIsCSNested = true;
+ FunctionSamples::ProfileIsCS = ProfileIsCS = true;
+ if (hasSecFlag(Entry, SecProfSummaryFlags::SecFlagIsPreInlined))
+ FunctionSamples::ProfileIsPreInlined = ProfileIsPreInlined = true;
if (hasSecFlag(Entry, SecProfSummaryFlags::SecFlagFSDiscriminator))
FunctionSamples::ProfileIsFS = ProfileIsFS = true;
break;
@@ -777,7 +777,7 @@ std::error_code SampleProfileReaderExtBinaryBase::readFuncProfiles() {
}
}
- if (ProfileIsCSFlat) {
+ if (ProfileIsCS) {
DenseSet<uint64_t> FuncGuidsToUse;
if (useMD5()) {
for (auto Name : FuncsToUse)
@@ -847,7 +847,7 @@ std::error_code SampleProfileReaderExtBinaryBase::readFuncProfiles() {
}
assert((CSProfileCount == 0 || CSProfileCount == Profiles.size()) &&
"Cannot have both context-sensitive and regular profile");
- assert((!CSProfileCount || ProfileIsCSFlat) &&
+ assert((!CSProfileCount || ProfileIsCS) &&
"Section flag should be consistent with actual profile");
return sampleprof_error::success;
}
@@ -1105,7 +1105,7 @@ SampleProfileReaderExtBinaryBase::readFuncMetadata(bool ProfileHasAttribute,
FProfile->getContext().setAllAttributes(*Attributes);
}
- if (!ProfileIsCSFlat) {
+ if (!ProfileIsCS) {
// Read all the attributes for inlined function calls.
auto NumCallsites = readNumber<uint32_t>();
if (std::error_code EC = NumCallsites.getError())
@@ -1275,8 +1275,8 @@ static std::string getSecFlagsStr(const SecHdrTableEntry &Entry) {
Flags.append("partial,");
if (hasSecFlag(Entry, SecProfSummaryFlags::SecFlagFullContext))
Flags.append("context,");
- if (hasSecFlag(Entry, SecProfSummaryFlags::SecFlagIsCSNested))
- Flags.append("context-nested,");
+ if (hasSecFlag(Entry, SecProfSummaryFlags::SecFlagIsPreInlined))
+ Flags.append("preInlined,");
if (hasSecFlag(Entry, SecProfSummaryFlags::SecFlagFSDiscriminator))
Flags.append("fs-discriminator,");
break;
diff --git a/llvm/lib/ProfileData/SampleProfWriter.cpp b/llvm/lib/ProfileData/SampleProfWriter.cpp
index 5ad3e945fefe..8ec6b7ebc29e 100644
--- a/llvm/lib/ProfileData/SampleProfWriter.cpp
+++ b/llvm/lib/ProfileData/SampleProfWriter.cpp
@@ -169,7 +169,7 @@ std::error_code SampleProfileWriterExtBinaryBase::writeFuncOffsetTable() {
return (std::error_code)sampleprof_error::success;
};
- if (FunctionSamples::ProfileIsCSFlat) {
+ if (FunctionSamples::ProfileIsCS) {
// Sort the contexts before writing them out. This is to help fast load all
// context profiles for a function as well as their callee contexts which
// can help profile-guided importing for ThinLTO.
@@ -199,11 +199,11 @@ std::error_code SampleProfileWriterExtBinaryBase::writeFuncMetadata(
if (FunctionSamples::ProfileIsProbeBased)
encodeULEB128(FunctionProfile.getFunctionHash(), OS);
- if (FunctionSamples::ProfileIsCSFlat || FunctionSamples::ProfileIsCSNested) {
+ if (FunctionSamples::ProfileIsCS || FunctionSamples::ProfileIsPreInlined) {
encodeULEB128(FunctionProfile.getContext().getAllAttributes(), OS);
}
- if (!FunctionSamples::ProfileIsCSFlat) {
+ if (!FunctionSamples::ProfileIsCS) {
// Recursively emit attributes for all callee samples.
uint64_t NumCallsites = 0;
for (const auto &J : FunctionProfile.getCallsiteSamples())
@@ -225,8 +225,8 @@ std::error_code SampleProfileWriterExtBinaryBase::writeFuncMetadata(
std::error_code SampleProfileWriterExtBinaryBase::writeFuncMetadata(
const SampleProfileMap &Profiles) {
- if (!FunctionSamples::ProfileIsProbeBased &&
- !FunctionSamples::ProfileIsCSFlat && !FunctionSamples::ProfileIsCSNested)
+ if (!FunctionSamples::ProfileIsProbeBased && !FunctionSamples::ProfileIsCS &&
+ !FunctionSamples::ProfileIsPreInlined)
return sampleprof_error::success;
for (const auto &Entry : Profiles) {
if (std::error_code EC = writeFuncMetadata(Entry.second))
@@ -321,12 +321,12 @@ std::error_code SampleProfileWriterExtBinaryBase::writeOneSection(
if (Type == SecFuncMetadata && FunctionSamples::ProfileIsProbeBased)
addSectionFlag(SecFuncMetadata, SecFuncMetadataFlags::SecFlagIsProbeBased);
if (Type == SecFuncMetadata &&
- (FunctionSamples::ProfileIsCSFlat || FunctionSamples::ProfileIsCSNested))
+ (FunctionSamples::ProfileIsCS || FunctionSamples::ProfileIsPreInlined))
addSectionFlag(SecFuncMetadata, SecFuncMetadataFlags::SecFlagHasAttribute);
- if (Type == SecProfSummary && FunctionSamples::ProfileIsCSFlat)
+ if (Type == SecProfSummary && FunctionSamples::ProfileIsCS)
addSectionFlag(SecProfSummary, SecProfSummaryFlags::SecFlagFullContext);
- if (Type == SecProfSummary && FunctionSamples::ProfileIsCSNested)
- addSectionFlag(SecProfSummary, SecProfSummaryFlags::SecFlagIsCSNested);
+ if (Type == SecProfSummary && FunctionSamples::ProfileIsPreInlined)
+ addSectionFlag(SecProfSummary, SecProfSummaryFlags::SecFlagIsPreInlined);
if (Type == SecProfSummary && FunctionSamples::ProfileIsFS)
addSectionFlag(SecProfSummary, SecProfSummaryFlags::SecFlagFSDiscriminator);
@@ -468,7 +468,7 @@ SampleProfileWriterCompactBinary::write(const SampleProfileMap &ProfileMap) {
/// it needs to be parsed by the SampleProfileReaderText class.
std::error_code SampleProfileWriterText::writeSample(const FunctionSamples &S) {
auto &OS = *OutputStream;
- if (FunctionSamples::ProfileIsCSFlat)
+ if (FunctionSamples::ProfileIsCS)
OS << "[" << S.getContext().toString() << "]:" << S.getTotalSamples();
else
OS << S.getName() << ":" << S.getTotalSamples();
@@ -868,8 +868,7 @@ SampleProfileWriter::create(std::unique_ptr<raw_ostream> &OS,
std::unique_ptr<SampleProfileWriter> Writer;
// Currently only Text and Extended Binary format are supported for CSSPGO.
- if ((FunctionSamples::ProfileIsCSFlat ||
- FunctionSamples::ProfileIsProbeBased) &&
+ if ((FunctionSamples::ProfileIsCS || FunctionSamples::ProfileIsProbeBased) &&
(Format == SPF_Binary || Format == SPF_Compact_Binary))
return sampleprof_error::unsupported_writing_format;
diff --git a/llvm/lib/Transforms/IPO/SampleProfile.cpp b/llvm/lib/Transforms/IPO/SampleProfile.cpp
index c555e2100cf1..6c4e6895bb3e 100644
--- a/llvm/lib/Transforms/IPO/SampleProfile.cpp
+++ b/llvm/lib/Transforms/IPO/SampleProfile.cpp
@@ -489,7 +489,7 @@ class SampleProfileLoader final
std::unique_ptr<SampleContextTracker> ContextTracker;
/// Flag indicating whether input profile is context-sensitive
- bool ProfileIsCSFlat = false;
+ bool ProfileIsCS = false;
/// Flag indicating which LTO/ThinLTO phase the pass is invoked in.
///
@@ -606,7 +606,7 @@ ErrorOr<uint64_t> SampleProfileLoader::getInstWeight(const Instruction &Inst) {
// call instruction should have 0 count.
// For CS profile, the callsite count of previously inlined callees is
// populated with the entry count of the callees.
- if (!ProfileIsCSFlat)
+ if (!ProfileIsCS)
if (const auto *CB = dyn_cast<CallBase>(&Inst))
if (!CB->isIndirectCall() && findCalleeFunctionSamples(*CB))
return 0;
@@ -645,7 +645,7 @@ ErrorOr<uint64_t> SampleProfileLoader::getProbeWeight(const Instruction &Inst) {
// call instruction should have 0 count.
// For CS profile, the callsite count of previously inlined callees is
// populated with the entry count of the callees.
- if (!ProfileIsCSFlat)
+ if (!ProfileIsCS)
if (const auto *CB = dyn_cast<CallBase>(&Inst))
if (!CB->isIndirectCall() && findCalleeFunctionSamples(*CB))
return 0;
@@ -699,7 +699,7 @@ SampleProfileLoader::findCalleeFunctionSamples(const CallBase &Inst) const {
if (Function *Callee = Inst.getCalledFunction())
CalleeName = Callee->getName();
- if (ProfileIsCSFlat)
+ if (ProfileIsCS)
return ContextTracker->getCalleeContextSamplesFor(Inst, CalleeName);
const FunctionSamples *FS = findFunctionSamples(Inst);
@@ -731,7 +731,7 @@ SampleProfileLoader::findIndirectCallFunctionSamples(
FunctionSamples::getGUID(R->getName());
};
- if (ProfileIsCSFlat) {
+ if (ProfileIsCS) {
auto CalleeSamples =
ContextTracker->getIndirectCalleeContextSamplesFor(DIL);
if (CalleeSamples.empty())
@@ -784,7 +784,7 @@ SampleProfileLoader::findFunctionSamples(const Instruction &Inst) const {
auto it = DILocation2SampleMap.try_emplace(DIL,nullptr);
if (it.second) {
- if (ProfileIsCSFlat)
+ if (ProfileIsCS)
it.first->second = ContextTracker->getContextSamplesFor(DIL);
else
it.first->second =
@@ -1058,7 +1058,7 @@ void SampleProfileLoader::findExternalInlineCandidate(
// For AutoFDO profile, retrieve candidate profiles by walking over
// the nested inlinee profiles.
- if (!ProfileIsCSFlat) {
+ if (!ProfileIsCS) {
Samples->findInlinedFunctions(InlinedGUIDs, SymbolMap, Threshold);
return;
}
@@ -1162,7 +1162,7 @@ bool SampleProfileLoader::inlineHotFunctions(
assert((!FunctionSamples::UseMD5 || FS->GUIDToFuncNameMap) &&
"GUIDToFuncNameMap has to be populated");
AllCandidates.push_back(CB);
- if (FS->getEntrySamples() > 0 || ProfileIsCSFlat)
+ if (FS->getEntrySamples() > 0 || ProfileIsCS)
LocalNotInlinedCallSites.try_emplace(CB, FS);
if (callsiteIsHot(FS, PSI, ProfAccForSymsInList))
Hot = true;
@@ -1225,7 +1225,7 @@ bool SampleProfileLoader::inlineHotFunctions(
// For CS profile, profile for not inlined context will be merged when
// base profile is being retrieved.
- if (!FunctionSamples::ProfileIsCSFlat)
+ if (!FunctionSamples::ProfileIsCS)
promoteMergeNotInlinedContextSamples(LocalNotInlinedCallSites, F);
return Changed;
}
@@ -1273,7 +1273,7 @@ bool SampleProfileLoader::tryInlineCandidate(
InlinedCallSites->push_back(I);
}
- if (ProfileIsCSFlat)
+ if (ProfileIsCS)
ContextTracker->markContextSamplesInlined(Candidate.CalleeSamples);
++NumCSInlined;
@@ -1535,7 +1535,7 @@ bool SampleProfileLoader::inlineHotFunctionsWithPriority(
// For CS profile, profile for not inlined context will be merged when
// base profile is being retrieved.
- if (!FunctionSamples::ProfileIsCSFlat)
+ if (!FunctionSamples::ProfileIsCS)
promoteMergeNotInlinedContextSamples(LocalNotInlinedCallSites, F);
return Changed;
}
@@ -1649,7 +1649,7 @@ void SampleProfileLoader::generateMDProfMetadata(Function &F) {
// With CSSPGO all indirect call targets are counted torwards the
// original indirect call site in the profile, including both
// inlined and non-inlined targets.
- if (!FunctionSamples::ProfileIsCSFlat) {
+ if (!FunctionSamples::ProfileIsCS) {
if (const FunctionSamplesMap *M =
FS->findFunctionSamplesMapAt(CallSite)) {
for (const auto &NameFS : *M)
@@ -1829,7 +1829,7 @@ INITIALIZE_PASS_END(SampleProfileLoaderLegacyPass, "sample-profile",
std::unique_ptr<ProfiledCallGraph>
SampleProfileLoader::buildProfiledCallGraph(CallGraph &CG) {
std::unique_ptr<ProfiledCallGraph> ProfiledCG;
- if (ProfileIsCSFlat)
+ if (ProfileIsCS)
ProfiledCG = std::make_unique<ProfiledCallGraph>(*ContextTracker);
else
ProfiledCG = std::make_unique<ProfiledCallGraph>(Reader->getProfiles());
@@ -1875,7 +1875,7 @@ SampleProfileLoader::buildFunctionOrder(Module &M, CallGraph *CG) {
assert(&CG->getModule() == &M);
if (UseProfiledCallGraph ||
- (ProfileIsCSFlat && !UseProfiledCallGraph.getNumOccurrences())) {
+ (ProfileIsCS && !UseProfiledCallGraph.getNumOccurrences())) {
// Use profiled call edges to augment the top-down order. There are cases
// that the top-down order computed based on the static call graph doesn't
// reflect real execution order. For example
@@ -2008,7 +2008,7 @@ bool SampleProfileLoader::doInitialization(Module &M,
}
// Apply tweaks if context-sensitive or probe-based profile is available.
- if (Reader->profileIsCSFlat() || Reader->profileIsCSNested() ||
+ if (Reader->profileIsCS() || Reader->profileIsPreInlined() ||
Reader->profileIsProbeBased()) {
if (!UseIterativeBFIInference.getNumOccurrences())
UseIterativeBFIInference = true;
@@ -2018,8 +2018,8 @@ bool SampleProfileLoader::doInitialization(Module &M,
EnableExtTspBlockPlacement = true;
}
- if (Reader->profileIsCSFlat() || Reader->profileIsCSNested()) {
- ProfileIsCSFlat = Reader->profileIsCSFlat();
+ if (Reader->profileIsCS() || Reader->profileIsPreInlined()) {
+ ProfileIsCS = Reader->profileIsCS();
// Enable priority-base inliner and size inline by default for CSSPGO.
if (!ProfileSizeInline.getNumOccurrences())
ProfileSizeInline = true;
@@ -2034,7 +2034,7 @@ bool SampleProfileLoader::doInitialization(Module &M,
if (!AllowRecursiveInline.getNumOccurrences())
AllowRecursiveInline = true;
- if (FunctionSamples::ProfileIsCSFlat) {
+ if (FunctionSamples::ProfileIsCS) {
// Tracker for profiles under
diff erent context
ContextTracker = std::make_unique<SampleContextTracker>(
Reader->getProfiles(), &GUIDToFuncNameMap);
@@ -2116,7 +2116,7 @@ bool SampleProfileLoader::runOnModule(Module &M, ModuleAnalysisManager *AM,
}
// Account for cold calls not inlined....
- if (!ProfileIsCSFlat)
+ if (!ProfileIsCS)
for (const std::pair<Function *, NotInlinedProfileInfo> &pair :
notInlinedCallInfo)
updateProfileCallee(pair.first, pair.second.entryCount);
@@ -2192,7 +2192,7 @@ bool SampleProfileLoader::runOnFunction(Function &F, ModuleAnalysisManager *AM)
ORE = OwnedORE.get();
}
- if (ProfileIsCSFlat)
+ if (ProfileIsCS)
Samples = ContextTracker->getBaseSamplesFor(F);
else
Samples = Reader->getSamplesFor(F);
diff --git a/llvm/test/tools/llvm-profdata/cs-sample-nested-profile.test b/llvm/test/tools/llvm-profdata/cs-sample-nested-profile.test
index 03d15671f1fd..9c2105db7197 100644
--- a/llvm/test/tools/llvm-profdata/cs-sample-nested-profile.test
+++ b/llvm/test/tools/llvm-profdata/cs-sample-nested-profile.test
@@ -156,7 +156,7 @@ RUN: llvm-profdata show -sample -detailed-summary %t3.proftext | FileCheck %s -c
; PROBE-NEXT: !CFGChecksum: 563022570642068
-; PREINLINE: ProfileSummarySection {{.*}} Flags: {context-nested}
+; PREINLINE: ProfileSummarySection {{.*}} Flags: {preInlined}
; SUMMARY: Total functions: 4
diff --git a/llvm/test/tools/llvm-profgen/cs-preinline.test b/llvm/test/tools/llvm-profgen/cs-preinline.test
index a775eda06335..f9556b104317 100644
--- a/llvm/test/tools/llvm-profgen/cs-preinline.test
+++ b/llvm/test/tools/llvm-profgen/cs-preinline.test
@@ -1,23 +1,36 @@
; Test default llvm-profgen with preinline off
-; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=0 --gen-cs-nested-profile=0 --output=%t
-; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-DEFAULT
+; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=0 --gen-cs-nested-profile=0 --output=%t1
+; RUN: FileCheck %s --input-file %t1 --check-prefix=CHECK-DEFAULT
; Test llvm-profgen with preinliner on will merge not inlinable profile into base profile.
-; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --gen-cs-nested-profile=0 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=45 --output=%t
-; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-PREINL
+; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --gen-cs-nested-profile=0 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=45 --output=%t2
+; RUN: FileCheck %s --input-file %t2 --check-prefix=CHECK-PREINL
; Test preinliner threshold that prevents all possible inlining and merges everything into base profile.
-; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --gen-cs-nested-profile=0 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=0 --output=%t
-; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-NO-PREINL
+; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --gen-cs-nested-profile=0 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=0 --output=%t3
+; RUN: FileCheck %s --input-file %t3 --check-prefix=CHECK-NO-PREINL
; Test cold profile trimming. Only base profiles should be dropped.
-; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --gen-cs-nested-profile=0 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=45 --output=%t --trim-cold-profile=1 --profile-summary-hot-count=400
+; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --gen-cs-nested-profile=0 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=45 --output=%t4 --trim-cold-profile=1 --profile-summary-hot-count=400
-; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-TRIM
+; RUN: FileCheck %s --input-file %t4 --check-prefix=CHECK-TRIM
; Test llvm-profgen with preinliner on will merge not inlinable profile into base profile.
-; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=45 --output=%t --gen-cs-nested-profile=1
-; RUN: FileCheck %s --input-file %t --check-prefix=CHECK-PREINL-NEST
+; RUN: llvm-profgen --format=text --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=45 --output=%t5 --gen-cs-nested-profile=1
+; RUN: FileCheck %s --input-file %t5 --check-prefix=CHECK-PREINL-NEST
+
+; Test preInlined flat is set for extbinary profiles with preinliner on.
+; RUN: llvm-profgen --format=extbinary --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --gen-cs-nested-profile=0 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=45 --output=%t2.prof
+; RUN: llvm-profdata show --sample -show-sec-info-only %t2.prof | FileCheck %s -check-prefix=CHECK-PREINL-FLAG
+; RUN: llvm-profgen --format=extbinary --perfscript=%S/Inputs/inline-cs-noprobe.perfscript --binary=%S/Inputs/inline-cs-noprobe.perfbin --csspgo-preinliner=1 --sample-profile-hot-inline-threshold=3000 --sample-profile-cold-inline-threshold=45 --output=%t5.prof --gen-cs-nested-profile=1
+; RUN: llvm-profdata show --sample -show-sec-info-only %t5.prof | FileCheck %s -check-prefix=CHECK-PREINL-FLAG
+
+; Test preInlined flat is set when converted from a text profile that has "ShouldInline" contexts.
+; RUN: llvm-profdata merge --sample %t2 -o %t2.prof --extbinary
+; RUN: llvm-profdata show --sample -show-sec-info-only %t2.prof | FileCheck %s -check-prefix=CHECK-PREINL-FLAG
+; RUN: llvm-profdata merge --sample %t5 -o %t5.prof --extbinary
+; RUN: llvm-profdata show --sample -show-sec-info-only %t5.prof | FileCheck %s -check-prefix=CHECK-PREINL-FLAG
+
; CHECK-DEFAULT: [main:1 @ foo]:309:0
; CHECK-DEFAULT-NEXT: 2.1: 14
@@ -66,3 +79,6 @@
; CHECK-PREINL-NEST-NEXT: 3.1: bar:84
; CHECK-PREINL-NEST-NEXT: 1: 14
; CHECK-PREINL-NEST-NEXT: !Attributes: 7
+
+
+; CHECK-PREINL-FLAG: ProfileSummarySection {{.*}} Flags: {{{.*}}preInlined}
diff --git a/llvm/tools/llvm-profdata/llvm-profdata.cpp b/llvm/tools/llvm-profdata/llvm-profdata.cpp
index 73b0416791b7..ce5f0a8ef994 100644
--- a/llvm/tools/llvm-profdata/llvm-profdata.cpp
+++ b/llvm/tools/llvm-profdata/llvm-profdata.cpp
@@ -754,7 +754,7 @@ mergeSampleProfile(const WeightedFileVector &Inputs, SymbolRemapper *Remapper,
LLVMContext Context;
sampleprof::ProfileSymbolList WriterList;
Optional<bool> ProfileIsProbeBased;
- Optional<bool> ProfileIsCSFlat;
+ Optional<bool> ProfileIsCS;
for (const auto &Input : Inputs) {
auto ReaderOrErr = SampleProfileReader::create(Input.Filename, Context,
FSDiscriminatorPassOption);
@@ -781,10 +781,9 @@ mergeSampleProfile(const WeightedFileVector &Inputs, SymbolRemapper *Remapper,
exitWithError(
"cannot merge probe-based profile with non-probe-based profile");
ProfileIsProbeBased = FunctionSamples::ProfileIsProbeBased;
- if (ProfileIsCSFlat.hasValue() &&
- ProfileIsCSFlat != FunctionSamples::ProfileIsCSFlat)
+ if (ProfileIsCS.hasValue() && ProfileIsCS != FunctionSamples::ProfileIsCS)
exitWithError("cannot merge CS profile with non-CS profile");
- ProfileIsCSFlat = FunctionSamples::ProfileIsCSFlat;
+ ProfileIsCS = FunctionSamples::ProfileIsCS;
for (SampleProfileMap::iterator I = Profiles.begin(), E = Profiles.end();
I != E; ++I) {
sampleprof_error Result = sampleprof_error::success;
@@ -807,7 +806,7 @@ mergeSampleProfile(const WeightedFileVector &Inputs, SymbolRemapper *Remapper,
WriterList.merge(*ReaderList);
}
- if (ProfileIsCSFlat && (SampleMergeColdContext || SampleTrimColdContext)) {
+ if (ProfileIsCS && (SampleMergeColdContext || SampleTrimColdContext)) {
// Use threshold calculated from profile summary unless specified.
SampleProfileSummaryBuilder Builder(ProfileSummaryBuilder::DefaultCutoffs);
auto Summary = Builder.computeSummaryForProfiles(ProfileMap);
@@ -822,10 +821,10 @@ mergeSampleProfile(const WeightedFileVector &Inputs, SymbolRemapper *Remapper,
SampleMergeColdContext, SampleColdContextFrameDepth, false);
}
- if (ProfileIsCSFlat && GenCSNestedProfile) {
+ if (ProfileIsCS && GenCSNestedProfile) {
CSProfileConverter CSConverter(ProfileMap);
CSConverter.convertProfiles();
- ProfileIsCSFlat = FunctionSamples::ProfileIsCSFlat = false;
+ ProfileIsCS = FunctionSamples::ProfileIsCS = false;
}
auto WriterOrErr =
@@ -1985,7 +1984,7 @@ std::error_code SampleOverlapAggregator::loadProfiles() {
if (BaseReader->profileIsProbeBased() != TestReader->profileIsProbeBased())
exitWithError(
"cannot compare probe-based profile with non-probe-based profile");
- if (BaseReader->profileIsCSFlat() != TestReader->profileIsCSFlat())
+ if (BaseReader->profileIsCS() != TestReader->profileIsCS())
exitWithError("cannot compare CS profile with non-CS profile");
// Load BaseHotThreshold and TestHotThreshold as 99-percentile threshold in
diff --git a/llvm/tools/llvm-profgen/CSPreInliner.cpp b/llvm/tools/llvm-profgen/CSPreInliner.cpp
index 06399168ef31..b561c549e728 100644
--- a/llvm/tools/llvm-profgen/CSPreInliner.cpp
+++ b/llvm/tools/llvm-profgen/CSPreInliner.cpp
@@ -282,5 +282,7 @@ void CSPreInliner::run() {
// Make sure ProfileMap's key is consistent with FunctionSamples' name.
SampleContextTrimmer(ProfileMap).canonicalizeContextProfiles();
+ FunctionSamples::ProfileIsPreInlined = true;
+
LLVM_DEBUG(printProfileNames(ProfileMap, false));
}
diff --git a/llvm/tools/llvm-profgen/PerfReader.cpp b/llvm/tools/llvm-profgen/PerfReader.cpp
index 8733c724b2d3..6888e936a158 100644
--- a/llvm/tools/llvm-profgen/PerfReader.cpp
+++ b/llvm/tools/llvm-profgen/PerfReader.cpp
@@ -757,7 +757,7 @@ void PerfScriptReader::writeUnsymbolizedProfile(raw_fd_ostream &OS) {
for (auto &CI : OrderedCounters) {
uint32_t Indent = 0;
- if (ProfileIsCSFlat) {
+ if (ProfileIsCS) {
// Context string key
OS << "[" << CI.first << "]\n";
Indent = 2;
@@ -844,7 +844,7 @@ void UnsymbolizedProfileReader::readUnsymbolizedProfile(StringRef FileName) {
StringRef Line = TraceIt.getCurrentLine();
// Read context stack for CS profile.
if (Line.startswith("[")) {
- ProfileIsCSFlat = true;
+ ProfileIsCS = true;
auto I = ContextStrSet.insert(Line.str());
SampleContext::createCtxVectorFromStr(*I.first, Key->Context);
TraceIt.advance();
@@ -1060,8 +1060,8 @@ PerfContent PerfScriptReader::checkPerfScriptType(StringRef FileName) {
}
void HybridPerfReader::generateUnsymbolizedProfile() {
- ProfileIsCSFlat = !IgnoreStackSamples;
- if (ProfileIsCSFlat)
+ ProfileIsCS = !IgnoreStackSamples;
+ if (ProfileIsCS)
unwindSamples();
else
PerfScriptReader::generateUnsymbolizedProfile();
diff --git a/llvm/tools/llvm-profgen/PerfReader.h b/llvm/tools/llvm-profgen/PerfReader.h
index 74ebd415a5fd..56ac03fb51e4 100644
--- a/llvm/tools/llvm-profgen/PerfReader.h
+++ b/llvm/tools/llvm-profgen/PerfReader.h
@@ -565,14 +565,14 @@ class PerfReaderBase {
const ContextSampleCounterMap &getSampleCounters() const {
return SampleCounters;
}
- bool profileIsCSFlat() { return ProfileIsCSFlat; }
+ bool profileIsCS() { return ProfileIsCS; }
protected:
ProfiledBinary *Binary = nullptr;
StringRef PerfTraceFile;
ContextSampleCounterMap SampleCounters;
- bool ProfileIsCSFlat = false;
+ bool ProfileIsCS = false;
uint64_t NumTotalSample = 0;
uint64_t NumLeafExternalFrame = 0;
diff --git a/llvm/tools/llvm-profgen/ProfileGenerator.cpp b/llvm/tools/llvm-profgen/ProfileGenerator.cpp
index da06e911dfd0..61f9f79c67b2 100644
--- a/llvm/tools/llvm-profgen/ProfileGenerator.cpp
+++ b/llvm/tools/llvm-profgen/ProfileGenerator.cpp
@@ -112,9 +112,9 @@ bool ProfileGeneratorBase::UseFSDiscriminator = false;
std::unique_ptr<ProfileGeneratorBase>
ProfileGeneratorBase::create(ProfiledBinary *Binary,
const ContextSampleCounterMap *SampleCounters,
- bool ProfileIsCSFlat) {
+ bool ProfileIsCS) {
std::unique_ptr<ProfileGeneratorBase> Generator;
- if (ProfileIsCSFlat) {
+ if (ProfileIsCS) {
if (Binary->useFSDiscriminator())
exitWithError("FS discriminator is not supported in CS profile.");
Generator.reset(new CSProfileGenerator(Binary, SampleCounters));
@@ -130,9 +130,9 @@ ProfileGeneratorBase::create(ProfiledBinary *Binary,
std::unique_ptr<ProfileGeneratorBase>
ProfileGeneratorBase::create(ProfiledBinary *Binary,
const SampleProfileMap &&Profiles,
- bool ProfileIsCSFlat) {
+ bool ProfileIsCS) {
std::unique_ptr<ProfileGeneratorBase> Generator;
- if (ProfileIsCSFlat) {
+ if (ProfileIsCS) {
if (Binary->useFSDiscriminator())
exitWithError("FS discriminator is not supported in CS profile.");
Generator.reset(new CSProfileGenerator(Binary, std::move(Profiles)));
@@ -731,7 +731,7 @@ FunctionSamples &CSProfileGenerator::getFunctionProfileForContext(
}
void CSProfileGenerator::generateProfile() {
- FunctionSamples::ProfileIsCSFlat = true;
+ FunctionSamples::ProfileIsCS = true;
collectProfiledFunctions();
@@ -950,8 +950,7 @@ void CSProfileGenerator::postProcessProfiles() {
if (GenCSNestedProfile) {
CSProfileConverter CSConverter(ProfileMap);
CSConverter.convertProfiles();
- FunctionSamples::ProfileIsCSFlat = false;
- FunctionSamples::ProfileIsCSNested = EnableCSPreInliner;
+ FunctionSamples::ProfileIsCS = false;
}
}
diff --git a/llvm/tools/llvm-profgen/ProfileGenerator.h b/llvm/tools/llvm-profgen/ProfileGenerator.h
index 5284c0468dac..15b4297b901e 100644
--- a/llvm/tools/llvm-profgen/ProfileGenerator.h
+++ b/llvm/tools/llvm-profgen/ProfileGenerator.h
@@ -42,10 +42,10 @@ class ProfileGeneratorBase {
virtual ~ProfileGeneratorBase() = default;
static std::unique_ptr<ProfileGeneratorBase>
create(ProfiledBinary *Binary, const ContextSampleCounterMap *Counters,
- bool ProfileIsCSFlat);
+ bool profileIsCS);
static std::unique_ptr<ProfileGeneratorBase>
create(ProfiledBinary *Binary, const SampleProfileMap &&ProfileMap,
- bool ProfileIsCSFlat);
+ bool profileIsCS);
virtual void generateProfile() = 0;
void write();
diff --git a/llvm/tools/llvm-profgen/llvm-profgen.cpp b/llvm/tools/llvm-profgen/llvm-profgen.cpp
index 51d4e339fd0d..831a3a5f8610 100644
--- a/llvm/tools/llvm-profgen/llvm-profgen.cpp
+++ b/llvm/tools/llvm-profgen/llvm-profgen.cpp
@@ -169,7 +169,7 @@ int main(int argc, const char *argv[]) {
std::unique_ptr<ProfileGeneratorBase> Generator =
ProfileGeneratorBase::create(Binary.get(),
std::move(Reader->getProfiles()),
- Reader->profileIsCSFlat());
+ Reader->profileIsCS());
Generator->generateProfile();
Generator->write();
} else {
@@ -187,7 +187,7 @@ int main(int argc, const char *argv[]) {
std::unique_ptr<ProfileGeneratorBase> Generator =
ProfileGeneratorBase::create(Binary.get(), &Reader->getSampleCounters(),
- Reader->profileIsCSFlat());
+ Reader->profileIsCS());
Generator->generateProfile();
Generator->write();
}
More information about the llvm-commits
mailing list