[llvm] [SandboxVec] User-defined pass pipeline (PR #108625)

via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 13 11:53:23 PDT 2024


https://github.com/vporpo created https://github.com/llvm/llvm-project/pull/108625

This patch adds support for a user-defined pass-pipeline that overrides the default pipeline of the vectorizer.
This will commonly be used by lit tests.

>From 99cc1c9f587c8366aa38366b5c10715a2971851f Mon Sep 17 00:00:00 2001
From: Vasileios Porpodas <vporpodas at google.com>
Date: Wed, 11 Sep 2024 13:51:09 -0700
Subject: [PATCH] [SandboxVec] User-defined pass pipeline

This patch adds support for a user-defined pass-pipeline that overrides the
default pipeline of the vectorizer.
This will commonly be used by lit tests.
---
 .../SandboxVectorizer/SandboxVectorizer.cpp   | 26 ++++++++++++++-----
 .../SandboxVectorizer/user_pass_pipeline.ll   | 12 +++++++++
 2 files changed, 32 insertions(+), 6 deletions(-)
 create mode 100644 llvm/test/Transforms/SandboxVectorizer/user_pass_pipeline.ll

diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp
index 562cb5149e3198..161d300e6e9f2e 100644
--- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp
+++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizer.cpp
@@ -22,6 +22,14 @@ cl::opt<bool>
     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<std::string> 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<TargetIRAnalysis>(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<sandboxir::FunctionPassManager &>(
-      PR.registerPass(std::make_unique<sandboxir::FunctionPassManager>("pm")));
   auto &BottomUpVecPass = static_cast<sandboxir::FunctionPass &>(
       PR.registerPass(std::make_unique<sandboxir::BottomUpVec>()));
 
-  // Create the default pass pipeline.
-  PM.addPass(&BottomUpVecPass);
+  sandboxir::FunctionPassManager *PM = nullptr;
+  if (UserDefinedPassPipeline == DefaultPipelineMagicStr) {
+    // Create the default pass pipeline.
+    PM = &static_cast<sandboxir::FunctionPassManager &>(PR.registerPass(
+        std::make_unique<sandboxir::FunctionPassManager>("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 00000000000000..2879fbba1b9c00
--- /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
+}



More information about the llvm-commits mailing list