diff options
author | Davide Italiano <davide@freebsd.org> | 2017-10-05 18:23:25 +0000 |
---|---|---|
committer | Davide Italiano <davide@freebsd.org> | 2017-10-05 18:23:25 +0000 |
commit | bfe76f9ddff5392fb49ef0c19c3265042a69f5d5 (patch) | |
tree | 4b7ec55f90b8036d90f2bd5d5129d2ed8a242983 | |
parent | 300b37a6ada03c0eae8f1a9ce95cd916ae8b0429 (diff) |
[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
-rw-r--r-- | lib/Transforms/IPO/PassManagerBuilder.cpp | 24 | ||||
-rw-r--r-- | 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 1a17508d2b2..67fd4b9c67d 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 9ecfc4f6201..9e5176eddaa 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 |