summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
authorPeter Collingbourne <peter@pcc.me.uk>2017-09-14 05:02:59 +0000
committerPeter Collingbourne <peter@pcc.me.uk>2017-09-14 05:02:59 +0000
commitcfbd089237a6212c949b647136e4bd53c42f6e1c (patch)
tree9305e8809f40c33ef7bb6418d74802095331a729 /llvm
parentdf0b8438758478204156b74195787a9e2b35c23a (diff)
downloadbcm5719-llvm-cfbd089237a6212c949b647136e4bd53c42f6e1c.tar.gz
bcm5719-llvm-cfbd089237a6212c949b647136e4bd53c42f6e1c.zip
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
Diffstat (limited to 'llvm')
-rw-r--r--llvm/include/llvm/IR/ModuleSummaryIndex.h10
-rw-r--r--llvm/lib/Transforms/IPO/FunctionImport.cpp17
-rw-r--r--llvm/lib/Transforms/IPO/LowerTypeTests.cpp10
-rw-r--r--llvm/test/LTO/Resolution/X86/Inputs/dead-strip-alias.ll4
-rw-r--r--llvm/test/LTO/Resolution/X86/dead-strip-alias.ll20
-rw-r--r--llvm/test/LTO/Resolution/X86/lowertypetests.ll13
6 files changed, 56 insertions, 18 deletions
diff --git a/llvm/include/llvm/IR/ModuleSummaryIndex.h b/llvm/include/llvm/IR/ModuleSummaryIndex.h
index 1ffd81b5ec0..d1564c1e2ce 100644
--- a/llvm/include/llvm/IR/ModuleSummaryIndex.h
+++ b/llvm/include/llvm/IR/ModuleSummaryIndex.h
@@ -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 {
diff --git a/llvm/lib/Transforms/IPO/FunctionImport.cpp b/llvm/lib/Transforms/IPO/FunctionImport.cpp
index da763b18d4d..9f20cbc6fed 100644
--- a/llvm/lib/Transforms/IPO/FunctionImport.cpp
+++ b/llvm/lib/Transforms/IPO/FunctionImport.cpp
@@ -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();
diff --git a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
index 49cc14c5b59..027f426649c 100644
--- a/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
+++ b/llvm/lib/Transforms/IPO/LowerTypeTests.cpp
@@ -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;
}
}
}
diff --git a/llvm/test/LTO/Resolution/X86/Inputs/dead-strip-alias.ll b/llvm/test/LTO/Resolution/X86/Inputs/dead-strip-alias.ll
new file mode 100644
index 00000000000..16154d2c45b
--- /dev/null
+++ b/llvm/test/LTO/Resolution/X86/Inputs/dead-strip-alias.ll
@@ -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
diff --git a/llvm/test/LTO/Resolution/X86/dead-strip-alias.ll b/llvm/test/LTO/Resolution/X86/dead-strip-alias.ll
new file mode 100644
index 00000000000..d009a484e4f
--- /dev/null
+++ b/llvm/test/LTO/Resolution/X86/dead-strip-alias.ll
@@ -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
+}
diff --git a/llvm/test/LTO/Resolution/X86/lowertypetests.ll b/llvm/test/LTO/Resolution/X86/lowertypetests.ll
index c84a786e66f..b87452c8e7a 100644
--- a/llvm/test/LTO/Resolution/X86/lowertypetests.ll
+++ b/llvm/test/LTO/Resolution/X86/lowertypetests.ll
@@ -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"}
OpenPOWER on IntegriCloud