[PATCH] D37789: ThinLTO: Correctly follow aliasee references when dead stripping.

Peter Collingbourne via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 12 20:39:32 PDT 2017


pcc created this revision.
Herald added subscribers: hiraditya, inglorion, mehdi_amini.

We were previously handling aliases during dead stripping by adding
the aliased global's "original name" GUID to the worklist. This will
lead to incorrect behaviour if the global has local linkage because
the original name GUID will not correspond to the global's GUID in
the summary.

Because an alias is just another name for the global that it
references, there is no need to mark the referenced global as used,
or to follow references from any other copies of the global. So all
we need to do is to follow references from the aliasee's summary
instead of the alias.


https://reviews.llvm.org/D37789

Files:
  llvm/lib/Transforms/IPO/FunctionImport.cpp
  llvm/test/LTO/Resolution/X86/Inputs/dead-strip-alias.ll
  llvm/test/LTO/Resolution/X86/dead-strip-alias.ll


Index: llvm/test/LTO/Resolution/X86/dead-strip-alias.ll
===================================================================
--- /dev/null
+++ llvm/test/LTO/Resolution/X86/dead-strip-alias.ll
@@ -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"
+
+ at alias = alias i8*, i8** @internal
+
+ at internal = internal global i8* @external
+ at external = external global i8
+
+define i8** @main() {
+  ret i8** @alias
+}
Index: llvm/test/LTO/Resolution/X86/Inputs/dead-strip-alias.ll
===================================================================
--- /dev/null
+++ llvm/test/LTO/Resolution/X86/Inputs/dead-strip-alias.ll
@@ -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"
+
+ at external = global i8 42
Index: llvm/lib/Transforms/IPO/FunctionImport.cpp
===================================================================
--- llvm/lib/Transforms/IPO/FunctionImport.cpp
+++ llvm/lib/Transforms/IPO/FunctionImport.cpp
@@ -470,17 +470,14 @@
   while (!Worklist.empty()) {
     auto VI = Worklist.pop_back_val();
     for (auto &Summary : VI.getSummaryList()) {
-      for (auto Ref : Summary->refs())
+      GlobalValueSummary *Base = Summary.get();
+      if (auto *AS = dyn_cast<AliasSummary>(Base))
+        Base = &AS->getAliasee();
+      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();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D37789.114962.patch
Type: text/x-patch
Size: 2222 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170913/595dd6f0/attachment.bin>


More information about the llvm-commits mailing list