[llvm-branch-commits] [clang] [HLSL] Enable unbounded resource arrays at global scope (PR #155053)

Steven Perron via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Tue Aug 26 08:46:47 PDT 2025


================
@@ -0,0 +1,64 @@
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.6-compute -finclude-default-header \
+// RUN:   -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s -check-prefixes=CHECK,DXIL
+// RUN: %clang_cc1 -finclude-default-header -triple spirv-unknown-vulkan-compute \
+// RUN:   -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s -check-prefixes=CHECK,SPV
+
+// CHECK: @[[BufA:.*]] = private unnamed_addr constant [2 x i8] c"A\00", align 1
+// CHECK: @[[BufB:.*]] = private unnamed_addr constant [2 x i8] c"B\00", align 1
+
+RWBuffer<float> A[] : register(u10, space1);
+RWBuffer<int> B[][5][4];
+
+RWStructuredBuffer<float> Out;
+
+float foo(RWBuffer<int> Arr[4], uint Index) {
+  return (float)Arr[Index][0];
+}
+
+// NOTE:
+// - _ZN4hlsl8RWBufferIfEC1EjjijPKc is the constructor call for explicit binding for RWBuffer<float>
+//    (has "jjij" in the mangled name) and the arguments are (register, space, range_size, index, name).
+// - _ZN4hlsl8RWBufferIiEC1EjijjPKc is the constructor call for implicit binding for RWBuffer<int>
+//    (has "jijj" in the mangled name) and the arguments are (space, range_size, index, order_id, name).
+// - _ZN4hlsl8RWBufferIfEixEj is the subscript operator on RWBuffer<float>
+
+[numthreads(4,1,1)]
+void main(uint GI : SV_GroupIndex) {
+  // CHECK: define internal {{.*}}void @_Z4mainj(i32 noundef %GI)
+  // CHECK: %[[GI_alloca:.*]] = alloca i32, align 4
+  // CHECK-NEXT: %a = alloca float, align 4
+  // CHECK-NEXT: %[[Tmp0:.*]] = alloca %"class.hlsl::RWBuffer
+  // CHECK-NEXT: %b = alloca float, align 4
+  // CHECK-NEXT: %[[Tmp1:.*]] = alloca [4 x %"class.hlsl::RWBuffer"]
+  // CHECK-NEXT: %[[Tmp2:.*]] = alloca [4 x %"class.hlsl::RWBuffer"]
+  // CHECK-NEXT: store i32 %GI, ptr %[[GI_alloca]], align 4
+
+  // Make sure A[100] is translated to a RWBuffer<float> constructor call with range -1 and index 100
----------------
s-perron wrote:

Using `-1` for the range might require special casing in the SPIR-V backend. I'll follow up on that later.

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


More information about the llvm-branch-commits mailing list