[llvm] [SandboxVec][PassBuilder] Add support for RegionPass aux args (PR #205643)

via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 25 19:53:35 PDT 2026


https://github.com/vporpo updated https://github.com/llvm/llvm-project/pull/205643

>From e4d232fe8ce94eafd876beb85ca9400b1f518639 Mon Sep 17 00:00:00 2001
From: Vasileios Porpodas <vasileios.porpodas at amd.com>
Date: Wed, 24 Jun 2026 18:24:54 +0000
Subject: [PATCH] [SandboxVec][PassBuilder] Add support for RegionPass aux args

Pass auxiliary string arguments are used as a way to pass additional information
to a pass upon construction, which can be particularly helpful with passes
that support more than one mode/functionality.

You can specify an aux argument in the pass pipeline using the syntax:
`<pass>(<aux arg>)`.

FunctionPasses already supported aux arguments and are used in the SeedCollection pass.
This patch adds support for RegionPasses too.
To help testing this I modified the NullPass to add the ability to echo the aux arg.
---
 .../SandboxVectorizer/Passes/BottomUpVec.h    |  4 ++-
 .../SandboxVectorizer/Passes/LoadStoreVec.h   |  4 ++-
 .../SandboxVectorizer/Passes/NullPass.h       |  7 +++++-
 .../SandboxVectorizer/Passes/PackReuse.h      |  4 ++-
 .../Passes/PrintInstructionCount.h            |  4 ++-
 .../SandboxVectorizer/Passes/PrintRegion.h    |  4 ++-
 .../Passes/TransactionAcceptOrRevert.h        |  5 +++-
 .../Passes/TransactionAlwaysAccept.h          |  4 ++-
 .../Passes/TransactionAlwaysRevert.h          |  4 ++-
 .../Passes/TransactionSave.h                  |  4 ++-
 .../SandboxVectorizerPassBuilder.cpp          |  3 +--
 .../SandboxVectorizer/region_pass_arg.ll      | 10 ++++++++
 .../SandboxVectorizer/CMakeLists.txt          |  1 +
 .../SandboxVectorizer/PassBuilderTest.cpp     | 25 +++++++++++++++++++
 14 files changed, 71 insertions(+), 12 deletions(-)
 create mode 100644 llvm/test/Transforms/SandboxVectorizer/region_pass_arg.ll
 create mode 100644 llvm/unittests/Transforms/Vectorize/SandboxVectorizer/PassBuilderTest.cpp

diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.h
index d024bb74ac0c9..50ac1ecbf9f23 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/BottomUpVec.h
@@ -98,7 +98,9 @@ class LLVM_ABI BottomUpVec final : public RegionPass {
   bool tryVectorize(ArrayRef<Value *> Seeds, LegalityAnalysis &Legality);
 
 public:
-  BottomUpVec() : RegionPass("bottom-up-vec") {}
+  BottomUpVec(StringRef AuxArg) : RegionPass("bottom-up-vec") {
+    assert(AuxArg.empty() && "This pass ignores aux arg!");
+  }
   bool runOnRegion(Region &Rgn, const Analyses &A) final;
 };
 
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/LoadStoreVec.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/LoadStoreVec.h
index f7306b240b157..9b762cac553b8 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/LoadStoreVec.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/LoadStoreVec.h
@@ -39,7 +39,9 @@ class LLVM_ABI LoadStoreVec final : public RegionPass {
                           ArrayRef<Value *> Operands);
 
 public:
-  LoadStoreVec() : RegionPass("load-store-vec") {}
+  LoadStoreVec(StringRef AuxArg) : RegionPass("load-store-vec") {
+    assert(AuxArg.empty() && "This pass ignores aux arg!");
+  }
   bool runOnRegion(Region &Rgn, const Analyses &A) final;
 };
 
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/NullPass.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/NullPass.h
index 2c5defb4e02e1..4ba6c8e6ebed2 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/NullPass.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/NullPass.h
@@ -19,10 +19,15 @@ namespace llvm::sandboxir {
 class Region;
 
 /// A Region pass that does nothing, for use as a placeholder in tests.
+/// It can also echo the AuxArg passed to it by the pass builder, which is used
+/// for AuxArg testing.
 class NullPass final : public RegionPass {
+  StringRef AuxArg;
+
 public:
-  NullPass() : RegionPass("null") {}
+  NullPass(StringRef AuxArg) : RegionPass("null"), AuxArg(AuxArg) {}
   bool runOnRegion(Region &R, const Analyses &A) final { return false; }
+  StringRef getAuxArg() const { return AuxArg; }
 };
 
 } // namespace llvm::sandboxir
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/PackReuse.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/PackReuse.h
index 8387883e82cdd..64eaf1d8a3ad1 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/PackReuse.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/PackReuse.h
@@ -27,7 +27,9 @@ class LLVM_ABI PackReuse final : public RegionPass {
   bool Change = false;
 
 public:
-  PackReuse() : RegionPass("pack-reuse") {}
+  PackReuse(StringRef AuxArg) : RegionPass("pack-reuse") {
+    assert(AuxArg.empty() && "This pass ignores aux arg!");
+  }
   bool runOnRegion(Region &Rgn, const Analyses &A) final;
 };
 
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/PrintInstructionCount.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/PrintInstructionCount.h
index b83954ae3eba4..83aa2f71b79e3 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/PrintInstructionCount.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/PrintInstructionCount.h
@@ -11,7 +11,9 @@ namespace llvm::sandboxir {
 /// passes.
 class PrintInstructionCount final : public RegionPass {
 public:
-  PrintInstructionCount() : RegionPass("null") {}
+  PrintInstructionCount(StringRef AuxArg) : RegionPass("null") {
+    assert(AuxArg.empty() && "This pass ignores aux arg!");
+  }
   bool runOnRegion(Region &R, const Analyses &A) final {
     outs() << "InstructionCount: " << llvm::size(R) << "\n";
     return false;
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/PrintRegion.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/PrintRegion.h
index 34ed8c5e6d6bc..728e986e869c1 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/PrintRegion.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/PrintRegion.h
@@ -9,7 +9,9 @@ namespace llvm::sandboxir {
 /// A Region pass that does nothing, for use as a placeholder in tests.
 class PrintRegion final : public RegionPass {
 public:
-  PrintRegion() : RegionPass("print-region") {}
+  PrintRegion(StringRef AuxArg) : RegionPass("print-region") {
+    assert(AuxArg.empty() && "This pass ignores aux arg!");
+  }
   bool runOnRegion(Region &R, const Analyses &A) final {
     raw_ostream &OS = outs();
 #ifndef NDEBUG
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionAcceptOrRevert.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionAcceptOrRevert.h
index e6b56ade9ca80..1b93dd658afff 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionAcceptOrRevert.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionAcceptOrRevert.h
@@ -21,7 +21,10 @@ namespace llvm::sandboxir {
 
 class LLVM_ABI TransactionAcceptOrRevert : public RegionPass {
 public:
-  TransactionAcceptOrRevert() : RegionPass("tr-accept-or-revert") {}
+  TransactionAcceptOrRevert(StringRef AuxArg)
+      : RegionPass("tr-accept-or-revert") {
+    assert(AuxArg.empty() && "This pass ignores aux arg!");
+  }
   bool runOnRegion(Region &Rgn, const Analyses &A) final;
 };
 
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionAlwaysAccept.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionAlwaysAccept.h
index ed6cf1bf7cf51..14ff5833dc134 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionAlwaysAccept.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionAlwaysAccept.h
@@ -20,7 +20,9 @@ namespace llvm::sandboxir {
 
 class TransactionAlwaysAccept : public RegionPass {
 public:
-  TransactionAlwaysAccept() : RegionPass("tr-accept") {}
+  TransactionAlwaysAccept(StringRef AuxArg) : RegionPass("tr-accept") {
+    assert(AuxArg.empty() && "This pass ignores aux arg!");
+  }
   bool runOnRegion(Region &Rgn, const Analyses &A) final {
     auto &Tracker = Rgn.getContext().getTracker();
     bool HasChanges = !Tracker.empty();
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionAlwaysRevert.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionAlwaysRevert.h
index 308ba208d777e..17542aecef9cb 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionAlwaysRevert.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionAlwaysRevert.h
@@ -20,7 +20,9 @@ namespace llvm::sandboxir {
 
 class TransactionAlwaysRevert : public RegionPass {
 public:
-  TransactionAlwaysRevert() : RegionPass("tr-revert") {}
+  TransactionAlwaysRevert(StringRef AuxArg) : RegionPass("tr-revert") {
+    assert(AuxArg.empty() && "This pass ignores aux arg!");
+  }
   bool runOnRegion(Region &Rgn, const Analyses &A) final {
     auto &Tracker = Rgn.getContext().getTracker();
     bool HasChanges = !Tracker.empty();
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionSave.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionSave.h
index 4c4206396397d..41c8052893022 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionSave.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/TransactionSave.h
@@ -19,7 +19,9 @@ namespace llvm::sandboxir {
 
 class LLVM_ABI TransactionSave : public RegionPass {
 public:
-  TransactionSave() : RegionPass("tr-save") {}
+  TransactionSave(StringRef AuxArg) : RegionPass("tr-save") {
+    assert(AuxArg.empty() && "This pass ignores aux arg!");
+  }
   bool runOnRegion(Region &Rgn, const Analyses &A) final;
 };
 
diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizerPassBuilder.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizerPassBuilder.cpp
index 9326869461082..e21c506b0d82b 100644
--- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizerPassBuilder.cpp
+++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizerPassBuilder.cpp
@@ -22,8 +22,7 @@ SandboxVectorizerPassBuilder::createRegionPass(StringRef Name, StringRef Args,
 #define REGION_PASS(NAME, CLASS_NAME)                                          \
   if (Name == NAME) {                                                          \
     assert(Args.empty() && "Unexpected arguments for pass '" NAME "'.");       \
-    assert(AuxArg.empty() && "TODO: Add RegionPass support for AuxArge);");    \
-    return std::make_unique<CLASS_NAME>();                                     \
+    return std::make_unique<CLASS_NAME>(AuxArg);                               \
   }
 // TODO: Support region passes with params.
 #include "Passes/PassRegistry.def"
diff --git a/llvm/test/Transforms/SandboxVectorizer/region_pass_arg.ll b/llvm/test/Transforms/SandboxVectorizer/region_pass_arg.ll
new file mode 100644
index 0000000000000..9fb7de5546d16
--- /dev/null
+++ b/llvm/test/Transforms/SandboxVectorizer/region_pass_arg.ll
@@ -0,0 +1,10 @@
+; RUN: opt -passes=sandbox-vectorizer -sbvec-passes="regions-from-metadata<null(aux-arg-foo)>" %s -disable-output
+
+; Checks that the NullPass, which is a region pass can take an aux argument.
+; TODO: This test can be removed once real passes start using aux-args.
+
+define void @foo() {
+  ret void, !sandboxvec !0
+}
+!0 = distinct !{!"sandboxregion"}
+
diff --git a/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/CMakeLists.txt b/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/CMakeLists.txt
index acaceccd672e5..2795551060406 100644
--- a/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/CMakeLists.txt
+++ b/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/CMakeLists.txt
@@ -12,6 +12,7 @@ add_llvm_unittest(SandboxVectorizerTests
   InstrMapsTest.cpp
   IntervalTest.cpp
   LegalityTest.cpp
+  PassBuilderTest.cpp
   RegionWithScoreTest.cpp
   SandboxVectorizerIRTest.cpp
   SandboxVectorizerTest.cpp
diff --git a/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/PassBuilderTest.cpp b/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/PassBuilderTest.cpp
new file mode 100644
index 0000000000000..1e52900a38f61
--- /dev/null
+++ b/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/PassBuilderTest.cpp
@@ -0,0 +1,25 @@
+//===- PassBuilderTest.cpp ------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Transforms/Vectorize/SandboxVectorizer/Passes/NullPass.h"
+#include "llvm/Transforms/Vectorize/SandboxVectorizer/SandboxVectorizerPassBuilder.h"
+#include "gtest/gtest.h"
+
+using namespace llvm::sandboxir;
+
+// Check that the PassBuilder passes the AuxArg to the RegionPass upon
+// construction.
+TEST(PassBuilderTest, RegionPassAuxArg) {
+  SandboxVectorizerPassBuilder Builder;
+  std::string AuxArgStr("aux-arg-test");
+  auto RgnPassPtr =
+      Builder.createRegionPass("null", /*Args=*/"", /*AuxArg=*/AuxArgStr);
+  NullPass *NPass = static_cast<NullPass *>(RgnPassPtr.get());
+  EXPECT_EQ(NPass->getAuxArg(), AuxArgStr);
+}



More information about the llvm-commits mailing list