]> granicus.if.org Git - llvm/commitdiff
Reland r313157, "ThinLTO: Correctly follow aliasee references when dead stripping...
authorPeter Collingbourne <peter@pcc.me.uk>
Thu, 14 Sep 2017 05:02:59 +0000 (05:02 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Thu, 14 Sep 2017 05:02:59 +0000 (05:02 +0000)
This reland includes a fix for the LowerTypeTests pass so that it
looks past aliases when determining which type identifiers are live.

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@313229 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/IR/ModuleSummaryIndex.h
lib/Transforms/IPO/FunctionImport.cpp
lib/Transforms/IPO/LowerTypeTests.cpp
test/LTO/Resolution/X86/Inputs/dead-strip-alias.ll [new file with mode: 0644]
test/LTO/Resolution/X86/dead-strip-alias.ll [new file with mode: 0644]
test/LTO/Resolution/X86/lowertypetests.ll

index 1ffd81b5ec038e30cc4ad5eb0b209e0d087c8c72..d1564c1e2cec7fc624f0b6b493301538faebd4f8 100644 (file)
@@ -235,6 +235,10 @@ public:
   /// Return the list of values referenced by this global value definition.
   ArrayRef<ValueInfo> refs() const { return RefEdgeList; }
 
+  /// If this is an alias summary, returns the summary of the aliased object (a
+  /// global variable or function), otherwise returns itself.
+  GlobalValueSummary *getBaseObject();
+
   friend class ModuleSummaryIndex;
   friend void computeDeadSymbols(class ModuleSummaryIndex &,
                                  const DenseSet<GlobalValue::GUID> &);
@@ -266,6 +270,12 @@ public:
   }
 };
 
