[llvm] [SandboxVec][SeedCollection] Support pass argument for enabling different types (PR #155079)

via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 22 23:11:33 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms

Author: vporpo (vporpo)

<details>
<summary>Changes</summary>

With this patch you can call the SeedCollection pass with the argument "enable-diff-types" to get it to collect seeds of different types. This will be used in a follow-up patch.

---
Full diff: https://github.com/llvm/llvm-project/pull/155079.diff


5 Files Affected:

- (modified) llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.h (+5) 
- (modified) llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/VecUtils.h (+29) 
- (modified) llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.cpp (+14-2) 
- (added) llvm/test/Transforms/SandboxVectorizer/seed_collection.ll (+19) 
- (modified) llvm/unittests/Transforms/Vectorize/SandboxVectorizer/VecUtilsTest.cpp (+27) 


``````````diff
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.h
index 286d971ff4851..f55dbf753dbcc 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.h
@@ -25,6 +25,11 @@ class SeedCollection final : public FunctionPass {
 
   /// The PM containing the pipeline of region passes.
   RegionPassManager RPM;
+  /// The auxiliary argument passed to the pass that tells us that we should
+  /// collect seeds of different types.
+  static constexpr StringRef DiffTypesArgStr = "enable-diff-types";
+  /// Collect seeds of different types.
+  bool AllowDiffTypes = false;
 
 public:
   SeedCollection(StringRef Pipeline);
diff --git a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/VecUtils.h b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/VecUtils.h
index d32bfbaf7a4c8..76752872f4d5c 100644
--- a/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/VecUtils.h
+++ b/llvm/include/llvm/Transforms/Vectorize/SandboxVectorizer/VecUtils.h
@@ -262,6 +262,35 @@ class VecUtils {
     return Pack;
   }
 
+  static constexpr const char AuxArgBeginToken = '(';
+  static constexpr const char AuxArgEndToken = ')';
+  /// \Returns the auxiliary pass argument by parsing \p Args. The auxiliary
+  /// pass argument is enclosed in parentheses and should be before any other
+  /// argument.
+  static StringRef getAuxPassArg(StringRef Args) {
+    if (Args.empty())
+      return Args;
+    if (Args[0] != AuxArgBeginToken)
+      return StringRef();
+    // We found the Begin token, so look for the End token.
+    size_t EndIdx = Args.find(AuxArgEndToken);
+    if (EndIdx == StringRef::npos) {
+      errs() << "Missing '" << AuxArgEndToken << "' in '" << Args << "' !\n";
+      exit(1);
+    }
+    assert(EndIdx >= 1 && "Expected at index 1 or later!");
+    return Args.substr(1, EndIdx - 1);
+  }
+
+  /// \Returns \p Args with the auxiliary argument removed.
+  /// For example: "(foo)bar1,bar2" returns "bar1,bar2".
+  static StringRef stripAuxPassArg(StringRef Args) {
+    StringRef Aux = getAuxPassArg(Args);
+    if (Aux.empty())
+      return Args;
+    return Args.slice(Aux.size() + 2, StringRef::npos);
+  }
+
 #ifndef NDEBUG
   /// Helper dump function for debugging.
   LLVM_DUMP_METHOD static void dump(ArrayRef<Value *> Bndl);
diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.cpp
index ddb4a1e154a18..e87e6426d3be6 100644
--- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.cpp
+++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.cpp
@@ -32,9 +32,20 @@ cl::opt<std::string> CollectSeeds(
              "list of '" StoreSeedsDef "' and '" LoadSeedsDef "'."));
 
 namespace sandboxir {
+
 SeedCollection::SeedCollection(StringRef Pipeline)
     : FunctionPass("seed-collection"),
-      RPM("rpm", Pipeline, SandboxVectorizerPassBuilder::createRegionPass) {}
+      RPM("rpm", VecUtils::stripAuxPassArg(Pipeline),
+          SandboxVectorizerPassBuilder::createRegionPass) {
+  StringRef AuxArg = VecUtils::getAuxPassArg(Pipeline);
+  if (!AuxArg.empty()) {
+    if (DiffTypesArgStr != DiffTypesArgStr) {
+      errs() << "SeedCollection only supports '" << DiffTypesArgStr << "' !\n";
+      exit(1);
+    }
+    AllowDiffTypes = true;
+  }
+}
 
 bool SeedCollection::runOnFunction(Function &F, const Analyses &A) {
   bool Change = false;
@@ -50,7 +61,8 @@ bool SeedCollection::runOnFunction(Function &F, const Analyses &A) {
 
   // TODO: Start from innermost BBs first
   for (auto &BB : F) {
-    SeedCollector SC(&BB, A.getScalarEvolution(), CollectStores, CollectLoads);
+    SeedCollector SC(&BB, A.getScalarEvolution(), CollectStores, CollectLoads,
+                     AllowDiffTypes);
     for (SeedBundle &Seeds : SC.getStoreSeeds()) {
       unsigned ElmBits =
           Utils::getNumBits(VecUtils::getElementType(Utils::getExpectedType(
diff --git a/llvm/test/Transforms/SandboxVectorizer/seed_collection.ll b/llvm/test/Transforms/SandboxVectorizer/seed_collection.ll
new file mode 100644
index 0000000000000..0fc1fa04a081f
--- /dev/null
+++ b/llvm/test/Transforms/SandboxVectorizer/seed_collection.ll
@@ -0,0 +1,19 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
+; RUN: opt -passes=sandbox-vectorizer -sbvec-vec-reg-bits=1024 -disable-output -sbvec-passes="seed-collection<(enable-diff-types)print-region>" %s  | FileCheck %s
+
+define void @collect_seeds_of_diff_types(ptr %ptr) {
+; CHECK: Aux:
+; CHECK-NEXT:  store i8 %ld0, ptr %ptr0, {{.*}}
+; CHECK-NEXT:  store i16 %ld1, ptr %ptr1, {{.*}}
+; CHECK-NEXT:  store i8 %ld2, ptr %ptr2, {{.*}}
+  %ptr0 = getelementptr i8, ptr %ptr, i32 0
+  %ptr1 = getelementptr i16, ptr %ptr, i32 1
+  %ptr2 = getelementptr i8, ptr %ptr, i32 3
+  %ld0 = load i8, ptr %ptr0
+  %ld1 = load i16, ptr %ptr1
+  %ld2 = load i8, ptr %ptr2
+  store i8 %ld0, ptr %ptr0
+  store i16 %ld1, ptr %ptr1
+  store i8 %ld2, ptr %ptr2
+  ret void
+}
diff --git a/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/VecUtilsTest.cpp b/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/VecUtilsTest.cpp
index 2bfea6908305c..566c31446ec20 100644
--- a/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/VecUtilsTest.cpp
+++ b/llvm/unittests/Transforms/Vectorize/SandboxVectorizer/VecUtilsTest.cpp
@@ -617,3 +617,30 @@ define void @foo(i8 %v0, i8 %v1) {
       EXPECT_FALSE(sandboxir::VecUtils::matchPack(NotPack));
   }
 }
+
+TEST_F(VecUtilsTest, GetAuxPassArg) {
+  // Check no aux argument.
+  EXPECT_EQ(sandboxir::VecUtils::getAuxPassArg("no aux arg"), "");
+  // Check an illegal aux argument.
+  EXPECT_EQ(sandboxir::VecUtils::getAuxPassArg("illegal (arg) other"), "");
+  // Check a valid argument.
+  EXPECT_EQ(sandboxir::VecUtils::getAuxPassArg("(some arg)other stuff"),
+            "some arg");
+  // Missing token.
+  EXPECT_DEBUG_DEATH(sandboxir::VecUtils::getAuxPassArg("(arg other"),
+                     "Missing.*");
+}
+
+TEST_F(VecUtilsTest, StripAuxPassArg) {
+  // Check no aux argument.
+  EXPECT_EQ(sandboxir::VecUtils::stripAuxPassArg("no aux arg"), "no aux arg");
+  // Check a legal aux argument.
+  EXPECT_EQ(sandboxir::VecUtils::stripAuxPassArg("(legal aux arg)foo bar"),
+            "foo bar");
+  // Check an illegal aux argument.
+  EXPECT_EQ(sandboxir::VecUtils::stripAuxPassArg("illegal (arg) other"),
+            "illegal (arg) other");
+  // Missing token.
+  EXPECT_DEBUG_DEATH(sandboxir::VecUtils::stripAuxPassArg("(arg other"),
+                     "Missing.*");
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/155079


More information about the llvm-commits mailing list