From: Evgeniy Stepanov Date: Fri, 2 Jun 2017 18:24:23 +0000 (+0000) Subject: Skip CFI for dead functions. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=93d430ca1459ecf1a905a29999838862add06dff;p=llvm Skip CFI for dead functions. Differential Revision: https://reviews.llvm.org/D33805 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304578 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/ModuleSummaryIndexYAML.h b/include/llvm/IR/ModuleSummaryIndexYAML.h index 78fdb602027..891d84c2dbc 100644 --- a/include/llvm/IR/ModuleSummaryIndexYAML.h +++ b/include/llvm/IR/ModuleSummaryIndexYAML.h @@ -128,6 +128,8 @@ template <> struct MappingTraits { }; struct FunctionSummaryYaml { + unsigned Linkage; + bool NotEligibleToImport, Live; std::vector TypeTests; std::vector TypeTestAssumeVCalls, TypeCheckedLoadVCalls; @@ -168,6 +170,9 @@ namespace yaml { 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 +204,12 @@ template <> struct CustomMappingTraits { } 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 +221,10 @@ template <> struct CustomMappingTraits { 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, + static_cast(FSum->flags().NotEligibleToImport), + static_cast(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()}); } @@ -231,6 +238,8 @@ template <> struct MappingTraits { static void mapping(IO &io, ModuleSummaryIndex& index) { io.mapOptional("GlobalValueMap", index.GlobalValueMap); io.mapOptional("TypeIdMap", index.TypeIdMap); + io.mapOptional("WithGlobalValueDeadStripping", + index.WithGlobalValueDeadStripping); } }; diff --git a/lib/Transforms/IPO/LowerTypeTests.cpp b/lib/Transforms/IPO/LowerTypeTests.cpp index ca4ee92f971..7bec50d9d25 100644 --- a/lib/Transforms/IPO/LowerTypeTests.cpp +++ b/lib/Transforms/IPO/LowerTypeTests.cpp @@ -1442,9 +1442,8 @@ bool LowerTypeTestsModule::lower() { for (auto &P : *ExportSummary) { for (auto &S : P.second.SummaryList) { auto *FS = dyn_cast(S.get()); - if (!FS) + if (!FS || !ExportSummary->isGlobalValueLive(FS)) continue; - // FIXME: Only add live functions. for (GlobalValue::GUID G : FS->type_tests()) for (Metadata *MD : MetadataByGUID[G]) AddTypeIdUse(MD).IsExported = true; diff --git a/test/Transforms/LowerTypeTests/Inputs/import-unsat.yaml b/test/Transforms/LowerTypeTests/Inputs/import-unsat.yaml index b7a1d208fc6..cfac37986bd 100644 --- a/test/Transforms/LowerTypeTests/Inputs/import-unsat.yaml +++ b/test/Transforms/LowerTypeTests/Inputs/import-unsat.yaml @@ -1,7 +1,8 @@ --- GlobalValueMap: 42: - - TypeTests: [123] + - Live: true + TypeTests: [123] TypeIdMap: typeid1: TTRes: diff --git a/test/Transforms/LowerTypeTests/Inputs/use-typeid1-dead.yaml b/test/Transforms/LowerTypeTests/Inputs/use-typeid1-dead.yaml new file mode 100644 index 00000000000..7baa02ada86 --- /dev/null +++ b/test/Transforms/LowerTypeTests/Inputs/use-typeid1-dead.yaml @@ -0,0 +1,7 @@ +--- +GlobalValueMap: + 42: + - Live: false + TypeTests: [14276520915468743435] # guid("typeid1") +WithGlobalValueDeadStripping: true +... diff --git a/test/Transforms/LowerTypeTests/Inputs/use-typeid1-typeid2.yaml b/test/Transforms/LowerTypeTests/Inputs/use-typeid1-typeid2.yaml index 031b2e8de04..f30257cfc0d 100644 --- a/test/Transforms/LowerTypeTests/Inputs/use-typeid1-typeid2.yaml +++ b/test/Transforms/LowerTypeTests/Inputs/use-typeid1-typeid2.yaml @@ -1,5 +1,6 @@ --- GlobalValueMap: 42: - - TypeTests: [14276520915468743435, 15427464259790519041] # guid("typeid1"), guid("typeid2") + - Live: true + TypeTests: [14276520915468743435, 15427464259790519041] # guid("typeid1"), guid("typeid2") ... diff --git a/test/Transforms/LowerTypeTests/export-dead.ll b/test/Transforms/LowerTypeTests/export-dead.ll new file mode 100644 index 00000000000..265402b34a6 --- /dev/null +++ b/test/Transforms/LowerTypeTests/export-dead.ll @@ -0,0 +1,14 @@ +; 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: WithGlobalValueDeadStripping: true +; SUMMARY-NEXT: ... diff --git a/test/Transforms/LowerTypeTests/export-nothing.ll b/test/Transforms/LowerTypeTests/export-nothing.ll index 9ab41b5f6cb..8ad33153994 100644 --- a/test/Transforms/LowerTypeTests/export-nothing.ll +++ b/test/Transforms/LowerTypeTests/export-nothing.ll @@ -4,4 +4,5 @@ ; CHECK: --- ; CHECK-NEXT: GlobalValueMap: ; CHECK-NEXT: TypeIdMap: +; CHECK-NEXT: WithGlobalValueDeadStripping: false ; CHECK-NEXT: ... diff --git a/test/Transforms/LowerTypeTests/import-unsat.ll b/test/Transforms/LowerTypeTests/import-unsat.ll index 76b24400198..6cb9b26fb57 100644 --- a/test/Transforms/LowerTypeTests/import-unsat.ll +++ b/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: false +; SUMMARY-NEXT: Live: true +; SUMMARY-NEXT: TypeTests: [ 123 ] ; SUMMARY-NEXT: TypeIdMap: ; SUMMARY-NEXT: typeid1: ; SUMMARY-NEXT: TTRes: diff --git a/test/Transforms/WholeProgramDevirt/Inputs/export.yaml b/test/Transforms/WholeProgramDevirt/Inputs/export.yaml index 0f6f59de752..71cf38b216c 100644 --- a/test/Transforms/WholeProgramDevirt/Inputs/export.yaml +++ b/test/Transforms/WholeProgramDevirt/Inputs/export.yaml @@ -1,7 +1,8 @@ --- GlobalValueMap: 42: - - TypeTestAssumeVCalls: + - Live: true + TypeTestAssumeVCalls: - GUID: 14276520915468743435 # typeid1 Offset: 0 TypeCheckedLoadVCalls: diff --git a/test/Transforms/WholeProgramDevirt/Inputs/import-indir.yaml b/test/Transforms/WholeProgramDevirt/Inputs/import-indir.yaml index 1cb3ad3f134..30159c5012b 100644 --- a/test/Transforms/WholeProgramDevirt/Inputs/import-indir.yaml +++ b/test/Transforms/WholeProgramDevirt/Inputs/import-indir.yaml @@ -1,7 +1,8 @@ --- GlobalValueMap: 42: - - TypeTestAssumeVCalls: + - Live: true + TypeTestAssumeVCalls: - GUID: 123 Offset: 0 - GUID: 456 diff --git a/test/Transforms/WholeProgramDevirt/export-nothing.ll b/test/Transforms/WholeProgramDevirt/export-nothing.ll index e0814efbf9c..4707eaa17ea 100644 --- a/test/Transforms/WholeProgramDevirt/export-nothing.ll +++ b/test/Transforms/WholeProgramDevirt/export-nothing.ll @@ -4,4 +4,5 @@ ; CHECK: --- ; CHECK-NEXT: GlobalValueMap: ; CHECK-NEXT: TypeIdMap: +; CHECK-NEXT: WithGlobalValueDeadStripping: false ; CHECK-NEXT: ... diff --git a/test/Transforms/WholeProgramDevirt/export-single-impl.ll b/test/Transforms/WholeProgramDevirt/export-single-impl.ll index f4f3fd054c4..15de77381ed 100644 --- a/test/Transforms/WholeProgramDevirt/export-single-impl.ll +++ b/test/Transforms/WholeProgramDevirt/export-single-impl.ll @@ -38,6 +38,7 @@ ; SUMMARY-NEXT: Kind: SingleImpl ; SUMMARY-NEXT: SingleImplName: 'vf4$merged' ; SUMMARY-NEXT: ResByArg: +; SUMMARY-NEXT: WithGlobalValueDeadStripping: false ; SUMMARY-NEXT: ... ; CHECK: @vt1 = constant void (i8*)* @vf1 diff --git a/test/Transforms/WholeProgramDevirt/export-uniform-ret-val.ll b/test/Transforms/WholeProgramDevirt/export-uniform-ret-val.ll index 1d7030c41fd..11b1c5de4d8 100644 --- a/test/Transforms/WholeProgramDevirt/export-uniform-ret-val.ll +++ b/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: diff --git a/test/Transforms/WholeProgramDevirt/export-unique-ret-val.ll b/test/Transforms/WholeProgramDevirt/export-unique-ret-val.ll index 174a573b5b0..0878d01cce0 100644 --- a/test/Transforms/WholeProgramDevirt/export-unique-ret-val.ll +++ b/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: diff --git a/test/Transforms/WholeProgramDevirt/export-unsuccessful-checked.ll b/test/Transforms/WholeProgramDevirt/export-unsuccessful-checked.ll index 0785ade2857..3132444a9f3 100644 --- a/test/Transforms/WholeProgramDevirt/export-unsuccessful-checked.ll +++ b/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 diff --git a/test/Transforms/WholeProgramDevirt/import-indir.ll b/test/Transforms/WholeProgramDevirt/import-indir.ll index 1de9352eeb2..73c982b1789 100644 --- a/test/Transforms/WholeProgramDevirt/import-indir.ll +++ b/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: false +; SUMMARY-NEXT: Live: true ; SUMMARY-NEXT: TypeTestAssumeVCalls: ; SUMMARY-NEXT: - GUID: 123 ; SUMMARY-NEXT: Offset: 0