diff --git a/llvm/lib/ProfileData/SampleProf.cpp b/llvm/lib/ProfileData/SampleProf.cpp --- a/llvm/lib/ProfileData/SampleProf.cpp +++ b/llvm/lib/ProfileData/SampleProf.cpp @@ -371,9 +371,7 @@ void SampleContextTrimmer::canonicalizeContextProfiles() { StringSet<> ProfilesToBeRemoved; - // Note that StringMap order is guaranteed to be top-down order, - // this makes sure we make room for promoted/merged context in the - // map, before we move profiles in the map. + StringMap ProfilesToBeAdded; for (auto &I : ProfileMap) { FunctionSamples &FProfile = I.second; StringRef ContextStr = FProfile.getNameWithContext(); @@ -383,18 +381,19 @@ // Use the context string from FunctionSamples to update the keys of // ProfileMap. They can get out of sync after context profile promotion // through pre-inliner. - auto Ret = ProfileMap.try_emplace(ContextStr, FProfile); - assert(Ret.second && "Conext conflict during canonicalization"); - FProfile = Ret.first->second; - - // Track the context profile to remove - ProfilesToBeRemoved.erase(ContextStr); + auto Ret = ProfilesToBeAdded.try_emplace(ContextStr, FProfile); + (void)Ret; + assert(Ret.second && "Context conflict during canonicalization"); ProfilesToBeRemoved.insert(I.first()); } for (auto &I : ProfilesToBeRemoved) { ProfileMap.erase(I.first()); } + + for (auto &I : ProfilesToBeAdded) { + ProfileMap.try_emplace(I.first(), I.second); + } } std::error_code ProfileSymbolList::write(raw_ostream &OS) { diff --git a/llvm/tools/llvm-profgen/CSPreInliner.cpp b/llvm/tools/llvm-profgen/CSPreInliner.cpp --- a/llvm/tools/llvm-profgen/CSPreInliner.cpp +++ b/llvm/tools/llvm-profgen/CSPreInliner.cpp @@ -16,11 +16,6 @@ using namespace llvm; using namespace sampleprof; -static cl::opt EnableCSPreInliner( - "csspgo-preinliner", cl::Hidden, cl::init(false), - cl::desc("Run a global pre-inliner to merge context profile based on " - "estimated global top-down inline decisions")); - // The switches specify inline thresholds used in SampleProfileLoader inlining. // TODO: the actual threshold to be tuned here because the size here is based // on machine code not LLVM IR. @@ -179,9 +174,6 @@ } void CSPreInliner::run() { - if (!EnableCSPreInliner) - return; - #ifndef NDEBUG auto printProfileNames = [](StringMap &Profiles, bool IsInput) { diff --git a/llvm/tools/llvm-profgen/ProfileGenerator.cpp b/llvm/tools/llvm-profgen/ProfileGenerator.cpp --- a/llvm/tools/llvm-profgen/ProfileGenerator.cpp +++ b/llvm/tools/llvm-profgen/ProfileGenerator.cpp @@ -48,6 +48,11 @@ cl::desc("Keep the last K frames while merging cold profile. 1 means the " "context-less base profile")); +static cl::opt EnableCSPreInliner( + "csspgo-preinliner", cl::Hidden, cl::init(false), + cl::desc("Run a global pre-inliner to merge context profile based on " + "estimated global top-down inline decisions")); + extern cl::opt ProfileSummaryCutoffCold; using namespace llvm; @@ -401,7 +406,8 @@ // Run global pre-inliner to adjust/merge context profile based on estimated // inline decisions. - CSPreInliner(ProfileMap, HotCountThreshold, ColdCountThreshold).run(); + if (EnableCSPreInliner) + CSPreInliner(ProfileMap, HotCountThreshold, ColdCountThreshold).run(); // Trim and merge cold context profile using cold threshold above; SampleContextTrimmer(ProfileMap)