[PATCH] D40593: ThinLTOBitcodeWriter: Try harder to discard unused references to the merged module.

Peter Collingbourne via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 28 17:52:35 PST 2017


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

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.


https://reviews.llvm.org/D40593

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


Index: llvm/test/Transforms/ThinLTOBitcodeWriter/filter-alias.ll
===================================================================
--- llvm/test/Transforms/ThinLTOBitcodeWriter/filter-alias.ll
+++ llvm/test/Transforms/ThinLTOBitcodeWriter/filter-alias.ll
@@ -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"
Index: llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
===================================================================
--- llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
+++ llvm/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp
@@ -40,9 +40,17 @@
       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();
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D40593.124678.patch
Type: text/x-patch
Size: 1498 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20171129/7685c77b/attachment.bin>


More information about the llvm-commits mailing list