================ @@ -2460,63 +2528,108 @@ void SampleProfileMatcher::runOnFunction(const Function &F) { !ProbeManager->profileIsValid(F, *FSFlattened)) { // The matching result will be saved to IRToProfileLocationMap, create a new // map for each function. + auto &IRToProfileLocationMap = getIRToProfileLocationMap(F); runStaleProfileMatching(F, IRAnchors, ProfileAnchors, - getIRToProfileLocationMap(F)); + IRToProfileLocationMap); + PostMatchStats.countMismatchedCallsites(F, IRAnchors, ProfileAnchors, + IRToProfileLocationMap); } } -void SampleProfileMatcher::runOnModule() { - ProfileConverter::flattenProfile(Reader.getProfiles(), FlattenedProfiles, - FunctionSamples::ProfileIsCS); - for (auto &F : M) { - if (F.isDeclaration() || !F.hasFnAttribute("use-sample-profile")) - continue; - runOnFunction(F); - } - if (SalvageStaleProfile) - distributeIRToProfileLocationMap(); - +void SampleProfileMatcher::reportOrPersistProfileStats() { if (ReportProfileStaleness) { if (FunctionSamples::ProfileIsProbeBased) { - errs() << "(" << NumMismatchedFuncHash << "/" << TotalProfiledFunc << ")" + errs() << "(" << PreMatchStats.NumMismatchedFuncHash << "/" + << PreMatchStats.TotalProfiledFunc << ")" << " of functions' profile are invalid and " - << " (" << MismatchedFuncHashSamples << "/" << TotalFuncHashSamples - << ")" + << " (" << PreMatchStats.MismatchedFuncHashSamples << "/" + << PreMatchStats.TotalFunctionSamples << ")" << " of samples are discarded due to function hash mismatch.\n"; } - errs() << "(" << NumMismatchedCallsites << "/" << TotalProfiledCallsites - << ")" + errs() << "(" << PreMatchStats.NumMismatchedCallsites << "/" + << PreMatchStats.TotalProfiledCallsites << ")" << " of callsites' profile are invalid and " - << "(" << MismatchedCallsiteSamples << "/" << TotalCallsiteSamples - << ")" + << "(" << PreMatchStats.MismatchedCallsiteSamples << "/" + << PreMatchStats.TotalFunctionSamples << ")" << " of samples are discarded due to callsite location mismatch.\n"; + if (SalvageStaleProfile) { + uint64_t NumRecoveredCallsites = PostMatchStats.TotalProfiledCallsites - + PostMatchStats.NumMismatchedCallsites; + uint64_t NumMismatchedCallsites = + PreMatchStats.NumMismatchedCallsites - NumRecoveredCallsites; + errs() << "Out of " << PostMatchStats.TotalProfiledCallsites + << " callsites used for profile matching, " + << NumRecoveredCallsites + << " callsites have been recovered. After the matching, (" + << NumMismatchedCallsites << "/" + << PreMatchStats.TotalProfiledCallsites + << ") of callsites are still invalid (" + << PostMatchStats.MismatchedCallsiteSamples << "/" + << PreMatchStats.TotalFunctionSamples << ")" + << " of samples are still discarded.\n"; + } } if (PersistProfileStaleness) { LLVMContext &Ctx = M.getContext(); MDBuilder MDB(Ctx); SmallVector<std::pair<StringRef, uint64_t>> ProfStatsVec; + ProfStatsVec.emplace_back("NumMismatchedCallsites", + PreMatchStats.NumMismatchedCallsites); + ProfStatsVec.emplace_back("TotalProfiledCallsites", + PreMatchStats.TotalProfiledCallsites); + ProfStatsVec.emplace_back("MismatchedCallsiteSamples", + PreMatchStats.MismatchedCallsiteSamples); + ProfStatsVec.emplace_back("TotalProfiledFunc", + PreMatchStats.TotalProfiledFunc); + ProfStatsVec.emplace_back("TotalFunctionSamples", + PreMatchStats.TotalFunctionSamples); if (FunctionSamples::ProfileIsProbeBased) { - ProfStatsVec.emplace_back("NumMismatchedFuncHash", NumMismatchedFuncHash); - ProfStatsVec.emplace_back("TotalProfiledFunc", TotalProfiledFunc); + ProfStatsVec.emplace_back("NumMismatchedFuncHash", + PreMatchStats.NumMismatchedFuncHash); ProfStatsVec.emplace_back("MismatchedFuncHashSamples", - MismatchedFuncHashSamples); - ProfStatsVec.emplace_back("TotalFuncHashSamples", TotalFuncHashSamples); + PreMatchStats.MismatchedFuncHashSamples); + } + if (SalvageStaleProfile) { + ProfStatsVec.emplace_back("PostMatchNumMismatchedCallsites", + PostMatchStats.NumMismatchedCallsites); + ProfStatsVec.emplace_back("NumCallsitesForMatching", + PostMatchStats.TotalProfiledCallsites); + ProfStatsVec.emplace_back("PostMatchMismatchedCallsiteSamples", + PostMatchStats.MismatchedCallsiteSamples); } - - ProfStatsVec.emplace_back("NumMismatchedCallsites", NumMismatchedCallsites); - ProfStatsVec.emplace_back("TotalProfiledCallsites", TotalProfiledCallsites); - ProfStatsVec.emplace_back("MismatchedCallsiteSamples", - MismatchedCallsiteSamples); - ProfStatsVec.emplace_back("TotalCallsiteSamples", TotalCallsiteSamples); auto *MD = MDB.createLLVMStats(ProfStatsVec); auto *NMD = M.getOrInsertNamedMetadata("llvm.stats"); NMD->addOperand(MD); } } +void SampleProfileMatcher::runOnModule() { + ProfileConverter::flattenProfile(Reader.getProfiles(), FlattenedProfiles, + FunctionSamples::ProfileIsCS); + for (auto &F : M) { + if (ShouldSkipProfileLoading(F)) + continue; + runOnFunction(F); + } + + if (SalvageStaleProfile) + distributeIRToProfileLocationMap(); + + PreMatchStats.countMismatchedCallsiteSamples(); + if (SalvageStaleProfile) { + // If a function doesn't run the matching but has mismatched callsites, this + // won't be any data for that function in post-match stats, so just reuse + // the pre-match stats. + PostMatchStats.copyUnchangedCallsiteMismatches( + PreMatchStats.FuncMismatchedCallsites); + PostMatchStats.countMismatchedCallsiteSamples(); ---------------- wlei-llvm wrote:
Try to understand this on high-level, I feel this is to compress as much as we can into a global structure(`FuncMismatchedCallistes`) during function-level matching. Comparing to my first version(using a global IR/Prof anchor map), this use a more compact structure. Comparing to my second(this) version, even move all the `TotalProfiledFunction/ total Function Samples / total callsites` stats out of the matching. That sounds good idea, just some minor thing I can think: 1) For `StringMap<std::unordered_map<LineLocation,bool>>`, a `bool` might not be enough, the matching could work badly and introduce more mismatching. may need another bool to indicate it's a new mismatch. 2) We need to save `TotalProfiledCallsite`, as we don't have the ProfAnchors for the counting at the end. https://github.com/llvm/llvm-project/pull/79090 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits