Index: llvm/lib/Transforms/IPO/SampleProfile.cpp =================================================================== --- llvm/lib/Transforms/IPO/SampleProfile.cpp +++ llvm/lib/Transforms/IPO/SampleProfile.cpp @@ -195,8 +195,6 @@ class SampleCoverageTracker { public: - SampleCoverageTracker(SampleProfileLoader &SPL) : SPLoader(SPL){}; - bool markSamplesUsed(const FunctionSamples *FS, uint32_t LineOffset, uint32_t Discriminator, uint64_t Samples); unsigned computeCoverage(unsigned Used, unsigned Total) const; @@ -212,6 +210,7 @@ SampleCoverage.clear(); TotalUsedSamples = 0; } + inline void setProfAccForSymsInList(bool V) { ProfAccForSymsInList = V; } private: using BodySampleCoverageMap = std::map; @@ -242,7 +241,9 @@ /// every function, so we just need to keep a single counter. uint64_t TotalUsedSamples = 0; - SampleProfileLoader &SPLoader; + // For symbol in profile symbol list, whether to regard their profiles + // to be accurate. This is passed from the SampleLoader instance. + bool ProfAccForSymsInList = false; }; class GUIDToFuncNameMapper { @@ -327,8 +328,8 @@ std::function GetTLI) : GetAC(std::move(GetAssumptionCache)), GetTTI(std::move(GetTargetTransformInfo)), GetTLI(std::move(GetTLI)), - CoverageTracker(*this), Filename(std::string(Name)), - RemappingFilename(std::string(RemapName)), LTOPhase(LTOPhase) {} + Filename(std::string(Name)), RemappingFilename(std::string(RemapName)), + LTOPhase(LTOPhase) {} bool doInitialization(Module &M, FunctionAnalysisManager *FAM = nullptr); bool runOnModule(Module &M, ModuleAnalysisManager *AM, @@ -374,8 +375,6 @@ bool propagateThroughEdges(Function &F, bool UpdateBlockCount); void computeDominanceAndLoopInfo(Function &F); void clearFunctionData(); - bool callsiteIsHot(const FunctionSamples *CallsiteFS, - ProfileSummaryInfo *PSI); /// Map basic blocks to their computed weights. /// @@ -565,8 +564,8 @@ /// be regarded as cold and much less inlining will happen in CGSCC inlining /// pass, so we tend to lower the hot criteria here to allow more early /// inlining to happen for warm callsites and it is helpful for performance. -bool SampleProfileLoader::callsiteIsHot(const FunctionSamples *CallsiteFS, - ProfileSummaryInfo *PSI) { +static bool callsiteIsHot(const FunctionSamples *CallsiteFS, + ProfileSummaryInfo *PSI, bool ProfAccForSymsInList) { if (!CallsiteFS) return false; // The callsite was not inlined in the original binary. @@ -612,7 +611,7 @@ for (const auto &I : FS->getCallsiteSamples()) for (const auto &J : I.second) { const FunctionSamples *CalleeSamples = &J.second; - if (SPLoader.callsiteIsHot(CalleeSamples, PSI)) + if (callsiteIsHot(CalleeSamples, PSI, ProfAccForSymsInList)) Count += countUsedRecords(CalleeSamples, PSI); } @@ -631,7 +630,7 @@ for (const auto &I : FS->getCallsiteSamples()) for (const auto &J : I.second) { const FunctionSamples *CalleeSamples = &J.second; - if (SPLoader.callsiteIsHot(CalleeSamples, PSI)) + if (callsiteIsHot(CalleeSamples, PSI, ProfAccForSymsInList)) Count += countBodyRecords(CalleeSamples, PSI); } @@ -652,7 +651,7 @@ for (const auto &I : FS->getCallsiteSamples()) for (const auto &J : I.second) { const FunctionSamples *CalleeSamples = &J.second; - if (SPLoader.callsiteIsHot(CalleeSamples, PSI)) + if (callsiteIsHot(CalleeSamples, PSI, ProfAccForSymsInList)) Total += countBodySamples(CalleeSamples, PSI); } @@ -1096,7 +1095,7 @@ AllCandidates.push_back(CB); if (FS->getEntrySamples() > 0 || ProfileIsCS) localNotInlinedCallSites.try_emplace(CB, FS); - if (callsiteIsHot(FS, PSI)) + if (callsiteIsHot(FS, PSI, ProfAccForSymsInList)) Hot = true; else if (shouldInlineColdCallee(*CB)) ColdCandidates.push_back(CB); @@ -1126,7 +1125,7 @@ PSI->getOrCompHotCountThreshold()); continue; } - if (!callsiteIsHot(FS, PSI)) + if (!callsiteIsHot(FS, PSI, ProfAccForSymsInList)) continue; const char *Reason = "Callee function not available"; @@ -1963,6 +1962,7 @@ NamesInProfile.clear(); if (auto NameTable = Reader->getNameTable()) NamesInProfile.insert(NameTable->begin(), NameTable->end()); + CoverageTracker.setProfAccForSymsInList(true); } if (FAM && !ProfileInlineReplayFile.empty()) { @@ -2090,6 +2090,7 @@ // than symbol list. When profile-sample-accurate is on, ignore symbol list. ProfAccForSymsInList = false; } + CoverageTracker.setProfAccForSymsInList(ProfAccForSymsInList); // PSL -- profile symbol list include all the symbols in sampled binary. // If ProfileAccurateForSymsInList is enabled, PSL is used to treat