From 31b9aa7755ac3384498f544058d93b5eea164458 Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Thu, 30 Nov 2017 23:05:52 +0000 Subject: [PATCH] ThinLTOBitcodeWriter: Try harder to discard unused references to the merged module. 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 | 14 +++++++++++--- .../ThinLTOBitcodeWriter/filter-alias.ll | 2 ++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp b/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp index 7d6d538bc11..4138606bf0f 100644 --- a/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp +++ b/lib/Transforms/IPO/ThinLTOBitcodeWriter.cpp @@ -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(); diff --git a/test/Transforms/ThinLTOBitcodeWriter/filter-alias.ll b/test/Transforms/ThinLTOBitcodeWriter/filter-alias.ll index 48f2900da36..eb0cbe78a73 100644 --- a/test/Transforms/ThinLTOBitcodeWriter/filter-alias.ll +++ b/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" -- 2.50.1