+inline GlobalValueSummary *GlobalValueSummary::getBaseObject() {
+  if (auto *AS = dyn_cast<AliasSummary>(this))
+    return &AS->getAliasee();
+  return this;
+}
+
 /// \brief Function summary information to aid decisions and implementation of
 /// importing.
 class FunctionSummary : public GlobalValueSummary {
index da763b18d4d461b6e7897ab90a0799a04f8afab3..9f20cbc6fed855067ad6995007837b2fe86c4b64 100644 (file)
@@ -324,10 +324,8 @@ static void ComputeImportForModule(
       DEBUG(dbgs() << "Ignores Dead GUID: " << GVSummary.first << "\n");
       continue;
     }
-    auto *Summary = GVSummary.second;
-    if (auto *AS = dyn_cast<AliasSummary>(Summary))
-      Summary = &AS->getAliasee();
-    auto *FuncSummary = dyn_cast<FunctionSummary>(Summary);
+    auto *FuncSummary =
+        dyn_cast<FunctionSummary>(GVSummary.second->getBaseObject());
     if (!FuncSummary)
       // Skip import for global variables
       continue;
@@ -488,17 +486,12 @@ void llvm::computeDeadSymbols(
   while (!Worklist.empty()) {
     auto VI = Worklist.pop_back_val();
     for (auto &Summary : VI.getSummaryList()) {
-      for (auto Ref : Summary->refs())
+      GlobalValueSummary *Base = Summary->getBaseObject();
+      for (auto Ref : Base->refs())
         visit(Ref);
-      if (auto *FS = dyn_cast<FunctionSummary>(Summary.get()))
+      if (auto *FS = dyn_cast<FunctionSummary>(Base))
         for (auto Call : FS->calls())
           visit(Call.first);
-      if (auto *AS = dyn_cast<AliasSummary>(Summary.get())) {
-        auto AliaseeGUID = AS->getAliasee().getOriginalName();
-        ValueInfo AliaseeVI = Index.getValueInfo(AliaseeGUID);
-        if (AliaseeVI)
-          visit(AliaseeVI);
-      }
     }
   }
   Index.setWithGlobalValueDeadStripping();
index 49cc14c5b59202b9f8735ae3bd833f6cbc1255e1..027f426649c404ba020fd4aa7349265e5dd2dcd7 100644 (file)
@@ -1703,12 +1703,12 @@ bool LowerTypeTestsModule::lower() {
 
     for (auto &P : *ExportSummary) {
       for (auto &S : P.second.SummaryList) {
-        auto *FS = dyn_cast<FunctionSummary>(S.get());
-        if (!FS || !ExportSummary->isGlobalValueLive(FS))
+        if (!ExportSummary->isGlobalValueLive(S.get()))
           continue;
-        for (GlobalValue::GUID G : FS->type_tests())
-          for (Metadata *MD : MetadataByGUID[G])
-            AddTypeIdUse(MD).IsExported = true;
+        if (auto *FS = dyn_cast<FunctionSummary>(S->getBaseObject()))
+          for (GlobalValue::GUID G : FS->type_tests())
+            for (Metadata *MD : MetadataByGUID[G])
+              AddTypeIdUse(MD).IsExported = true;
       }
     }
   }
diff --git a/test/LTO/Resolution/X86/Inputs/dead-strip-alias.ll b/test/LTO/Resolution/X86/Inputs/dead-strip-alias.ll
new file mode 100644 (file)
index 0000000..16154d2
--- /dev/null
@@ -0,0 +1,4 @@
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+@external = global i8 42
diff --git a/test/LTO/Resolution/X86/dead-strip-alias.ll b/test/LTO/Resolution/X86/dead-strip-alias.ll
new file mode 100644 (file)
index 0000000..d009a48
--- /dev/null
@@ -0,0 +1,20 @@
+; RUN: opt -module-summary -o %t %s
+; RUN: opt -module-summary -o %t2 %S/Inputs/dead-strip-alias.ll
+; RUN: llvm-lto2 run %t -r %t,main,px -r %t,alias,p -r %t,external, \
+; RUN:               %t2 -r %t2,external,p \
+; RUN: -save-temps -o %t3
+; RUN: llvm-nm %t3.1 | FileCheck %s
+
+; CHECK: D external
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+@alias = alias i8*, i8** @internal
+
+@internal = internal global i8* @external
+@external = external global i8
+
+define i8** @main() {
+  ret i8** @alias
+}
index c84a786e66fc2f176aff4dbd30236a3a3f2eb2ef..b87452c8e7aaf4c3c96d2946fb0f0b5b3a808608 100644 (file)
@@ -1,21 +1,32 @@
 ; RUN: opt -thinlto-bc -o %t %s
-; RUN: llvm-lto2 run -r %t,f,plx -r %t,foo,lx -r %t,foo,plx -o %t1 %t
+; RUN: llvm-lto2 run -r %t,f,plx -r %t,g_alias,plx -r %t,foo,lx -r %t,foo,plx -r %t,bar,lx -r %t,bar,plx -o %t1 %t
 ; RUN: llvm-nm %t1.0 | FileCheck --check-prefix=MERGED %s
 ; RUN: llvm-nm %t1.1 | FileCheck %s
 
+; MERGED: R __typeid_bar_global_addr
 ; MERGED: R __typeid_foo_global_addr
+; CHECK: U __typeid_bar_global_addr
 ; CHECK: U __typeid_foo_global_addr
 
 target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
 target triple = "x86_64-unknown-linux-gnu"
 
 @foo = global i32 0, !type !0
+@bar = global i32 0, !type !1
 
 define i1 @f(i8* %ptr) {
   %p = call i1 @llvm.type.test(i8* %ptr, metadata !"foo")
   ret i1 %p
 }
 
+@g_alias = alias i1 (i8*), i1 (i8*)* @g
+
+define internal i1 @g(i8* %ptr) {
+  %p = call i1 @llvm.type.test(i8* %ptr, metadata !"bar")
+  ret i1 %p
+}
+
 declare i1 @llvm.type.test(i8* %ptr, metadata %typeid) nounwind readnone
 
 !0 = !{i32 0, !"foo"}
+!1 = !{i32 0, !"bar"}