浏览代码

[ThinLTO] Compute GUID directly from GV when building per-module index

Summary:
I discovered when writing the summary parsing support that the
per-module index builder and writer are computing the GUID from the
value name alone (ignoring the linkage type). This was ok since those
GUID were not emitted in the bitcode, and there are never multiple
conflicting names in a single module.

However, I don't see a reason for making the GUID computation different
for the per-module case. It also makes things simpler on the parsing
side to have the GUID computation consistent. So this patch changes the
summary analysis phase and the per-module summary writer to compute the
GUID using the facility on the GlobalValue.

Reviewers: pcc, dexonsmith

Subscribers: llvm-commits, inglorion

Differential Revision: https://reviews.llvm.org/D47844

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@335560 91177308-0d34-0410-b5e6-96231b3b80d8
Teresa Johnson 7 年之前
父节点
当前提交
4c45b898f0
共有 3 个文件被更改,包括 15 次插入10 次删除
  1. 7 2
      include/llvm/IR/ModuleSummaryIndex.h
  2. 6 6
      lib/Analysis/ModuleSummaryAnalysis.cpp
  3. 2 2
      lib/Bitcode/Writer/BitcodeWriter.cpp

+ 7 - 2
include/llvm/IR/ModuleSummaryIndex.h

@@ -914,6 +914,12 @@ public:
   std::set<std::string> &cfiFunctionDecls() { return CfiFunctionDecls; }
   std::set<std::string> &cfiFunctionDecls() { return CfiFunctionDecls; }
   const std::set<std::string> &cfiFunctionDecls() const { return CfiFunctionDecls; }
   const std::set<std::string> &cfiFunctionDecls() const { return CfiFunctionDecls; }
 
 
+  /// Add a global value summary for a value.
+  void addGlobalValueSummary(const GlobalValue &GV,
+                             std::unique_ptr<GlobalValueSummary> Summary) {
+    addGlobalValueSummary(getOrInsertValueInfo(&GV), std::move(Summary));
+  }
+
   /// Add a global value summary for a value of the given name.
   /// Add a global value summary for a value of the given name.
   void addGlobalValueSummary(StringRef ValueName,
   void addGlobalValueSummary(StringRef ValueName,
                              std::unique_ptr<GlobalValueSummary> Summary) {
                              std::unique_ptr<GlobalValueSummary> Summary) {
@@ -965,8 +971,7 @@ public:
   GlobalValueSummary *getGlobalValueSummary(const GlobalValue &GV,
   GlobalValueSummary *getGlobalValueSummary(const GlobalValue &GV,
                                             bool PerModuleIndex = true) const {
                                             bool PerModuleIndex = true) const {
     assert(GV.hasName() && "Can't get GlobalValueSummary for GV with no name");
     assert(GV.hasName() && "Can't get GlobalValueSummary for GV with no name");
-    return getGlobalValueSummary(GlobalValue::getGUID(GV.getName()),
-                                 PerModuleIndex);
+    return getGlobalValueSummary(GV.getGUID(), PerModuleIndex);
   }
   }
 
 
   /// Returns the first GlobalValueSummary for \p ValueGUID, asserting that
   /// Returns the first GlobalValueSummary for \p ValueGUID, asserting that

+ 6 - 6
lib/Analysis/ModuleSummaryAnalysis.cpp

@@ -361,7 +361,7 @@ computeFunctionSummary(ModuleSummaryIndex &Index, const Module &M,
       TypeCheckedLoadConstVCalls.takeVector());
       TypeCheckedLoadConstVCalls.takeVector());
   if (NonRenamableLocal)
   if (NonRenamableLocal)
     CantBePromoted.insert(F.getGUID());
     CantBePromoted.insert(F.getGUID());
-  Index.addGlobalValueSummary(F.getName(), std::move(FuncSummary));
+  Index.addGlobalValueSummary(F, std::move(FuncSummary));
 }
 }
 
 
 static void
 static void
@@ -377,7 +377,7 @@ computeVariableSummary(ModuleSummaryIndex &Index, const GlobalVariable &V,
       llvm::make_unique<GlobalVarSummary>(Flags, RefEdges.takeVector());
       llvm::make_unique<GlobalVarSummary>(Flags, RefEdges.takeVector());
   if (NonRenamableLocal)
   if (NonRenamableLocal)
     CantBePromoted.insert(V.getGUID());
     CantBePromoted.insert(V.getGUID());
-  Index.addGlobalValueSummary(V.getName(), std::move(GVarSummary));
+  Index.addGlobalValueSummary(V, std::move(GVarSummary));
 }
 }
 
 
 static void
 static void
