From 73b6b323c501870814cdc6b3cee4a66feb6171ef Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 14 Apr 2023 15:30:27 +0200 Subject: [PATCH] [Pipelines] Add LoopSink and DivRemPairs to LTO post-link pipeline As pointed out in D148010, these passes are missing from the LTO post-link pipeline. They are present in the pre-link pipeline, but LoopSink is completely useless there (it will always be fully undone by LICM post-link) and DivRemPairs is mostly useless (I believe most of what it does will be undone by InstCombine). I've not added RelLookupTableConverterPass, because it's also disabled in the LTO pre-link pipeline, with a comment that there is an unresolved issue with full LTO. Compile-time impact of the extra passes is minimal. Of course, LoopSink will have a larger impact in PGO builds. Differential Revision: https://reviews.llvm.org/D148343 --- llvm/lib/Passes/PassBuilderPipelines.cpp | 18 ++++++++++++++++-- llvm/test/Other/new-pm-lto-defaults.ll | 2 ++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp index 4b75969..52b2304 100644 --- a/llvm/lib/Passes/PassBuilderPipelines.cpp +++ b/llvm/lib/Passes/PassBuilderPipelines.cpp @@ -1836,10 +1836,24 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level, MPM.addPass(HotColdSplittingPass()); // Add late LTO optimization passes. + FunctionPassManager LateFPM; + + // LoopSink pass sinks instructions hoisted by LICM, which serves as a + // canonicalization pass that enables other optimizations. As a result, + // LoopSink pass needs to be a very late IR pass to avoid undoing LICM + // result too early. + LateFPM.addPass(LoopSinkPass()); + + // This hoists/decomposes div/rem ops. It should run after other sink/hoist + // passes to avoid re-sinking, but before SimplifyCFG because it can allow + // flattening of blocks. + LateFPM.addPass(DivRemPairsPass()); + // Delete basic blocks, which optimization passes may have killed. - MPM.addPass(createModuleToFunctionPassAdaptor(SimplifyCFGPass( + LateFPM.addPass(SimplifyCFGPass( SimplifyCFGOptions().convertSwitchRangeToICmp(true).hoistCommonInsts( - true)))); + true))); + MPM.addPass(createModuleToFunctionPassAdaptor(std::move(LateFPM))); // Drop bodies of available eternally objects to improve GlobalDCE. MPM.addPass(EliminateAvailableExternallyPass()); diff --git a/llvm/test/Other/new-pm-lto-defaults.ll b/llvm/test/Other/new-pm-lto-defaults.ll index 892373f..7fc01850 100644 --- a/llvm/test/Other/new-pm-lto-defaults.ll +++ b/llvm/test/Other/new-pm-lto-defaults.ll @@ -135,6 +135,8 @@ ; CHECK-O23SZ-NEXT: Running pass: JumpThreadingPass on foo ; CHECK-O23SZ-NEXT: Running pass: LowerTypeTestsPass ; CHECK-O-NEXT: Running pass: LowerTypeTestsPass +; CHECK-O23SZ-NEXT: Running pass: LoopSink +; CHECK-O23SZ-NEXT: Running pass: DivRemPairs ; CHECK-O23SZ-NEXT: Running pass: SimplifyCFGPass ; CHECK-O23SZ-NEXT: Running pass: EliminateAvailableExternallyPass ; CHECK-O23SZ-NEXT: Running pass: GlobalDCEPass -- 2.7.4