diff --git a/llvm/include/llvm/Transforms/IPO/PassManagerBuilder.h b/llvm/include/llvm/Transforms/IPO/PassManagerBuilder.h --- a/llvm/include/llvm/Transforms/IPO/PassManagerBuilder.h +++ b/llvm/include/llvm/Transforms/IPO/PassManagerBuilder.h @@ -211,8 +211,6 @@ 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 --- a/llvm/lib/Passes/PassBuilderPipelines.cpp +++ b/llvm/lib/Passes/PassBuilderPipelines.cpp @@ -1728,8 +1728,7 @@ // 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 --- a/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp +++ b/llvm/lib/Transforms/IPO/PassManagerBuilder.cpp @@ -898,183 +898,6 @@ 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);