diff --git a/llvm/include/llvm/Transforms/Utils/ExtraPassManager.h b/llvm/include/llvm/Transforms/Utils/ExtraPassManager.h index 7ea50a5584dde..e1f8065f8011d 100644 --- a/llvm/include/llvm/Transforms/Utils/ExtraPassManager.h +++ b/llvm/include/llvm/Transforms/Utils/ExtraPassManager.h @@ -55,29 +55,49 @@ template struct ShouldRunExtraPasses { /// request additional transformations on demand. An example is extra /// simplifications after loop-vectorization, if runtime checks have been added. template -struct ExtraFunctionPassManager : public FunctionPassManager { +class ExtraFunctionPassManager + : public PassInfoMixin> { + FunctionPassManager InnerFPM; + +public: + template void addPass(PassT &&Pass) { + InnerFPM.addPass(std::move(Pass)); + } + PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) { auto PA = PreservedAnalyses::all(); if (AM.getCachedResult(F)) - PA.intersect(FunctionPassManager::run(F, AM)); + PA.intersect(InnerFPM.run(F, AM)); PA.abandon(); return PA; } + + static bool isRequired() { return true; } }; /// A pass manager to run a set of extra loop passes if the MarkerTy analysis is /// present. This allows passes to request additional transformations on demand. /// An example is doing additional runs of SimpleLoopUnswitch. template -struct ExtraLoopPassManager : public LoopPassManager { +class ExtraLoopPassManager + : public PassInfoMixin> { + LoopPassManager InnerLPM; + +public: + template void addPass(PassT &&Pass) { + InnerLPM.addPass(std::move(Pass)); + } + PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U) { auto PA = PreservedAnalyses::all(); if (AM.getCachedResult(L)) - PA.intersect(LoopPassManager::run(L, AM, AR, U)); + PA.intersect(InnerLPM.run(L, AM, AR, U)); PA.abandon(); return PA; } + + static bool isRequired() { return true; } }; } // namespace llvm diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def index 2ddebb07017c2..825f2f7f9a494 100644 --- a/llvm/lib/Passes/PassRegistry.def +++ b/llvm/lib/Passes/PassRegistry.def @@ -366,6 +366,8 @@ FUNCTION_PASS("dwarf-eh-prepare", DwarfEHPreparePass(TM)) FUNCTION_PASS("expand-large-div-rem", ExpandLargeDivRemPass(TM)) FUNCTION_PASS("expand-large-fp-convert", ExpandLargeFpConvertPass(TM)) FUNCTION_PASS("expand-memcmp", ExpandMemCmpPass(TM)) +FUNCTION_PASS("extra-vector-passes", + ExtraFunctionPassManager()) FUNCTION_PASS("fix-irreducible", FixIrreduciblePass()) FUNCTION_PASS("flatten-cfg", FlattenCFGPass()) FUNCTION_PASS("float2int", Float2IntPass()) @@ -651,6 +653,8 @@ LOOP_ANALYSIS("should-run-extra-simple-loop-unswitch", LOOP_PASS("canon-freeze", CanonicalizeFreezeInLoopsPass()) LOOP_PASS("dot-ddg", DDGDotPrinterPass()) LOOP_PASS("guard-widening", GuardWideningPass()) +LOOP_PASS("extra-simple-loop-unswitch-passes", + ExtraLoopPassManager()) LOOP_PASS("indvars", IndVarSimplifyPass()) LOOP_PASS("invalidate", InvalidateAllAnalysesPass()) LOOP_PASS("loop-bound-split", LoopBoundSplitPass())