[PGO][PGSO] Prep for enabling non-cold code size opts under non-partial-profile sample PGO.

Summary:
- Distinguish between partial-profile and non-partial-profile sample PGO.
- Add a flag for partial-profile sample PGO.
- Tune the sample PGO cutoff.
- No default behavior change (yet).

Reviewers: davidxl

Subscribers: eraman, hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D78949
This commit is contained in:
Hiroshi Yamauchi 2020-04-27 10:55:55 -07:00
parent f0903de1aa
commit 1831986826
3 changed files with 26 additions and 13 deletions

View File

@ -72,6 +72,13 @@ public:
Summary->getKind() == ProfileSummary::PSK_Sample;
}
/// Returns true if module \c M has partial-profile sample profile.
bool hasPartialSampleProfile() {
return hasProfileSummary() &&
Summary->getKind() == ProfileSummary::PSK_Sample &&
Summary->isPartialProfile();
}
/// Returns true if module \c M has instrumentation profile.
bool hasInstrumentationProfile() {
return hasProfileSummary() &&

View File

@ -23,6 +23,7 @@ extern llvm::cl::opt<bool> PGSOIRPassOrTestOnly;
extern llvm::cl::opt<bool> PGSOColdCodeOnly;
extern llvm::cl::opt<bool> PGSOColdCodeOnlyForInstrPGO;
extern llvm::cl::opt<bool> PGSOColdCodeOnlyForSamplePGO;
extern llvm::cl::opt<bool> PGSOColdCodeOnlyForPartialSamplePGO;
extern llvm::cl::opt<bool> ForcePGSO;
extern llvm::cl::opt<int> PgsoCutoffInstrProf;
extern llvm::cl::opt<int> PgsoCutoffSampleProf;
@ -39,6 +40,16 @@ enum class PGSOQueryType {
Other, // Others.
};
static inline bool isPGSOColdCodeOnly(ProfileSummaryInfo *PSI) {
return PGSOColdCodeOnly ||
(PSI->hasInstrumentationProfile() && PGSOColdCodeOnlyForInstrPGO) ||
(PSI->hasSampleProfile() &&
((!PSI->hasPartialSampleProfile() && PGSOColdCodeOnlyForSamplePGO) ||
(PSI->hasPartialSampleProfile() &&
PGSOColdCodeOnlyForPartialSamplePGO))) ||
(PGSOLargeWorkingSetSizeOnly && !PSI->hasLargeWorkingSetSize());
}
template<typename AdapterT, typename FuncT, typename BFIT>
bool shouldFuncOptimizeForSizeImpl(const FuncT *F, ProfileSummaryInfo *PSI,
BFIT *BFI, PGSOQueryType QueryType) {
@ -54,13 +65,8 @@ bool shouldFuncOptimizeForSizeImpl(const FuncT *F, ProfileSummaryInfo *PSI,
if (PGSOIRPassOrTestOnly && !(QueryType == PGSOQueryType::IRPass ||
QueryType == PGSOQueryType::Test))
return false;
if (PGSOColdCodeOnly ||
(PSI->hasInstrumentationProfile() && PGSOColdCodeOnlyForInstrPGO) ||
(PSI->hasSampleProfile() && PGSOColdCodeOnlyForSamplePGO) ||
(PGSOLargeWorkingSetSizeOnly && !PSI->hasLargeWorkingSetSize())) {
// Even if the working set size isn't large, size-optimize cold code.
if (isPGSOColdCodeOnly(PSI))
return AdapterT::isFunctionColdInCallGraph(F, PSI, *BFI);
}
if (PSI->hasSampleProfile())
// The "isCold" check seems to work better for Sample PGO as it could have
// many profile-unannotated functions.
@ -84,13 +90,8 @@ bool shouldOptimizeForSizeImpl(BlockTOrBlockFreq BBOrBlockFreq, ProfileSummaryIn
if (PGSOIRPassOrTestOnly && !(QueryType == PGSOQueryType::IRPass ||
QueryType == PGSOQueryType::Test))
return false;
if (PGSOColdCodeOnly ||
(PSI->hasInstrumentationProfile() && PGSOColdCodeOnlyForInstrPGO) ||
(PSI->hasSampleProfile() && PGSOColdCodeOnlyForSamplePGO) ||
(PGSOLargeWorkingSetSizeOnly && !PSI->hasLargeWorkingSetSize())) {
// Even if the working set size isn't large, size-optimize cold code.
if (isPGSOColdCodeOnly(PSI))
return AdapterT::isColdBlock(BBOrBlockFreq, PSI, BFI);
}
if (PSI->hasSampleProfile())
// The "isCold" check seems to work better for Sample PGO as it could have
// many profile-unannotated functions.

View File

@ -38,6 +38,11 @@ cl::opt<bool> PGSOColdCodeOnlyForSamplePGO(
cl::desc("Apply the profile guided size optimizations only "
"to cold code under sample PGO."));
cl::opt<bool> PGSOColdCodeOnlyForPartialSamplePGO(
"pgso-cold-code-only-for-partial-sample-pgo", cl::Hidden, cl::init(true),
cl::desc("Apply the profile guided size optimizations only "
"to cold code under partial-profile sample PGO."));
cl::opt<bool> PGSOIRPassOrTestOnly(
"pgso-ir-pass-or-test-only", cl::Hidden, cl::init(false),
cl::desc("Apply the profile guided size optimizations only"
@ -53,7 +58,7 @@ cl::opt<int> PgsoCutoffInstrProf(
"for instrumentation profile."));
cl::opt<int> PgsoCutoffSampleProf(
"pgso-cutoff-sample-prof", cl::Hidden, cl::init(800000), cl::ZeroOrMore,
"pgso-cutoff-sample-prof", cl::Hidden, cl::init(990000), cl::ZeroOrMore,
cl::desc("The profile guided size optimization profile summary cutoff "
"for sample profile."));