aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--llvm/include/llvm/Transforms/IPO/PassManagerBuilder.h2
-rw-r--r--llvm/lib/Passes/PassBuilderPipelines.cpp3
-rw-r--r--llvm/lib/Transforms/IPO/PassManagerBuilder.cpp177
3 files changed, 1 insertions, 181 deletions
diff --git a/llvm/include/llvm/Transforms/IPO/PassManagerBuilder.h b/llvm/include/llvm/Transforms/IPO/PassManagerBuilder.h
index 2676f27..c8ea1f5b 100644
--- a/llvm/include/llvm/Transforms/IPO/PassManagerBuilder.h
+++ b/llvm/include/llvm/Transforms/IPO/PassManagerBuilder.h
@@ -211,8 +211,6 @@ private:
void addExtensionsToPM(ExtensionPointTy ETy,
legacy::PassManagerBase &PM) const;
void addInitialAliasAnalysisPasses(legacy::PassManagerBase &PM) const;
- void addLTOOptimizationPasses(legacy::PassManagerBase &PM);
- void addLateLTOOptimizationPasses(legacy::PassManagerBase &PM);
void addFunctionSimplificationPasses(legacy::PassManagerBase &MPM);
void addVectorPasses(legacy::PassManagerBase &PM, bool IsFullLTO);
diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index a534517..5932431 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -1728,8 +1728,7 @@ PassBuilder::buildLTODefaultPipeline(OptimizationLevel Level,
// in ICP (which is performed earlier than this in the regular LTO pipeline).
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr, true));
- // Enable splitting late in the FullLTO post-link pipeline. This is done in
- // the same stage in the old pass manager (\ref addLateLTOOptimizationPasses).
+ // Enable splitting late in the FullLTO post-link pipeline.
if (EnableHotColdSplit)
MPM.addPass(HotColdSplittingPass());
diff --git a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp
index ae787be..8eef8267 100644
--- a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp
+++ b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp
@@ -898,183 +898,6 @@ void PassManagerBuilder::populateModulePassManager(
MPM.add(createAnnotationRemarksLegacyPass());
}
-void PassManagerBuilder::addLTOOptimizationPasses(legacy::PassManagerBase &PM) {
- // Load sample profile before running the LTO optimization pipeline.
- if (!PGOSampleUse.empty()) {
- PM.add(createPruneEHPass());
- PM.add(createSampleProfileLoaderPass(PGOSampleUse));
- }
-
- // Remove unused virtual tables to improve the quality of code generated by
- // whole-program devirtualization and bitset lowering.
- PM.add(createGlobalDCEPass());
-
- // Provide AliasAnalysis services for optimizations.
- addInitialAliasAnalysisPasses(PM);
-
- // Allow forcing function attributes as a debugging and tuning aid.
- PM.add(createForceFunctionAttrsLegacyPass());
-
- // Infer attributes about declarations if possible.
- PM.add(createInferFunctionAttrsLegacyPass());
-
- if (OptLevel > 1) {
- // Split call-site with more constrained arguments.
- PM.add(createCallSiteSplittingPass());
-
- // Propage constant function arguments by specializing the functions.
- if (EnableFunctionSpecialization && OptLevel > 2)
- PM.add(createFunctionSpecializationPass());
-
- // Propagate constants at call sites into the functions they call. This
- // opens opportunities for globalopt (and inlining) by substituting function
- // pointers passed as arguments to direct uses of functions.
- PM.add(createIPSCCPPass());
-
- // Attach metadata to indirect call sites indicating the set of functions
- // they may target at run-time. This should follow IPSCCP.
- PM.add(createCalledValuePropagationPass());
-
- // Infer attributes on declarations, call sites, arguments, etc.
- if (AttributorRun & AttributorRunOption::MODULE)
- PM.add(createAttributorLegacyPass());
- }
-
- // Infer attributes about definitions. The readnone attribute in particular is
- // required for virtual constant propagation.
- PM.add(createPostOrderFunctionAttrsLegacyPass());
- PM.add(createReversePostOrderFunctionAttrsPass());
-
- // Split globals using inrange annotations on GEP indices. This can help
- // improve the quality of generated code when virtual constant propagation or
- // control flow integrity are enabled.
- PM.add(createGlobalSplitPass());
-
- // Apply whole-program devirtualization and virtual constant propagation.
- PM.add(createWholeProgramDevirtPass(ExportSummary, nullptr));
-
- // That's all we need at opt level 1.
- if (OptLevel == 1)
- return;
-
- // Now that we internalized some globals, see if we can hack on them!
- PM.add(createGlobalOptimizerPass());
- // Promote any localized global vars.
- PM.add(createPromoteMemoryToRegisterPass());
-
- // Linking modules together can lead to duplicated global constants, only
- // keep one copy of each constant.
- PM.add(createConstantMergePass());
-
- // Remove unused arguments from functions.
- PM.add(createDeadArgEliminationPass());
-
- // Reduce the code after globalopt and ipsccp. Both can open up significant
- // simplification opportunities, and both can propagate functions through
- // function pointers. When this happens, we often have to resolve varargs
- // calls, etc, so let instcombine do this.
- if (OptLevel > 2)
- PM.add(createAggressiveInstCombinerPass());
- PM.add(createInstructionCombiningPass());
- addExtensionsToPM(EP_Peephole, PM);
-
- // Inline small functions
- bool RunInliner = Inliner;
- if (RunInliner) {
- PM.add(Inliner);
- Inliner = nullptr;
- }
-
- PM.add(createPruneEHPass()); // Remove dead EH info.
-
- // Infer attributes on declarations, call sites, arguments, etc. for an SCC.
- if (AttributorRun & AttributorRunOption::CGSCC)
- PM.add(createAttributorCGSCCLegacyPass());
-
- // Try to perform OpenMP specific optimizations. This is a (quick!) no-op if
- // there are no OpenMP runtime calls present in the module.
- if (OptLevel > 1)
- PM.add(createOpenMPOptCGSCCLegacyPass());
-
- // Optimize globals again if we ran the inliner.
- if (RunInliner)
- PM.add(createGlobalOptimizerPass());
- PM.add(createGlobalDCEPass()); // Remove dead functions.
-
- // The IPO passes may leave cruft around. Clean up after them.
- PM.add(createInstructionCombiningPass());
- addExtensionsToPM(EP_Peephole, PM);
- PM.add(createJumpThreadingPass());
-
- // Break up allocas
- PM.add(createSROAPass());
-
- // LTO provides additional opportunities for tailcall elimination due to
- // link-time inlining, and visibility of nocapture attribute.
- if (OptLevel > 1)
- PM.add(createTailCallEliminationPass());
-
- // Infer attributes on declarations, call sites, arguments, etc.
- PM.add(createPostOrderFunctionAttrsLegacyPass()); // Add nocapture.
- // Run a few AA driven optimizations here and now, to cleanup the code.
- PM.add(createGlobalsAAWrapperPass()); // IP alias analysis.
-
- PM.add(createLICMPass(LicmMssaOptCap, LicmMssaNoAccForPromotionCap,
- /*AllowSpeculation=*/true));
- PM.add(NewGVN ? createNewGVNPass()
- : createGVNPass(DisableGVNLoadPRE)); // Remove redundancies.
- PM.add(createMemCpyOptPass()); // Remove dead memcpys.
-
- // Nuke dead stores.
- PM.add(createDeadStoreEliminationPass());
- PM.add(createMergedLoadStoreMotionPass()); // Merge ld/st in diamonds.
-
- // More loops are countable; try to optimize them.
- if (EnableLoopFlatten)
- PM.add(createLoopFlattenPass());
- PM.add(createIndVarSimplifyPass());
- PM.add(createLoopDeletionPass());
- if (EnableLoopInterchange)
- PM.add(createLoopInterchangePass());
-
- if (EnableConstraintElimination)
- PM.add(createConstraintEliminationPass());
-
- // Unroll small loops and perform peeling.
- PM.add(createSimpleLoopUnrollPass(OptLevel, DisableUnrollLoops,
- ForgetAllSCEVInLoopUnroll));
- PM.add(createLoopDistributePass());
-
- addVectorPasses(PM, /* IsFullLTO */ true);
-
- addExtensionsToPM(EP_Peephole, PM);
-
- PM.add(createJumpThreadingPass());
-}
-
-void PassManagerBuilder::addLateLTOOptimizationPasses(
- legacy::PassManagerBase &PM) {
- // See comment in the new PM for justification of scheduling splitting at
- // this stage (\ref buildLTODefaultPipeline).
- if (EnableHotColdSplit)
- PM.add(createHotColdSplittingPass());
-
- // Delete basic blocks, which optimization passes may have killed.
- PM.add(
- createCFGSimplificationPass(SimplifyCFGOptions().hoistCommonInsts(true)));
-
- // Drop bodies of available externally objects to improve GlobalDCE.
- PM.add(createEliminateAvailableExternallyPass());
-
- // Now that we have optimized the program, discard unreachable functions.
- PM.add(createGlobalDCEPass());
-
- // FIXME: this is profitable (for compiler time) to do at -O0 too, but
- // currently it damages debug info.
- if (MergeFunctions)
- PM.add(createMergeFunctionsPass());
-}
-
LLVMPassManagerBuilderRef LLVMPassManagerBuilderCreate() {
PassManagerBuilder *PMB = new PassManagerBuilder();
return wrap(PMB);