From 81392d2751e75fb9b3107f8d6436a35f7966bedd Mon Sep 17 00:00:00 2001 From: Zhaoxuan Jiang Date: Wed, 10 Sep 2025 19:07:18 +0800 Subject: [PATCH] change GlobalValueSummaryMapTy from std::map to llvm::MapVector --- llvm/include/llvm/IR/ModuleSummaryIndex.h | 58 +++++++++++-------- llvm/include/llvm/IR/ModuleSummaryIndexYAML.h | 8 +-- llvm/lib/AsmParser/LLParser.cpp | 4 +- 3 files changed, 40 insertions(+), 30 deletions(-) diff --git a/llvm/include/llvm/IR/ModuleSummaryIndex.h b/llvm/include/llvm/IR/ModuleSummaryIndex.h index ac79d91d417c2..d7f8cc1058591 100644 --- a/llvm/include/llvm/IR/ModuleSummaryIndex.h +++ b/llvm/include/llvm/IR/ModuleSummaryIndex.h @@ -17,6 +17,7 @@ #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" +#include "llvm/ADT/MapVector.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallString.h" #include "llvm/ADT/SmallVector.h" @@ -177,22 +178,29 @@ struct alignas(8) GlobalValueSummaryInfo { /// of the map is unknown, resulting in inefficiencies due to repeated /// insertions and resizing. using GlobalValueSummaryMapTy = - std::map; + llvm::MapVector; /// Struct that holds a reference to a particular GUID in a global value /// summary. struct ValueInfo { enum Flags { HaveGV = 1, ReadOnly = 2, WriteOnly = 4 }; - PointerIntPair + PointerIntPair RefAndFlags; + PointerIntPair + Offset; ValueInfo() = default; - ValueInfo(bool HaveGVs, const GlobalValueSummaryMapTy::value_type *R) { - RefAndFlags.setPointer(R); + ValueInfo(bool HaveGVs, const GlobalValueSummaryMapTy::value_type *R, const GlobalValueSummaryMapTy *Map/* = nullptr*/) { + RefAndFlags.setPointer(Map); RefAndFlags.setInt(HaveGVs); + Offset.setPointer(R); + if (R != nullptr && Map != nullptr) + Offset.setPointer((const GlobalValueSummaryMapTy::value_type *)((uintptr_t)R - (uintptr_t)Map->begin())); + if (R != nullptr) + Offset.setInt(true); } - explicit operator bool() const { return getRef(); } + explicit operator bool() const { return Offset.getInt(); } GlobalValue::GUID getGUID() const { return getRef()->first; } const GlobalValue *getValue() const { @@ -243,7 +251,9 @@ struct ValueInfo { } const GlobalValueSummaryMapTy::value_type *getRef() const { - return RefAndFlags.getPointer(); + if (RefAndFlags.getPointer()) + return RefAndFlags.getPointer()->begin() + (intptr_t)Offset.getPointer() / sizeof(GlobalValueSummaryMapTy::value_type); + return Offset.getPointer(); } /// Returns the most constraining visibility among summaries. The @@ -286,11 +296,11 @@ inline bool operator<(const ValueInfo &A, const ValueInfo &B) { template <> struct DenseMapInfo { static inline ValueInfo getEmptyKey() { - return ValueInfo(false, (GlobalValueSummaryMapTy::value_type *)-8); + return ValueInfo(false, (GlobalValueSummaryMapTy::value_type *)-8, nullptr); } static inline ValueInfo getTombstoneKey() { - return ValueInfo(false, (GlobalValueSummaryMapTy::value_type *)-16); + return ValueInfo(false, (GlobalValueSummaryMapTy::value_type *)-16, nullptr); } static inline bool isSpecialKey(ValueInfo V) { @@ -301,7 +311,7 @@ template <> struct DenseMapInfo { // We are not supposed to mix ValueInfo(s) with different HaveGVs flag // in a same container. assert(isSpecialKey(L) || isSpecialKey(R) || (L.haveGVs() == R.haveGVs())); - return L.getRef() == R.getRef(); + return L.Offset == R.Offset && L.RefAndFlags.getPointer() == R.RefAndFlags.getPointer(); } static unsigned getHashValue(ValueInfo I) { return hash_value(I.getRef()); } }; @@ -1397,7 +1407,7 @@ class ModuleSummaryIndex { private: /// Map from value name to list of summary instances for values of that /// name (may be duplicates in the COMDAT case, e.g.). - GlobalValueSummaryMapTy GlobalValueMap; + std::unique_ptr GlobalValueMap = std::make_unique(); /// Holds strings for combined index, mapping to the corresponding module ID. ModulePathStringTableTy ModulePathStringTable; @@ -1501,7 +1511,7 @@ class ModuleSummaryIndex { GlobalValueSummaryMapTy::value_type * getOrInsertValuePtr(GlobalValue::GUID GUID) { - return &*GlobalValueMap.emplace(GUID, GlobalValueSummaryInfo(HaveGVs)) + return &*GlobalValueMap->try_emplace(GUID, GlobalValueSummaryInfo(HaveGVs)) .first; } @@ -1534,11 +1544,11 @@ class ModuleSummaryIndex { void addBlockCount(uint64_t C) { BlockCount += C; } void setBlockCount(uint64_t C) { BlockCount = C; } - gvsummary_iterator begin() { return GlobalValueMap.begin(); } - const_gvsummary_iterator begin() const { return GlobalValueMap.begin(); } - gvsummary_iterator end() { return GlobalValueMap.end(); } - const_gvsummary_iterator end() const { return GlobalValueMap.end(); } - size_t size() const { return GlobalValueMap.size(); } + gvsummary_iterator begin() { return GlobalValueMap->begin(); } + const_gvsummary_iterator begin() const { return GlobalValueMap->begin(); } + gvsummary_iterator end() { return GlobalValueMap->end(); } + const_gvsummary_iterator end() const { return GlobalValueMap->end(); } + size_t size() const { return GlobalValueMap->size(); } const std::vector &stackIds() const { return StackIds; } @@ -1610,7 +1620,7 @@ class ModuleSummaryIndex { if (!S.second.SummaryList.size() || !isa(S.second.SummaryList.front().get())) continue; - discoverNodes(ValueInfo(HaveGVs, &S), FunctionHasParent); + discoverNodes(ValueInfo(HaveGVs, &S, GlobalValueMap.get()), FunctionHasParent); } SmallVector Edges; @@ -1677,18 +1687,18 @@ class ModuleSummaryIndex { /// Return a ValueInfo for the index value_type (convenient when iterating /// index). ValueInfo getValueInfo(const GlobalValueSummaryMapTy::value_type &R) const { - return ValueInfo(HaveGVs, &R); + return ValueInfo(HaveGVs, &R, GlobalValueMap.get()); } /// Return a ValueInfo for GUID if it exists, otherwise return ValueInfo(). ValueInfo getValueInfo(GlobalValue::GUID GUID) const { - auto I = GlobalValueMap.find(GUID); - return ValueInfo(HaveGVs, I == GlobalValueMap.end() ? nullptr : &*I); + auto I = GlobalValueMap->find(GUID); + return ValueInfo(HaveGVs, I == GlobalValueMap->end() ? nullptr : &*I, GlobalValueMap.get()); } /// Return a ValueInfo for \p GUID. ValueInfo getOrInsertValueInfo(GlobalValue::GUID GUID) { - return ValueInfo(HaveGVs, getOrInsertValuePtr(GUID)); + return ValueInfo(HaveGVs, getOrInsertValuePtr(GUID), GlobalValueMap.get()); } // Save a string in the Index. Use before passing Name to @@ -1701,7 +1711,7 @@ class ModuleSummaryIndex { assert(!HaveGVs); auto VP = getOrInsertValuePtr(GUID); VP->second.U.Name = Name; - return ValueInfo(HaveGVs, VP); + return ValueInfo(HaveGVs, VP, GlobalValueMap.get()); } /// Return a ValueInfo for \p GV and mark it as belonging to GV. @@ -1709,7 +1719,7 @@ class ModuleSummaryIndex { assert(HaveGVs); auto VP = getOrInsertValuePtr(GV->getGUID()); VP->second.U.GV = GV; - return ValueInfo(HaveGVs, VP); + return ValueInfo(HaveGVs, VP, GlobalValueMap.get()); } /// Return the GUID for \p OriginalId in the OidGuidMap. @@ -2038,7 +2048,7 @@ struct GraphTraits : public GraphTraits { G.SummaryList.push_back(std::move(Root)); static auto P = GlobalValueSummaryMapTy::value_type(GlobalValue::GUID(0), std::move(G)); - return ValueInfo(I->haveGVs(), &P); + return ValueInfo(I->haveGVs(), &P, nullptr); } }; } // end namespace llvm diff --git a/llvm/include/llvm/IR/ModuleSummaryIndexYAML.h b/llvm/include/llvm/IR/ModuleSummaryIndexYAML.h index 531de514822e8..acf7a1a1ef4a5 100644 --- a/llvm/include/llvm/IR/ModuleSummaryIndexYAML.h +++ b/llvm/include/llvm/IR/ModuleSummaryIndexYAML.h @@ -232,7 +232,7 @@ template <> struct CustomMappingTraits { if (GVSum.Aliasee) { auto ASum = std::make_unique(GVFlags); V.try_emplace(*GVSum.Aliasee, /*IsAnalysis=*/false); - ValueInfo AliaseeVI(/*IsAnalysis=*/false, &*V.find(*GVSum.Aliasee)); + ValueInfo AliaseeVI(/*IsAnalysis=*/false, &*V.find(*GVSum.Aliasee), &V); // Note: Aliasee cannot be filled until all summaries are loaded. // This is done in fixAliaseeLinks() which is called in // MappingTraits::mapping(). @@ -244,7 +244,7 @@ template <> struct CustomMappingTraits { Refs.reserve(GVSum.Refs.size()); for (auto &RefGUID : GVSum.Refs) { auto It = V.try_emplace(RefGUID, /*IsAnalysis=*/false).first; - Refs.push_back(ValueInfo(/*IsAnalysis=*/false, &*It)); + Refs.push_back(ValueInfo(/*IsAnalysis=*/false, &*It, &V)); } Elem.SummaryList.push_back(std::make_unique( GVFlags, /*NumInsts=*/0, FunctionSummary::FFlags{}, std::move(Refs), @@ -324,10 +324,10 @@ template <> struct CustomMappingTraits { template <> struct MappingTraits { static void mapping(IO &io, ModuleSummaryIndex& index) { - io.mapOptional("GlobalValueMap", index.GlobalValueMap); + io.mapOptional("GlobalValueMap", *index.GlobalValueMap); if (!io.outputting()) CustomMappingTraits::fixAliaseeLinks( - index.GlobalValueMap); + *index.GlobalValueMap); if (io.outputting()) { io.mapOptional("TypeIdMap", index.TypeIdMap); diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 1bc2906f63b07..8d6c0951e8181 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -9166,7 +9166,7 @@ bool LLParser::parseTypeIdSummary(TypeIdSummary &TIS) { } static ValueInfo EmptyVI = - ValueInfo(false, (GlobalValueSummaryMapTy::value_type *)-8); + ValueInfo(false, (GlobalValueSummaryMapTy::value_type *)-8, nullptr); /// TypeIdCompatibleVtableEntry /// ::= 'typeidCompatibleVTable' ':' '(' 'name' ':' STRINGCONSTANT ',' @@ -10765,7 +10765,7 @@ bool LLParser::parseGVReference(ValueInfo &VI, unsigned &GVId) { VI = NumberedValueInfos[GVId]; } else // We will create a forward reference to the stored location. - VI = ValueInfo(false, FwdVIRef); + VI = ValueInfo(false, FwdVIRef, nullptr); if (ReadOnly) VI.setReadOnly();