diff --git a/llvm/include/llvm/Analysis/ProfileSummaryInfo.h b/llvm/include/llvm/Analysis/ProfileSummaryInfo.h --- a/llvm/include/llvm/Analysis/ProfileSummaryInfo.h +++ b/llvm/include/llvm/Analysis/ProfileSummaryInfo.h @@ -72,6 +72,13 @@ 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() && diff --git a/llvm/include/llvm/Transforms/Utils/SizeOpts.h b/llvm/include/llvm/Transforms/Utils/SizeOpts.h --- a/llvm/include/llvm/Transforms/Utils/SizeOpts.h +++ b/llvm/include/llvm/Transforms/Utils/SizeOpts.h @@ -23,6 +23,7 @@ extern llvm::cl::opt PGSOColdCodeOnly; extern llvm::cl::opt PGSOColdCodeOnlyForInstrPGO; extern llvm::cl::opt PGSOColdCodeOnlyForSamplePGO; +extern llvm::cl::opt PGSOColdCodeOnlyForPartialSamplePGO; extern llvm::cl::opt ForcePGSO; extern llvm::cl::opt PgsoCutoffInstrProf; extern llvm::cl::opt PgsoCutoffSampleProf; @@ -39,6 +40,16 @@ 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 bool shouldFuncOptimizeForSizeImpl(const FuncT *F, ProfileSummaryInfo *PSI, BFIT *BFI, PGSOQueryType QueryType) { @@ -54,13 +65,8 @@ 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 @@ 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. diff --git a/llvm/lib/Transforms/Utils/SizeOpts.cpp b/llvm/lib/Transforms/Utils/SizeOpts.cpp --- a/llvm/lib/Transforms/Utils/SizeOpts.cpp +++ b/llvm/lib/Transforms/Utils/SizeOpts.cpp @@ -38,6 +38,11 @@ cl::desc("Apply the profile guided size optimizations only " "to cold code under sample PGO.")); +cl::opt 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 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 @@ "for instrumentation profile.")); cl::opt 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."));