================
@@ -0,0 +1,157 @@
+// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.6-library
-finclude-default-header \
+// RUN: -emit-llvm -disable-llvm-passes -o - %s | llvm-cxxfilt | FileCheck
%s -check-prefixes=CHECK
+
+// 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
+
+// one-dimensional array
+RWBuffer<float> A[2] : register(u10, space1);
+
+// multi-dimensional array
+[[vk::binding(13)]]
+RWBuffer<float> B[2][2] : register(u13, space0);
+
+void useArray(RWBuffer<float> LocalArg[2]) {
+}
+
+void useMultiArray(RWBuffer<float> LocalArg[2][2]) {
+}
+
+// CHECK-LABEL: case1
+// CHECK: %LocalOne = alloca [2 x %"class.hlsl::RWBuffer"], align 4
+// CHECK: [[ArrayTmp:%.*]] = alloca [2 x %"class.hlsl::RWBuffer"], align 4
+
+// - Initialize all resources of the global array into a local temporary.
+// CHECK: [[ArrayPtr0:%.*]] = getelementptr [2 x %"class.hlsl::RWBuffer"], ptr
[[ArrayTmp]], i32 0, i32 0
+// CHECK-NEXT: call void
@hlsl::RWBuffer<float>::__createFromBinding({{.*}})(ptr {{.*}} [[ArrayPtr0]],
i32 noundef 10, i32 noundef 1, i32 noundef 2, i32 noundef 0, ptr noundef
[[BufA]])
+// CHECK-NEXT: [[ArrayPtr1:%.*]] = getelementptr [2 x
%"class.hlsl::RWBuffer"], ptr [[ArrayTmp]], i32 0, i32 1
+// CHECK-NEXT: call void
@hlsl::RWBuffer<float>::__createFromBinding({{.*}})(ptr {{.*}} [[ArrayPtr1]],
i32 noundef 10, i32 noundef 1, i32 noundef 2, i32 noundef 1, ptr noundef
[[BufA]])
+
+// - Copy from temporary to local array (in a loop)
+// CHECK: %arrayinit.begin = getelementptr inbounds [2 x
%"class.hlsl::RWBuffer"], ptr %LocalOne, i32 0, i32 0
+// CHECK: arrayinit.body:
+// CHECK: call void @hlsl::RWBuffer<float>::RWBuffer(hlsl::RWBuffer<float>
const&)(ptr {{.*}}, ptr {{.*}})
+// CHECK: arrayinit.end:
+// CHECK: ret void
+void case1() {
+ // local one-dimensional array initialialized with global array
+ RWBuffer<float> LocalOne[2] = A;
+}
+
+// CHECK-LABEL: case2
+// CHECK: %LocalTwo = alloca [2 x %"class.hlsl::RWBuffer"], align 4
+
+// - Local array is first initialized to poison using the default constructor
(in a loop)
+//
+// CHECK: %array.begin = getelementptr inbounds [2 x %"class.hlsl::RWBuffer"],
ptr %LocalTwo, i32 0, i32 0
+// CHECK: arrayctor.loop
+// CHECK: call void @hlsl::RWBuffer<float>::RWBuffer()(ptr {{.*}})
+// CHECK: arrayctor.cont:
+
+// - Initialize individual resource elements directly into the local array
+// CHECK: [[ArrayPtr0:%.*]] = getelementptr [2 x %"class.hlsl::RWBuffer"], ptr
%LocalTwo, i32 0, i32 0
+// CHECK-NEXT: call void
@hlsl::RWBuffer<float>::__createFromBinding({{.*}})(ptr {{.*}} [[ArrayPtr0]],
i32 noundef 10, i32 noundef 1, i32 noundef 2, i32 noundef 0, ptr noundef
[[BufA]])
+// CHECK-NEXT: [[ArrayPtr1:%.*]] = getelementptr [2 x
%"class.hlsl::RWBuffer"], ptr %LocalTwo, i32 0, i32 1
+// CHECK-NEXT: call void
@hlsl::RWBuffer<float>::__createFromBinding({{.*}})(ptr {{.*}} [[ArrayPtr1]],
i32 noundef 10, i32 noundef 1, i32 noundef 2, i32 noundef 1, ptr noundef
[[BufA]])
+// CHECK: ret void
+void case2() {
+ // local one-dimensional array initialialized with assignment
----------------
Icohedron wrote:
typo
```suggestion
// local one-dimensional array initialized with assignment
```
https://github.com/llvm/llvm-project/pull/198891
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits