From bfe76f9ddff5392fb49ef0c19c3265042a69f5d5 Mon Sep 17 00:00:00 2001 From: Davide Italiano Date: Thu, 5 Oct 2017 18:23:25 +0000 Subject: [PATCH] [PassManager] Improve the interaction between -O2 and ThinLTO. Run GDCE slightly later so that we don't have to repeat it twice when preparing for Thin. Thanks to Mehdi for the suggestion. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@314999 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/PassManagerBuilder.cpp | 24 +++++++++++------------ test/Other/pass-pipelines.ll | 6 +++--- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/lib/Transforms/IPO/PassManagerBuilder.cpp b/lib/Transforms/IPO/PassManagerBuilder.cpp index 1a17508d2b23..67fd4b9c67da 100644 --- a/lib/Transforms/IPO/PassManagerBuilder.cpp +++ b/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -508,17 +508,6 @@ void PassManagerBuilder::populateModulePassManager( // we must insert a no-op module pass to reset the pass manager. MPM.add(createBarrierNoopPass()); - // The inliner performs some kind of dead code elimination as it goes, - // but there are cases that are not really caught by it. We might - // at some point consider teaching the inliner about them, but it - // is OK for now to run GlobalOpt + GlobalDCE in tandem as their - // benefits generally outweight the cost, making the whole pipeline - // faster. - if (RunInliner) { - MPM.add(createGlobalOptimizerPass()); - MPM.add(createGlobalDCEPass()); - } - if (RunPartialInlining) MPM.add(createPartialInliningPass()); @@ -538,12 +527,21 @@ void PassManagerBuilder::populateModulePassManager( if (!DisableUnitAtATime) MPM.add(createReversePostOrderFunctionAttrsPass()); + // The inliner performs some kind of dead code elimination as it goes, + // but there are cases that are not really caught by it. We might + // at some point consider teaching the inliner about them, but it + // is OK for now to run GlobalOpt + GlobalDCE in tandem as their + // benefits generally outweight the cost, making the whole pipeline + // faster. + if (RunInliner) { + MPM.add(createGlobalOptimizerPass()); + MPM.add(createGlobalDCEPass()); + } + // If we are planning to perform ThinLTO later, let's not bloat the code with // unrolling/vectorization/... now. We'll first run the inliner + CGSCC passes // during ThinLTO and perform the rest of the optimizations afterward. if (PrepareForThinLTO) { - // Reduce the size of the IR as much as possible. - MPM.add(createGlobalOptimizerPass()); // Rename anon globals to be able to export them in the summary. MPM.add(createNameAnonGlobalPass()); return; diff --git a/test/Other/pass-pipelines.ll b/test/Other/pass-pipelines.ll index 9ecfc4f6201e..9e5176eddaa7 100644 --- a/test/Other/pass-pipelines.ll +++ b/test/Other/pass-pipelines.ll @@ -55,15 +55,15 @@ ; Next we break out of the main Function passes inside the CGSCC pipeline with ; a barrier pass. ; CHECK-O2: A No-Op Barrier Pass -; Reduce the size of the IR ASAP after the inliner. -; CHECK-O2-NEXT: Global Variable Optimizer -; CHECK-O2: Dead Global Elimination ; CHECK-O2-NEXT: Eliminate Available Externally ; Inferring function attribute should be right after the CGSCC pipeline, before ; any other optimizations/analyses. ; CHECK-O2-NEXT: CallGraph ; CHECK-O2-NEXT: Deduce function attributes in RPO ; CHECK-O2-NOT: Manager +; Reduce the size of the IR ASAP after the inliner. +; CHECK-O2-NEXT: Global Variable Optimizer +; CHECK-O2: Dead Global Elimination ; Next is the late function pass pipeline. ; CHECK-O2: FunctionPass Manager ; CHECK-O2-NOT: Manager