Index: include/llvm/IR/ModuleSummaryIndexYAML.h =================================================================== --- include/llvm/IR/ModuleSummaryIndexYAML.h +++ include/llvm/IR/ModuleSummaryIndexYAML.h @@ -128,6 +128,7 @@ }; struct FunctionSummaryYaml { + unsigned Linkage, NotEligibleToImport, Live; std::vector TypeTests; std::vector TypeTestAssumeVCalls, TypeCheckedLoadVCalls; @@ -168,6 +169,9 @@ template <> struct MappingTraits { static void mapping(IO &io, FunctionSummaryYaml& summary) { + io.mapOptional("Linkage", summary.Linkage); + io.mapOptional("NotEligibleToImport", summary.NotEligibleToImport); + io.mapOptional("Live", summary.Live); io.mapOptional("TypeTests", summary.TypeTests); io.mapOptional("TypeTestAssumeVCalls", summary.TypeTestAssumeVCalls); io.mapOptional("TypeCheckedLoadVCalls", summary.TypeCheckedLoadVCalls); @@ -199,12 +203,12 @@ } auto &Elem = V[KeyInt]; for (auto &FSum : FSums) { - GlobalValueSummary::GVFlags GVFlags(GlobalValue::ExternalLinkage, false, - false); Elem.SummaryList.push_back(llvm::make_unique( - GVFlags, 0, ArrayRef{}, - ArrayRef{}, std::move(FSum.TypeTests), - std::move(FSum.TypeTestAssumeVCalls), + GlobalValueSummary::GVFlags( + static_cast(FSum.Linkage), + FSum.NotEligibleToImport, FSum.Live), + 0, ArrayRef{}, ArrayRef{}, + std::move(FSum.TypeTests), std::move(FSum.TypeTestAssumeVCalls), std::move(FSum.TypeCheckedLoadVCalls), std::move(FSum.TypeTestAssumeConstVCalls), std::move(FSum.TypeCheckedLoadConstVCalls))); @@ -216,8 +220,9 @@ for (auto &Sum : P.second.SummaryList) { if (auto *FSum = dyn_cast(Sum.get())) FSums.push_back(FunctionSummaryYaml{ - FSum->type_tests(), FSum->type_test_assume_vcalls(), - FSum->type_checked_load_vcalls(), + FSum->flags().Linkage, FSum->flags().NotEligibleToImport, + FSum->flags().Live, FSum->type_tests(), + FSum->type_test_assume_vcalls(), FSum->type_checked_load_vcalls(), FSum->type_test_assume_const_vcalls(), FSum->type_checked_load_const_vcalls()}); } Index: lib/Transforms/IPO/LowerTypeTests.cpp =================================================================== --- lib/Transforms/IPO/LowerTypeTests.cpp +++ lib/Transforms/IPO/LowerTypeTests.cpp @@ -1442,9 +1442,8 @@ for (auto &P : *ExportSummary) { for (auto &S : P.second.SummaryList) { auto *FS = dyn_cast(S.get()); - if (!FS) + if (!FS || !FS->isLive()) continue; - // FIXME: Only add live functions. for (GlobalValue::GUID G : FS->type_tests()) for (Metadata *MD : MetadataByGUID[G]) AddTypeIdUse(MD).IsExported = true; Index: lib/Transforms/IPO/WholeProgramDevirt.cpp =================================================================== --- lib/Transforms/IPO/WholeProgramDevirt.cpp +++ lib/Transforms/IPO/WholeProgramDevirt.cpp @@ -1324,9 +1324,8 @@ for (auto &P : *ExportSummary) { for (auto &S : P.second.SummaryList) { auto *FS = dyn_cast(S.get()); - if (!FS) + if (!FS || !FS->isLive()) continue; - // FIXME: Only add live functions. for (FunctionSummary::VFuncId VF : FS->type_test_assume_vcalls()) { for (Metadata *MD : MetadataByGUID[VF.GUID]) { CallSlots[{MD, VF.Offset}].CSInfo.SummaryHasTypeTestAssumeUsers = Index: test/Transforms/LowerTypeTests/Inputs/import-unsat.yaml =================================================================== --- test/Transforms/LowerTypeTests/Inputs/import-unsat.yaml +++ test/Transforms/LowerTypeTests/Inputs/import-unsat.yaml @@ -1,7 +1,8 @@ --- GlobalValueMap: 42: - - TypeTests: [123] + - Live: 1 + TypeTests: [123] TypeIdMap: typeid1: TTRes: Index: test/Transforms/LowerTypeTests/Inputs/use-typeid1-dead.yaml =================================================================== --- /dev/null +++ test/Transforms/LowerTypeTests/Inputs/use-typeid1-dead.yaml @@ -0,0 +1,6 @@ +--- +GlobalValueMap: + 42: + - Live: 0 + TypeTests: [14276520915468743435] # guid("typeid1"), guid("typeid2") +... Index: test/Transforms/LowerTypeTests/Inputs/use-typeid1-typeid2.yaml =================================================================== --- test/Transforms/LowerTypeTests/Inputs/use-typeid1-typeid2.yaml +++ test/Transforms/LowerTypeTests/Inputs/use-typeid1-typeid2.yaml @@ -1,5 +1,6 @@ --- GlobalValueMap: 42: - - TypeTests: [14276520915468743435, 15427464259790519041] # guid("typeid1"), guid("typeid2") + - Live: 1 + TypeTests: [14276520915468743435, 15427464259790519041] # guid("typeid1"), guid("typeid2") ... Index: test/Transforms/LowerTypeTests/export-dead.ll =================================================================== --- /dev/null +++ test/Transforms/LowerTypeTests/export-dead.ll @@ -0,0 +1,13 @@ +; The only use of "typeid1" is in a dead function. Export nothing. + +; RUN: opt -S -lowertypetests -lowertypetests-summary-action=export -lowertypetests-read-summary=%S/Inputs/use-typeid1-dead.yaml -lowertypetests-write-summary=%t < %s | FileCheck %s +; RUN: FileCheck --check-prefix=SUMMARY %s < %t + +@foo = constant i32 42, !type !0 + +!0 = !{i32 0, !"typeid1"} + +; CHECK-NOT: @__typeid_typeid1_global_addr = + +; SUMMARY: TypeIdMap: +; SUMMARY-NEXT: ... Index: test/Transforms/LowerTypeTests/import-unsat.ll =================================================================== --- test/Transforms/LowerTypeTests/import-unsat.ll +++ test/Transforms/LowerTypeTests/import-unsat.ll @@ -4,7 +4,10 @@ ; SUMMARY: GlobalValueMap: ; SUMMARY-NEXT: 42: -; SUMMARY-NEXT: - TypeTests: [ 123 ] +; SUMMARY-NEXT: - Linkage: 0 +; SUMMARY-NEXT: NotEligibleToImport: 0 +; SUMMARY-NEXT: Live: 1 +; SUMMARY-NEXT: TypeTests: [ 123 ] ; SUMMARY-NEXT: TypeIdMap: ; SUMMARY-NEXT: typeid1: ; SUMMARY-NEXT: TTRes: Index: test/Transforms/WholeProgramDevirt/Inputs/export.yaml =================================================================== --- test/Transforms/WholeProgramDevirt/Inputs/export.yaml +++ test/Transforms/WholeProgramDevirt/Inputs/export.yaml @@ -1,7 +1,8 @@ --- GlobalValueMap: 42: - - TypeTestAssumeVCalls: + - Live: 1 + TypeTestAssumeVCalls: - GUID: 14276520915468743435 # typeid1 Offset: 0 TypeCheckedLoadVCalls: Index: test/Transforms/WholeProgramDevirt/Inputs/import-indir.yaml =================================================================== --- test/Transforms/WholeProgramDevirt/Inputs/import-indir.yaml +++ test/Transforms/WholeProgramDevirt/Inputs/import-indir.yaml @@ -1,7 +1,8 @@ --- GlobalValueMap: 42: - - TypeTestAssumeVCalls: + - Live: 1 + TypeTestAssumeVCalls: - GUID: 123 Offset: 0 - GUID: 456 Index: test/Transforms/WholeProgramDevirt/export-uniform-ret-val.ll =================================================================== --- test/Transforms/WholeProgramDevirt/export-uniform-ret-val.ll +++ test/Transforms/WholeProgramDevirt/export-uniform-ret-val.ll @@ -1,8 +1,7 @@ ; RUN: opt -wholeprogramdevirt -wholeprogramdevirt-summary-action=export -wholeprogramdevirt-read-summary=%S/Inputs/export.yaml -wholeprogramdevirt-write-summary=%t -S -o - %s | FileCheck %s ; RUN: FileCheck --check-prefix=SUMMARY %s < %t -; SUMMARY: - TypeTests: -; SUMMARY-NEXT: TypeTestAssumeVCalls: +; SUMMARY-NOT: TypeTests: ; SUMMARY: TypeIdMap: ; SUMMARY-NEXT: typeid4: Index: test/Transforms/WholeProgramDevirt/export-unique-ret-val.ll =================================================================== --- test/Transforms/WholeProgramDevirt/export-unique-ret-val.ll +++ test/Transforms/WholeProgramDevirt/export-unique-ret-val.ll @@ -1,8 +1,7 @@ ; RUN: opt -wholeprogramdevirt -wholeprogramdevirt-summary-action=export -wholeprogramdevirt-read-summary=%S/Inputs/export.yaml -wholeprogramdevirt-write-summary=%t -S -o - %s | FileCheck %s ; RUN: FileCheck --check-prefix=SUMMARY %s < %t -; SUMMARY: - TypeTests: -; SUMMARY-NEXT: TypeTestAssumeVCalls: +; SUMMARY-NOT: TypeTests: ; SUMMARY: TypeIdMap: ; SUMMARY-NEXT: typeid3: Index: test/Transforms/WholeProgramDevirt/export-unsuccessful-checked.ll =================================================================== --- test/Transforms/WholeProgramDevirt/export-unsuccessful-checked.ll +++ test/Transforms/WholeProgramDevirt/export-unsuccessful-checked.ll @@ -1,7 +1,7 @@ ; RUN: opt -wholeprogramdevirt -wholeprogramdevirt-summary-action=export -wholeprogramdevirt-read-summary=%S/Inputs/export.yaml -wholeprogramdevirt-write-summary=%t -o /dev/null %s ; RUN: FileCheck %s < %t -; CHECK: - TypeTests: [ 15427464259790519041, 17525413373118030901 ] +; CHECK: TypeTests: [ 15427464259790519041, 17525413373118030901 ] ; CHECK-NEXT: TypeTestAssumeVCalls: @vt1a = constant void (i8*)* @vf1a, !type !0 Index: test/Transforms/WholeProgramDevirt/import-indir.ll =================================================================== --- test/Transforms/WholeProgramDevirt/import-indir.ll +++ test/Transforms/WholeProgramDevirt/import-indir.ll @@ -4,7 +4,9 @@ ; SUMMARY: GlobalValueMap: ; SUMMARY-NEXT: 42: -; SUMMARY-NEXT: - TypeTests: +; SUMMARY-NEXT: - Linkage: 0 +; SUMMARY-NEXT: NotEligibleToImport: 0 +; SUMMARY-NEXT: Live: 1 ; SUMMARY-NEXT: TypeTestAssumeVCalls: ; SUMMARY-NEXT: - GUID: 123 ; SUMMARY-NEXT: Offset: 0