diff --git a/llvm/include/llvm/ProfileData/SampleProf.h b/llvm/include/llvm/ProfileData/SampleProf.h --- a/llvm/include/llvm/ProfileData/SampleProf.h +++ b/llvm/include/llvm/ProfileData/SampleProf.h @@ -994,8 +994,6 @@ /// Optionally scale samples by \p Weight. sampleprof_error merge(const FunctionSamples &Other, uint64_t Weight = 1) { sampleprof_error Result = sampleprof_error::success; - if (!GUIDToFuncNameMap) - GUIDToFuncNameMap = Other.GUIDToFuncNameMap; if (Context.getName().empty()) Context = Other.getContext(); if (FunctionHash == 0) { @@ -1129,7 +1127,7 @@ /// translate \p Name in current FunctionSamples into its original name /// by looking up in the function map GUIDToFuncNameMap. /// If the original name doesn't exist in the map, return empty StringRef. - StringRef getFuncName(StringRef Name) const { + static StringRef getFuncName(StringRef Name) { if (!UseMD5) return Name; @@ -1189,7 +1187,7 @@ /// GUIDToFuncNameMap saves the mapping from GUID to the symbol name, for /// all the function symbols defined or declared in current module. - DenseMap *GUIDToFuncNameMap = nullptr; + static LLVM_THREAD_LOCAL DenseMap *GUIDToFuncNameMap; // Assume the input \p Name is a name coming from FunctionSamples itself. // If UseMD5 is true, the name is already a GUID and we @@ -1203,10 +1201,7 @@ void findAllNames(DenseSet &NameSet) const; bool operator==(const FunctionSamples &Other) const { - return (GUIDToFuncNameMap == Other.GUIDToFuncNameMap || - (GUIDToFuncNameMap && Other.GUIDToFuncNameMap && - *GUIDToFuncNameMap == *Other.GUIDToFuncNameMap)) && - FunctionHash == Other.FunctionHash && Context == Other.Context && + return FunctionHash == Other.FunctionHash && Context == Other.Context && TotalSamples == Other.TotalSamples && TotalHeadSamples == Other.TotalHeadSamples && BodySamples == Other.BodySamples && 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 @@ -46,6 +46,8 @@ bool FunctionSamples::UseMD5 = false; bool FunctionSamples::HasUniqSuffix = true; bool FunctionSamples::ProfileIsFS = false; +LLVM_THREAD_LOCAL DenseMap + *FunctionSamples::GUIDToFuncNameMap = nullptr; } // namespace sampleprof } // namespace llvm diff --git a/llvm/lib/Transforms/IPO/SampleProfile.cpp b/llvm/lib/Transforms/IPO/SampleProfile.cpp --- a/llvm/lib/Transforms/IPO/SampleProfile.cpp +++ b/llvm/lib/Transforms/IPO/SampleProfile.cpp @@ -360,7 +360,7 @@ } // Update GUIDToFuncNameMap for each function including inlinees. - SetGUIDToFuncNameMapForAll(&CurrentGUIDToFuncNameMap); + FunctionSamples::GUIDToFuncNameMap = &CurrentGUIDToFuncNameMap; } ~GUIDToFuncNameMapper() { @@ -371,30 +371,10 @@ // Reset GUIDToFuncNameMap for of each function as they're no // longer valid at this point. - SetGUIDToFuncNameMapForAll(nullptr); + FunctionSamples::GUIDToFuncNameMap = nullptr; } private: - void SetGUIDToFuncNameMapForAll(DenseMap *Map) { - std::queue FSToUpdate; - for (auto &IFS : CurrentReader.getProfiles()) { - FSToUpdate.push(&IFS.second); - } - - while (!FSToUpdate.empty()) { - FunctionSamples *FS = FSToUpdate.front(); - FSToUpdate.pop(); - FS->GUIDToFuncNameMap = Map; - for (const auto &ICS : FS->getCallsiteSamples()) { - const FunctionSamplesMap &FSMap = ICS.second; - for (const auto &IFS : FSMap) { - FunctionSamples &FS = const_cast(IFS.second); - FSToUpdate.push(&FS); - } - } - } - } - SampleProfileReader &CurrentReader; Module &CurrentModule; DenseMap &CurrentGUIDToFuncNameMap; @@ -1148,7 +1128,8 @@ if (auto *CB = dyn_cast(&I)) { if (!isa(I)) { if ((FS = findCalleeFunctionSamples(*CB))) { - assert((!FunctionSamples::UseMD5 || FS->GUIDToFuncNameMap) && + assert((!FunctionSamples::UseMD5 || + FunctionSamples::GUIDToFuncNameMap) && "GUIDToFuncNameMap has to be populated"); AllCandidates.push_back(CB); if (FS->getHeadSamplesEstimate() > 0 ||