Index: llvm/include/llvm/Transforms/Scalar/LoopRotation.h =================================================================== --- llvm/include/llvm/Transforms/Scalar/LoopRotation.h +++ llvm/include/llvm/Transforms/Scalar/LoopRotation.h @@ -28,6 +28,9 @@ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U); + void printPipeline(raw_ostream &OS, + function_ref MapClassName2PassName); + private: const bool EnableHeaderDuplication; const bool PrepareForLTO; Index: llvm/lib/Passes/PassBuilder.cpp =================================================================== --- llvm/lib/Passes/PassBuilder.cpp +++ llvm/lib/Passes/PassBuilder.cpp @@ -897,6 +897,26 @@ return Result; } +Expected> parseLoopRotateOptions(StringRef Params) { + std::pair Result = {false, false}; + while (!Params.empty()) { + StringRef ParamName; + std::tie(ParamName, Params) = Params.split(';'); + + bool Enable = !ParamName.consume_front("no-"); + if (ParamName == "header-duplication") { + Result.first = Enable; + } else if (ParamName == "prepare-for-lto") { + Result.second = Enable; + } else { + return make_error( + formatv("invalid LoopRotate pass parameter '{0}' ", ParamName).str(), + inconvertibleErrorCode()); + } + } + return Result; +} + Expected parseMergedLoadStoreMotionOptions(StringRef Params) { bool Result = false; while (!Params.empty()) { Index: llvm/lib/Passes/PassRegistry.def =================================================================== --- llvm/lib/Passes/PassRegistry.def +++ llvm/lib/Passes/PassRegistry.def @@ -565,7 +565,6 @@ LOOP_PASS("invalidate", InvalidateAllAnalysesPass()) LOOP_PASS("loop-idiom", LoopIdiomRecognizePass()) LOOP_PASS("loop-instsimplify", LoopInstSimplifyPass()) -LOOP_PASS("loop-rotate", LoopRotatePass()) LOOP_PASS("no-op-loop", NoOpLoopPass()) LOOP_PASS("print", PrintLoopPass(dbgs())) LOOP_PASS("loop-deletion", LoopDeletionPass()) @@ -608,4 +607,12 @@ }, parseLICMOptions, "allowspeculation"); + +LOOP_PASS_WITH_PARAMS("loop-rotate", + "LoopRotatePass", + [](std::pair Params) { + return LoopRotatePass(Params.first, Params.second); + }, + parseLoopRotateOptions, + "no-header-duplication;header-duplication;no-prepare-for-lto;prepare-for-lto") #undef LOOP_PASS_WITH_PARAMS Index: llvm/lib/Transforms/Scalar/LoopRotation.cpp =================================================================== --- llvm/lib/Transforms/Scalar/LoopRotation.cpp +++ llvm/lib/Transforms/Scalar/LoopRotation.cpp @@ -43,6 +43,21 @@ : EnableHeaderDuplication(EnableHeaderDuplication), PrepareForLTO(PrepareForLTO) {} +void LoopRotatePass::printPipeline( + raw_ostream &OS, function_ref MapClassName2PassName) { + static_cast *>(this)->printPipeline( + OS, MapClassName2PassName); + OS << "<"; + if (!EnableHeaderDuplication) + OS << "no-"; + OS << "header-duplication;"; + + if (!PrepareForLTO) + OS << "no-"; + OS << "prepare-for-lto"; + OS << ">"; +} + PreservedAnalyses LoopRotatePass::run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &) {