]> granicus.if.org Git - llvm/commitdiff
ThinLTOBitcodeWriter: Try harder to discard unused references to the merged module.
authorPeter Collingbourne <peter@pcc.me.uk>
Thu, 30 Nov 2017 23:05:52 +0000 (23:05 +0000)
committerPeter Collingbourne <peter@pcc.me.uk>
Thu, 30 Nov 2017 23:05:52 +0000 (23:05 +0000)
If the thin module has no references to an internal global in the
merged module, we need to make sure to preserve that property if the
global is a member of a comdat group, as otherwise promotion can end
up adding global symbols to the comdat, which is not allowed.

This situation can arise if the external global in the thin module
has dead constant users, which would cause use_empty() to return
false and would cause us to try to promote it. To prevent this from
happening, discard the dead constant users before asking whether a
global is empty.

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

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

lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
test/Transforms/ThinLTOBitcodeWriter/filter-alias.ll

index 7d6d538bc116f3954315609be6476aeded41c842..4138606bf0fa69205b3b6762e8fb1addbc76d19a 100644 (file)
@@ -40,9 +40,17 @@ void promoteInternals(Module &ExportM, Module &ImportM, StringRef ModuleId,
       continue;
 
     auto Name = ExportGV.getName();
-    GlobalValue *ImportGV = ImportM.getNamedValue(Name);
-    if ((!ImportGV || ImportGV->use_empty()) && !PromoteExtra.count(&ExportGV))
-      continue;
+    GlobalValue *ImportGV = nullptr;
+    if (!PromoteExtra.count(&ExportGV)) {
+      ImportGV = ImportM.getNamedValue(Name);
+      if (!ImportGV)
+        continue;
+      ImportGV->removeDeadConstantUsers();
+      if (ImportGV->use_empty()) {
+        ImportGV->eraseFromParent();
+        continue;
+      }
+    }
 
     std::string NewName = (Name + ModuleId).str();
 
index 48f2900da3698b4ecee453f510e356ca9c57316d..eb0cbe78a731804e32498aa54b54f7f0f7f40627 100644 (file)
@@ -1,7 +1,9 @@
 ; RUN: opt -thinlto-bc -o %t %s
 ; RUN: llvm-modextract -n 0 -o - %t | llvm-dis | FileCheck --check-prefix=CHECK0 %s
 ; RUN: llvm-modextract -n 1 -o - %t | llvm-dis | FileCheck --check-prefix=CHECK1 %s
+; CHECK0-NOT: @{{.*}}anon{{.*}}=
 ; CHECK0: @al = external global i8*
+; CHECK0-NOT: @{{.*}}anon{{.*}}=
 ; CHECK1: @al = unnamed_addr alias i8*,
 
 target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"