[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