diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp index 562cb5149e319..161d300e6e9f2 100644 --- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp +++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp @@ -22,6 +22,14 @@ cl::opt PrintPassPipeline("sbvec-print-pass-pipeline", cl::init(false), cl::Hidden, cl::desc("Prints the pass pipeline and returns.")); +/// A magic string for the default pass pipeline. +const char *DefaultPipelineMagicStr = "*"; + +cl::opt UserDefinedPassPipeline( + "sbvec-passes", cl::init(DefaultPipelineMagicStr), cl::Hidden, + cl::desc("Comma-separated list of vectorizer passes. If not set " + "we run the predefined pipeline.")); + PreservedAnalyses SandboxVectorizerPass::run(Function &F, FunctionAnalysisManager &AM) { TTI = &AM.getResult(F); @@ -53,20 +61,26 @@ bool SandboxVectorizerPass::runImpl(Function &LLVMF) { sandboxir::Function &F = *Ctx.createFunction(&LLVMF); // Create the passes and register them with the PassRegistry. sandboxir::PassRegistry PR; - auto &PM = static_cast( - PR.registerPass(std::make_unique("pm"))); auto &BottomUpVecPass = static_cast( PR.registerPass(std::make_unique())); - // Create the default pass pipeline. - PM.addPass(&BottomUpVecPass); + sandboxir::FunctionPassManager *PM = nullptr; + if (UserDefinedPassPipeline == DefaultPipelineMagicStr) { + // Create the default pass pipeline. + PM = &static_cast(PR.registerPass( + std::make_unique("pm"))); + PM->addPass(&BottomUpVecPass); + } else { + // Create the user-defined pipeline. + PM = &PR.parseAndCreatePassPipeline(UserDefinedPassPipeline); + } if (PrintPassPipeline) { - PM.printPipeline(outs()); + PM->printPipeline(outs()); return false; } // Run the pass pipeline. - bool Change = PM.runOnFunction(F); + bool Change = PM->runOnFunction(F); return Change; } diff --git a/llvm/test/Transforms/SandboxVectorizer/user_pass_pipeline.ll b/llvm/test/Transforms/SandboxVectorizer/user_pass_pipeline.ll new file mode 100644 index 0000000000000..2879fbba1b9c0 --- /dev/null +++ b/llvm/test/Transforms/SandboxVectorizer/user_pass_pipeline.ll @@ -0,0 +1,12 @@ +; RUN: opt -passes=sandbox-vectorizer -sbvec-print-pass-pipeline -sbvec-passes=bottom-up-vec,bottom-up-vec %s -disable-output | FileCheck %s + +; !!!WARNING!!! This won't get updated by update_test_checks.py ! + +; This checks the user defined pass pipeline. +define void @pipeline() { +; CHECK: pm +; CHECK: bottom-up-vec +; CHECK: bottom-up-vec +; CHECK-EMPTY: + ret void +}