[llvm] change GlobalValueSummaryMapTy from std::map to llvm::MapVector (PR #157839)

via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 10 04:53:30 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-ir

Author: Zhaoxuan Jiang (nocchijiang)

<details>
<summary>Changes</summary>



---
Full diff: https://github.com/llvm/llvm-project/pull/157839.diff


3 Files Affected:

- (modified) llvm/include/llvm/IR/ModuleSummaryIndex.h (+34-24) 
- (modified) llvm/include/llvm/IR/ModuleSummaryIndexYAML.h (+4-4) 
- (modified) llvm/lib/AsmParser/LLParser.cpp (+2-2) 


``````````diff
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<GlobalValue::GUID, GlobalValueSummaryInfo>;
+    llvm::MapVector<GlobalValue::GUID, GlobalValueSummaryInfo>;
 
 /// 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<const GlobalValueSummaryMapTy::value_type *, 3, int>
+  PointerIntPair<const GlobalValueSummaryMapTy *, 3, int>
       RefAndFlags;
+  PointerIntPair<const GlobalValueSummaryMapTy::value_type *, 1, bool>
+      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<ValueInfo> {
   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<ValueInfo> {
     // 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<GlobalValueSummaryMapTy> GlobalValueMap = std::make_unique<GlobalValueSummaryMapTy>();
 
   /// 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<uint64_t> &stackIds() const { return StackIds; }
 
@@ -1610,7 +1620,7 @@ class ModuleSummaryIndex {
       if (!S.second.SummaryList.size() ||
           !isa<FunctionSummary>(S.second.SummaryList.front().get()))
         continue;
-      discoverNodes(ValueInfo(HaveGVs, &S), FunctionHasParent);
+      discoverNodes(ValueInfo(HaveGVs, &S, GlobalValueMap.get()), FunctionHasParent);
     }
 
     SmallVector<FunctionSummary::EdgeTy, 0> 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<ModuleSummaryIndex *> : public GraphTraits<ValueInfo> {
     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<GlobalValueSummaryMapTy> {
       if (GVSum.Aliasee) {
         auto ASum = std::make_unique<AliasSummary>(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<ModuleSummaryIndex>::mapping().
@@ -244,7 +244,7 @@ template <> struct CustomMappingTraits<GlobalValueSummaryMapTy> {
       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<FunctionSummary>(
           GVFlags, /*NumInsts=*/0, FunctionSummary::FFlags{}, std::move(Refs),
@@ -324,10 +324,10 @@ template <> struct CustomMappingTraits<TypeIdSummaryMapTy> {
 
 template <> struct MappingTraits<ModuleSummaryIndex> {
   static void mapping(IO &io, ModuleSummaryIndex& index) {
-    io.mapOptional("GlobalValueMap", index.GlobalValueMap);
+    io.mapOptional("GlobalValueMap", *index.GlobalValueMap);
     if (!io.outputting())
       CustomMappingTraits<GlobalValueSummaryMapTy>::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();

``````````

</details>


https://github.com/llvm/llvm-project/pull/157839


More information about the llvm-commits mailing list