mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
Reland r313157, "ThinLTO: Correctly follow aliasee references when dead stripping." which was reverted in r313222.
This reland includes a fix for the LowerTypeTests pass so that it looks past aliases when determining which type identifiers are live. Differential Revision: https://reviews.llvm.org/D37842 llvm-svn: 313229
This commit is contained in:
parent
4f2a1f0cb0
commit
e7f0383a82
@ -235,6 +235,10 @@ public:
|
||||
/// Return the list of values referenced by this global value definition.
|
||||
ArrayRef<ValueInfo> refs() const { return RefEdgeList; }
|
||||
|
||||
/// If this is an alias summary, returns the summary of the aliased object (a
|
||||
/// global variable or function), otherwise returns itself.
|
||||
GlobalValueSummary *getBaseObject();
|
||||
|
||||
friend class ModuleSummaryIndex;
|
||||
friend void computeDeadSymbols(class ModuleSummaryIndex &,
|
||||
const DenseSet<GlobalValue::GUID> &);
|
||||
@ -266,6 +270,12 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
inline GlobalValueSummary *GlobalValueSummary::getBaseObject() {
|
||||
if (auto *AS = dyn_cast<AliasSummary>(this))
|
||||
return &AS->getAliasee();
|
||||
return this;
|
||||
}
|
||||
|
||||
/// \brief Function summary information to aid decisions and implementation of
|
||||
/// importing.
|
||||
class FunctionSummary : public GlobalValueSummary {
|
||||
|
@ -324,10 +324,8 @@ static void ComputeImportForModule(
|
||||
DEBUG(dbgs() << "Ignores Dead GUID: " << GVSummary.first << "\n");
|
||||
continue;
|
||||
}
|
||||
auto *Summary = GVSummary.second;
|
||||
if (auto *AS = dyn_cast<AliasSummary>(Summary))
|
||||
Summary = &AS->getAliasee();
|
||||
auto *FuncSummary = dyn_cast<FunctionSummary>(Summary);
|
||||
auto *FuncSummary =
|
||||
dyn_cast<FunctionSummary>(GVSummary.second->getBaseObject());
|
||||
if (!FuncSummary)
|
||||
// Skip import for global variables
|
||||
continue;
|
||||
@ -488,17 +486,12 @@ 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->getBaseObject();
|
||||
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();
|
||||
|
@ -1703,12 +1703,12 @@ bool LowerTypeTestsModule::lower() {
|
||||
|
||||
for (auto &P : *ExportSummary) {
|
||||
for (auto &S : P.second.SummaryList) {
|
||||
auto *FS = dyn_cast<FunctionSummary>(S.get());
|
||||
if (!FS || !ExportSummary->isGlobalValueLive(FS))
|
||||
if (!ExportSummary->isGlobalValueLive(S.get()))
|
||||
continue;
|
||||
for (GlobalValue::GUID G : FS->type_tests())
|
||||
for (Metadata *MD : MetadataByGUID[G])
|
||||
AddTypeIdUse(MD).IsExported = true;
|
||||
if (auto *FS = dyn_cast<FunctionSummary>(S->getBaseObject()))
|
||||
for (GlobalValue::GUID G : FS->type_tests())
|
||||
for (Metadata *MD : MetadataByGUID[G])
|
||||
AddTypeIdUse(MD).IsExported = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
4
test/LTO/Resolution/X86/Inputs/dead-strip-alias.ll
Normal file
4
test/LTO/Resolution/X86/Inputs/dead-strip-alias.ll
Normal 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
|
20
test/LTO/Resolution/X86/dead-strip-alias.ll
Normal file
20
test/LTO/Resolution/X86/dead-strip-alias.ll
Normal 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
|
||||
}
|
@ -1,21 +1,32 @@
|
||||
; RUN: opt -thinlto-bc -o %t %s
|
||||
; RUN: llvm-lto2 run -r %t,f,plx -r %t,foo,lx -r %t,foo,plx -o %t1 %t
|
||||
; RUN: llvm-lto2 run -r %t,f,plx -r %t,g_alias,plx -r %t,foo,lx -r %t,foo,plx -r %t,bar,lx -r %t,bar,plx -o %t1 %t
|
||||
; RUN: llvm-nm %t1.0 | FileCheck --check-prefix=MERGED %s
|
||||
; RUN: llvm-nm %t1.1 | FileCheck %s
|
||||
|
||||
; MERGED: R __typeid_bar_global_addr
|
||||
; MERGED: R __typeid_foo_global_addr
|
||||
; CHECK: U __typeid_bar_global_addr
|
||||
; CHECK: U __typeid_foo_global_addr
|
||||
|
||||
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-unknown-linux-gnu"
|
||||
|
||||
@foo = global i32 0, !type !0
|
||||
@bar = global i32 0, !type !1
|
||||
|
||||
define i1 @f(i8* %ptr) {
|
||||
%p = call i1 @llvm.type.test(i8* %ptr, metadata !"foo")
|
||||
ret i1 %p
|
||||
}
|
||||
|
||||
@g_alias = alias i1 (i8*), i1 (i8*)* @g
|
||||
|
||||
define internal i1 @g(i8* %ptr) {
|
||||
%p = call i1 @llvm.type.test(i8* %ptr, metadata !"bar")
|
||||
ret i1 %p
|
||||
}
|
||||
|
||||
declare i1 @llvm.type.test(i8* %ptr, metadata %typeid) nounwind readnone
|
||||
|
||||
!0 = !{i32 0, !"foo"}
|
||||
!1 = !{i32 0, !"bar"}
|
||||
|
Loading…
Reference in New Issue
Block a user