[llvm] [SPIR-V] Add capability for non-uniform indexing for `StructuredBuffer` types. (PR #163424)

Lucie Choi via llvm-commits llvm-commits at lists.llvm.org
Tue Oct 14 10:11:35 PDT 2025


https://github.com/luciechoi created https://github.com/llvm/llvm-project/pull/163424

- Capability `StorageBufferArrayNonUniformIndexing` is required if the non-uniform index accesses  "arrays in the StorageBuffer [storage class](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Storage_Class) or BufferBlock-[decorated](https://registry.khronos.org/SPIR-V/specs/unified1/SPIRV.html#Decoration) arrays."

- Also fix the wrong unit test name: `StructuredBufferNonUniformIdx.ll` -> `RWBufferNonUniformIdx.ll`

Resolves https://github.com/llvm/llvm-project/issues/162889

>From 42145c73a43d12bdb17d626e242a4d8dadeae401 Mon Sep 17 00:00:00 2001
From: luciechoi <ychoi0407 at gmail.com>
Date: Tue, 14 Oct 2025 17:01:40 +0000
Subject: [PATCH] [HLSL][SPIR-V] Add capability for non-uniform indexing for 
 types.

---
 llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp      | 14 ++++++++++++--
 ...erNonUniformIdx.ll => RWBufferNonUniformIdx.ll} |  0
 .../RWStructuredBufferNonUniformIdx.ll             |  1 +
 3 files changed, 13 insertions(+), 2 deletions(-)
 rename llvm/test/CodeGen/SPIRV/hlsl-resources/NonUniformIdx/{StructuredBufferNonUniformIdx.ll => RWBufferNonUniformIdx.ll} (100%)

diff --git a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
index 5144fb14fa6a6..43efc6de5489b 100644
--- a/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVModuleAnalysis.cpp
@@ -1200,6 +1200,18 @@ void addOpAccessChainReqs(const MachineInstr &Instr,
     return;
   }
 
+  bool IsNonUniform =
+      hasNonUniformDecoration(Instr.getOperand(0).getReg(), MRI);
+  if (StorageClass == SPIRV::StorageClass::StorageClass::StorageBuffer) {
+    if (IsNonUniform)
+      Handler.addRequirements(
+          SPIRV::Capability::StorageBufferArrayNonUniformIndexingEXT);
+    else
+      Handler.addRequirements(
+          SPIRV::Capability::StorageBufferArrayDynamicIndexing);
+    return;
+  }
+
   Register PointeeTypeReg = ResTypeInst->getOperand(2).getReg();
   MachineInstr *PointeeType = MRI.getUniqueVRegDef(PointeeTypeReg);
   if (PointeeType->getOpcode() != SPIRV::OpTypeImage &&
@@ -1208,8 +1220,6 @@ void addOpAccessChainReqs(const MachineInstr &Instr,
     return;
   }
 
-  bool IsNonUniform =
-      hasNonUniformDecoration(Instr.getOperand(0).getReg(), MRI);
   if (isUniformTexelBuffer(PointeeType)) {
     if (IsNonUniform)
       Handler.addRequirements(
diff --git a/llvm/test/CodeGen/SPIRV/hlsl-resources/NonUniformIdx/StructuredBufferNonUniformIdx.ll b/llvm/test/CodeGen/SPIRV/hlsl-resources/NonUniformIdx/RWBufferNonUniformIdx.ll
similarity index 100%
rename from llvm/test/CodeGen/SPIRV/hlsl-resources/NonUniformIdx/StructuredBufferNonUniformIdx.ll
rename to llvm/test/CodeGen/SPIRV/hlsl-resources/NonUniformIdx/RWBufferNonUniformIdx.ll
diff --git a/llvm/test/CodeGen/SPIRV/hlsl-resources/NonUniformIdx/RWStructuredBufferNonUniformIdx.ll b/llvm/test/CodeGen/SPIRV/hlsl-resources/NonUniformIdx/RWStructuredBufferNonUniformIdx.ll
index 2a12baf1e3ed4..a820e7a8ce06e 100644
--- a/llvm/test/CodeGen/SPIRV/hlsl-resources/NonUniformIdx/RWStructuredBufferNonUniformIdx.ll
+++ b/llvm/test/CodeGen/SPIRV/hlsl-resources/NonUniformIdx/RWStructuredBufferNonUniformIdx.ll
@@ -3,6 +3,7 @@
 
 ; CHECK-DAG: OpCapability Shader
 ; CHECK-DAG: OpCapability ShaderNonUniformEXT
+; CHECK-DAG: OpCapability StorageBufferArrayNonUniformIndexingEXT
 ; CHECK-DAG: OpDecorate {{%[0-9]+}} NonUniformEXT
 ; CHECK-DAG: OpDecorate {{%[0-9]+}} NonUniformEXT
 ; CHECK-DAG: OpDecorate {{%[0-9]+}} NonUniformEXT



More information about the llvm-commits mailing list