Index: llvm/include/llvm/IR/ModuleSummaryIndex.h =================================================================== --- llvm/include/llvm/IR/ModuleSummaryIndex.h +++ llvm/include/llvm/IR/ModuleSummaryIndex.h @@ -235,6 +235,10 @@ /// Return the list of values referenced by this global value definition. ArrayRef 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 &); @@ -266,6 +270,12 @@ } }; +inline GlobalValueSummary *GlobalValueSummary::getBaseObject() { + if (auto *AS = dyn_cast(this)) + return &AS->getAliasee(); + return this; +} + /// \brief Function summary information to aid decisions and implementation of /// importing. class FunctionSummary : public GlobalValueSummary { Index: llvm/lib/Transforms/IPO/FunctionImport.cpp =================================================================== --- llvm/lib/Transforms/IPO/FunctionImport.cpp +++ llvm/lib/Transforms/IPO/FunctionImport.cpp @@ -324,10 +324,8 @@ DEBUG(dbgs() << "Ignores Dead GUID: " << GVSummary.first << "\n"); continue; } - auto *Summary = GVSummary.second; - if (auto *AS = dyn_cast(Summary)) - Summary = &AS->getAliasee(); - auto *FuncSummary = dyn_cast(Summary); + auto *FuncSummary = + dyn_cast(GVSummary.second->getBaseObject()); if (!FuncSummary) // Skip import for global variables continue; @@ -488,17 +486,12 @@ 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(Summary.get())) + if (auto *FS = dyn_cast(Base)) for (auto Call : FS->calls()) visit(Call.first); - if (auto *AS = dyn_cast(Summary.get())) { - auto AliaseeGUID = AS->getAliasee().getOriginalName(); - ValueInfo AliaseeVI = Index.getValueInfo(AliaseeGUID); - if (AliaseeVI) - visit(AliaseeVI); - } } } Index.setWithGlobalValueDeadStripping(); Index: llvm/lib/Transforms/IPO/LowerTypeTests.cpp =================================================================== --- llvm/lib/Transforms/IPO/LowerTypeTests.cpp +++ llvm/lib/Transforms/IPO/LowerTypeTests.cpp @@ -1703,12 +1703,12 @@ for (auto &P : *ExportSummary) { for (auto &S : P.second.SummaryList) { - auto *FS = dyn_cast(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(S->getBaseObject())) + for (GlobalValue::GUID G : FS->type_tests()) + for (Metadata *MD : MetadataByGUID[G]) + AddTypeIdUse(MD).IsExported = true; } } } Index: llvm/test/LTO/Resolution/X86/Inputs/dead-strip-alias.ll =================================================================== --- /dev/null +++ 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 Index: llvm/test/LTO/Resolution/X86/dead-strip-alias.ll =================================================================== --- /dev/null +++ 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 +} Index: llvm/test/LTO/Resolution/X86/lowertypetests.ll =================================================================== --- llvm/test/LTO/Resolution/X86/lowertypetests.ll +++ 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"}