@@ -393,7 +393,7 @@ computeAliasSummary(ModuleSummaryIndex &Index, const GlobalAlias &A,
   AS->setAliasee(AliaseeSummary);
   AS->setAliasee(AliaseeSummary);
   if (NonRenamableLocal)
   if (NonRenamableLocal)
     CantBePromoted.insert(A.getGUID());
     CantBePromoted.insert(A.getGUID());
-  Index.addGlobalValueSummary(A.getName(), std::move(AS));
+  Index.addGlobalValueSummary(A, std::move(AS));
 }
 }
 
 
 // Set LiveRoot flag on entries matching the given value name.
 // Set LiveRoot flag on entries matching the given value name.
@@ -455,7 +455,7 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(
                                               /* NotEligibleToImport = */ true,
                                               /* NotEligibleToImport = */ true,
                                               /* Live = */ true,
                                               /* Live = */ true,
                                               /* Local */ GV->isDSOLocal());
                                               /* Local */ GV->isDSOLocal());
-          CantBePromoted.insert(GlobalValue::getGUID(Name));
+          CantBePromoted.insert(GV->getGUID());
           // Create the appropriate summary type.
           // Create the appropriate summary type.
           if (Function *F = dyn_cast<Function>(GV)) {
           if (Function *F = dyn_cast<Function>(GV)) {
             std::unique_ptr<FunctionSummary> Summary =
             std::unique_ptr<FunctionSummary> Summary =
@@ -472,12 +472,12 @@ ModuleSummaryIndex llvm::buildModuleSummaryIndex(
                     ArrayRef<FunctionSummary::VFuncId>{},
                     ArrayRef<FunctionSummary::VFuncId>{},
                     ArrayRef<FunctionSummary::ConstVCall>{},
                     ArrayRef<FunctionSummary::ConstVCall>{},
                     ArrayRef<FunctionSummary::ConstVCall>{});
                     ArrayRef<FunctionSummary::ConstVCall>{});
-            Index.addGlobalValueSummary(Name, std::move(Summary));
+            Index.addGlobalValueSummary(*GV, std::move(Summary));
           } else {
           } else {
             std::unique_ptr<GlobalVarSummary> Summary =
             std::unique_ptr<GlobalVarSummary> Summary =
                 llvm::make_unique<GlobalVarSummary>(GVFlags,
                 llvm::make_unique<GlobalVarSummary>(GVFlags,
                                                     ArrayRef<ValueInfo>{});
                                                     ArrayRef<ValueInfo>{});
-            Index.addGlobalValueSummary(Name, std::move(Summary));
+            Index.addGlobalValueSummary(*GV, std::move(Summary));
           }
           }
         });
         });
   }
   }

+ 2 - 2
lib/Bitcode/Writer/BitcodeWriter.cpp

@@ -3483,7 +3483,7 @@ void ModuleBitcodeWriterBase::writePerModuleFunctionSummaryRecord(
 void ModuleBitcodeWriterBase::writeModuleLevelReferences(
 void ModuleBitcodeWriterBase::writeModuleLevelReferences(
     const GlobalVariable &V, SmallVector<uint64_t, 64> &NameVals,
     const GlobalVariable &V, SmallVector<uint64_t, 64> &NameVals,
     unsigned FSModRefsAbbrev) {
     unsigned FSModRefsAbbrev) {
-  auto VI = Index->getValueInfo(GlobalValue::getGUID(V.getName()));
+  auto VI = Index->getValueInfo(V.getGUID());
   if (!VI || VI.getSummaryList().empty()) {
   if (!VI || VI.getSummaryList().empty()) {
     // Only declarations should not have a summary (a declaration might however
     // Only declarations should not have a summary (a declaration might however
     // have a summary if the def was in module level asm).
     // have a summary if the def was in module level asm).
@@ -3592,7 +3592,7 @@ void ModuleBitcodeWriterBase::writePerModuleGlobalValueSummary() {
     if (!F.hasName())
     if (!F.hasName())
       report_fatal_error("Unexpected anonymous function when writing summary");
       report_fatal_error("Unexpected anonymous function when writing summary");
 
 
-    ValueInfo VI = Index->getValueInfo(GlobalValue::getGUID(F.getName()));
+    ValueInfo VI = Index->getValueInfo(F.getGUID());
     if (!VI || VI.getSummaryList().empty()) {
     if (!VI || VI.getSummaryList().empty()) {
       // Only declarations should not have a summary (a declaration might
       // Only declarations should not have a summary (a declaration might
       // however have a summary if the def was in module level asm).
       // however have a summary if the def was in module level asm).