Index: include/llvm/Passes/PassBuilder.h =================================================================== --- include/llvm/Passes/PassBuilder.h +++ include/llvm/Passes/PassBuilder.h @@ -66,6 +66,15 @@ bool SamplePGOSupport; }; +/// A struct capturing Pass tunables. +class PassOptions { +public: + // Constructor sets defaults based on cl::opts. + PassOptions(); + bool DisableUnrollLoops; + bool LoopVectorize; +}; + /// This class provides access to building LLVM's passes. /// /// Its members provide the baseline state available to passes during their @@ -74,6 +83,7 @@ /// construction. class PassBuilder { TargetMachine *TM; + PassOptions PassOpt; Optional PGOOpt; PassInstrumentationCallbacks *PIC; @@ -190,9 +200,13 @@ }; explicit PassBuilder(TargetMachine *TM = nullptr, + Optional PassOpt = None, Optional PGOOpt = None, PassInstrumentationCallbacks *PIC = nullptr) - : TM(TM), PGOOpt(PGOOpt), PIC(PIC) {} + : TM(TM), PassOpt(), PGOOpt(PGOOpt), PIC(PIC) { + if (PassOpt) + this->PassOpt = *PassOpt; + } /// Cross register the analysis managers through their proxies. /// Index: include/llvm/Transforms/Vectorize/LoopVectorize.h =================================================================== --- include/llvm/Transforms/Vectorize/LoopVectorize.h +++ include/llvm/Transforms/Vectorize/LoopVectorize.h @@ -77,6 +77,8 @@ /// The LoopVectorize Pass. struct LoopVectorizePass : public PassInfoMixin { + LoopVectorizePass(bool IOWF = false, bool VOWF = false) + : InterleaveOnlyWhenForced(IOWF), VectorizeOnlyWhenForced(VOWF) {} /// If false, consider all loops for interleaving. /// If true, only loops that explicitly request interleaving are considered. bool InterleaveOnlyWhenForced = false; Index: lib/LTO/LTOBackend.cpp =================================================================== --- lib/LTO/LTOBackend.cpp +++ lib/LTO/LTOBackend.cpp @@ -164,7 +164,7 @@ PGOOptions::IRUse, PGOOptions::CSIRUse); } - PassBuilder PB(TM, PGOOpt); + PassBuilder PB(TM, None, PGOOpt); AAManager AA; // Parse a custom AA pipeline if asked to. Index: lib/Passes/PassBuilder.cpp =================================================================== --- lib/Passes/PassBuilder.cpp +++ lib/Passes/PassBuilder.cpp @@ -211,6 +211,15 @@ EnableCHR("enable-chr-npm", cl::init(true), cl::Hidden, cl::desc("Enable control height reduction optimization (CHR)")); +static cl::opt + RunLoopVectorizationNPM("vectorize-loops-npm", cl::init(true), cl::Hidden, + cl::desc("Run the Loop vectorization passes")); + +PassOptions::PassOptions() { + DisableUnrollLoops = false; + LoopVectorize = RunLoopVectorizationNPM; +} + extern cl::opt EnableHotColdSplit; extern cl::opt EnableOrderFileInstrumentation; @@ -846,7 +855,8 @@ OptimizePM.addPass(LoopDistributePass()); // Now run the core loop vectorizer. - OptimizePM.addPass(LoopVectorizePass()); + OptimizePM.addPass( + LoopVectorizePass(PassOpt.DisableUnrollLoops, !PassOpt.LoopVectorize)); // Eliminate loads by forwarding stores from the previous iteration to loads // of the current iteration. Index: lib/Passes/PassRegistry.def =================================================================== --- lib/Passes/PassRegistry.def +++ lib/Passes/PassRegistry.def @@ -198,7 +198,7 @@ FUNCTION_PASS("loop-data-prefetch", LoopDataPrefetchPass()) FUNCTION_PASS("loop-load-elim", LoopLoadEliminationPass()) FUNCTION_PASS("loop-distribute", LoopDistributePass()) -FUNCTION_PASS("loop-vectorize", LoopVectorizePass()) +FUNCTION_PASS("loop-vectorize", LoopVectorizePass(PassOpt.DisableUnrollLoops, !PassOpt.LoopVectorize)) FUNCTION_PASS("pgo-memop-opt", PGOMemOPSizeOpt()) FUNCTION_PASS("print", PrintFunctionPass(dbgs())) FUNCTION_PASS("print", AssumptionPrinterPass(dbgs())) Index: tools/opt/NewPMDriver.cpp =================================================================== --- tools/opt/NewPMDriver.cpp +++ tools/opt/NewPMDriver.cpp @@ -261,7 +261,7 @@ StandardInstrumentations SI; SI.registerCallbacks(PIC); - PassBuilder PB(TM, P, &PIC); + PassBuilder PB(TM, None, P, &PIC); registerEPCallbacks(PB, VerifyEachPass, DebugPM); // Load requested pass plugins and let them register pass builder callbacks Index: unittests/IR/PassBuilderCallbacksTest.cpp =================================================================== --- unittests/IR/PassBuilderCallbacksTest.cpp +++ unittests/IR/PassBuilderCallbacksTest.cpp @@ -414,7 +414,7 @@ "exit:\n" " ret void\n" "}\n")), - CallbacksHandle(), PB(nullptr, None, &CallbacksHandle.Callbacks), + CallbacksHandle(), PB(nullptr, None, None, &CallbacksHandle.Callbacks), PM(true), LAM(true), FAM(true), CGAM(true), AM(true) { /// Register a callback for analysis registration.