[llvm] [SandboxVec][SeedCollector] Change vector bit width calculation (PR #194090)

via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 28 16:14:27 PDT 2026


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

>From 040305ba972d758e927bb7e0eb6da55cd809a0fe Mon Sep 17 00:00:00 2001
From: Vasileios Porpodas <vasileios.porpodas at amd.com>
Date: Fri, 24 Apr 2026 23:16:34 +0000
Subject: [PATCH 1/2] [SandboxVec][SeedCollector] Change vector bit width
 calculation

On GPUs TTI::getRegisterBitWidth(TargetTransformInfo::RGK_FixedWidthVector)
returns the elemnt bit width, not the whole vector size as it does on the CPU.
So this patch changes this to a call to .getLoadStoreVecRegBitWidth(), which
depends on the address space, so it also moves the calculation per seed.

This patch also adds an AMDGPU lit test directory with a simple test.
---
 .../Passes/SeedCollection.cpp                 | 18 ++++++++++-----
 .../SandboxVectorizer/AMDGPU/basic.ll         | 22 +++++++++++++++++++
 .../SandboxVectorizer/AMDGPU/lit.local.cfg    |  2 ++
 3 files changed, 36 insertions(+), 6 deletions(-)
 create mode 100644 llvm/test/Transforms/SandboxVectorizer/AMDGPU/basic.ll
 create mode 100644 llvm/test/Transforms/SandboxVectorizer/AMDGPU/lit.local.cfg

diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.cpp
index 0a6c086be259a..32bfb3c815e6d 100644
--- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.cpp
+++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.cpp
@@ -48,15 +48,17 @@ SeedCollection::SeedCollection(StringRef Pipeline, StringRef AuxArg)
   }
 }
 
+static unsigned getAddressSpace(Instruction *I) {
+  if (auto *LI = dyn_cast<LoadInst>(I))
+    return LI->getPointerOperand()->getType()->getPointerAddressSpace();
+  if (auto *SI = dyn_cast<StoreInst>(I))
+    return SI->getPointerOperand()->getType()->getPointerAddressSpace();
+  return 0;
+}
+
 bool SeedCollection::runOnFunction(Function &F, const Analyses &A) {
   bool Change = false;
   const auto &DL = F.getParent()->getDataLayout();
-  unsigned VecRegBits =
-      OverrideVecRegBits != 0
-          ? OverrideVecRegBits
-          : A.getTTI()
-                .getRegisterBitWidth(TargetTransformInfo::RGK_FixedWidthVector)
-                .getFixedValue();
   bool CollectStores = CollectSeeds.find(StoreSeedsDef) != std::string::npos;
   bool CollectLoads = CollectSeeds.find(LoadSeedsDef) != std::string::npos;
 
@@ -69,6 +71,10 @@ bool SeedCollection::runOnFunction(Function &F, const Analyses &A) {
           Utils::getNumBits(VecUtils::getElementType(Utils::getExpectedType(
                                 Seeds[Seeds.getFirstUnusedElementIdx()])),
                             DL);
+      unsigned AS = getAddressSpace(Seeds[0]);
+      unsigned VecRegBits = OverrideVecRegBits != 0
+                                ? OverrideVecRegBits
+                                : A.getTTI().getLoadStoreVecRegBitWidth(AS);
 
       auto DivideBy2 = [](unsigned Num) {
         auto Floor = VecUtils::getFloorPowerOf2(Num);
diff --git a/llvm/test/Transforms/SandboxVectorizer/AMDGPU/basic.ll b/llvm/test/Transforms/SandboxVectorizer/AMDGPU/basic.ll
new file mode 100644
index 0000000000000..e6f75fcc48c6f
--- /dev/null
+++ b/llvm/test/Transforms/SandboxVectorizer/AMDGPU/basic.ll
@@ -0,0 +1,22 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 6
+; RUN: opt -passes=sandbox-vectorizer -sbvec-passes="seed-collection<load-store-vec>" -mtriple=amdgcn--amdhsa -mcpu=gfx900 %s -S | FileCheck %s
+
+define void @basic(ptr %ptr0) {
+; CHECK-LABEL: define void @basic(
+; CHECK-SAME: ptr [[PTR0:%.*]]) #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT:    [[VECIINITL:%.*]] = load <2 x float>, ptr [[PTR0]], align 1, !sandboxvec [[META0:![0-9]+]]
+; CHECK-NEXT:    store <2 x float> [[VECIINITL]], ptr [[PTR0]], align 1, !sandboxvec [[META0]]
+; CHECK-NEXT:    ret void
+;
+  %ptr1 = getelementptr inbounds i8, ptr %ptr0, i64 4
+
+  %ld0 = load float, ptr %ptr0
+  %ld1 = load float, ptr %ptr1
+
+  store float %ld0, ptr %ptr0
+  store float %ld1, ptr %ptr1
+  ret void
+}
+;.
+; CHECK: [[META0]] = distinct !{!"sandboxregion"}
+;.
diff --git a/llvm/test/Transforms/SandboxVectorizer/AMDGPU/lit.local.cfg b/llvm/test/Transforms/SandboxVectorizer/AMDGPU/lit.local.cfg
new file mode 100644
index 0000000000000..7c492428aec76
--- /dev/null
+++ b/llvm/test/Transforms/SandboxVectorizer/AMDGPU/lit.local.cfg
@@ -0,0 +1,2 @@
+if not "AMDGPU" in config.root.targets:
+    config.unsupported = True

>From a2579bd763eccf74faf70bd276c904dd42bccfcc Mon Sep 17 00:00:00 2001
From: Vasileios Porpodas <vasileios.porpodas at amd.com>
Date: Tue, 28 Apr 2026 23:11:11 +0000
Subject: [PATCH 2/2] fixup! [SandboxVec][SeedCollector] Change vector bit
 width calculation

---
 .../Vectorize/SandboxVectorizer/Passes/SeedCollection.cpp     | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.cpp b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.cpp
index 32bfb3c815e6d..fc28c5bdf8217 100644
--- a/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.cpp
+++ b/llvm/lib/Transforms/Vectorize/SandboxVectorizer/Passes/SeedCollection.cpp
@@ -50,9 +50,9 @@ SeedCollection::SeedCollection(StringRef Pipeline, StringRef AuxArg)
 
 static unsigned getAddressSpace(Instruction *I) {
   if (auto *LI = dyn_cast<LoadInst>(I))
-    return LI->getPointerOperand()->getType()->getPointerAddressSpace();
+    return LI->getPointerAddressSpace();
   if (auto *SI = dyn_cast<StoreInst>(I))
-    return SI->getPointerOperand()->getType()->getPointerAddressSpace();
+    return SI->getPointerAddressSpace();
   return 0;
 }
 



More information about the llvm-commits mailing list