ThinLTO: Correctly follow aliasee references when dead stripping.

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.

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

llvm-svn: 313157
This commit is contained in:
Peter Collingbourne 2017-09-13 17:09:20 +00:00
parent 9707aa74d6
commit d067c8ed59
3 changed files with 29 additions and 8 deletions

View File

@ -488,17 +488,14 @@ 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.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();

View File

@ -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

View File

@ -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
}