|
| 1 | +// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.6-compute -finclude-default-header \ |
| 2 | +// RUN: -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s |
| 3 | + |
| 4 | +// This test verifies local arrays of resources in HLSL. |
| 5 | + |
| 6 | +// CHECK: @_ZL1A = internal global %"class.hlsl::RWBuffer" poison, align 4 |
| 7 | +// CHECK: @_ZL1B = internal global %"class.hlsl::RWBuffer" poison, align 4 |
| 8 | +// CHECK: @_ZL1C = internal global %"class.hlsl::RWBuffer" poison, align 4 |
| 9 | + |
| 10 | +RWBuffer<float> A : register(u1); |
| 11 | +RWBuffer<float> B : register(u2); |
| 12 | +RWBuffer<float> C : register(u3); |
| 13 | +RWStructuredBuffer<float> Out : register(u0); |
| 14 | + |
| 15 | +// CHECK: define internal void @_Z4mainv() |
| 16 | +// CHECK-NEXT: entry: |
| 17 | +[numthreads(4,1,1)] |
| 18 | +void main() { |
| 19 | +// CHECK-NEXT: %First = alloca [3 x %"class.hlsl::RWBuffer"], align 4 |
| 20 | +// CHECK-NEXT: %Second = alloca [4 x %"class.hlsl::RWBuffer"], align 4 |
| 21 | + RWBuffer<float> First[3] = { A, B, C }; |
| 22 | + RWBuffer<float> Second[4]; |
| 23 | + |
| 24 | +// Verify initialization of First array from an initialization list |
| 25 | +// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %First, ptr align 4 @_ZL1A, i32 4, i1 false) |
| 26 | +// CHECK-NEXT: %[[Ptr1:.*]] = getelementptr inbounds %"class.hlsl::RWBuffer", ptr %First, i32 1 |
| 27 | +// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %[[Ptr1]], ptr align 4 @_ZL1B, i32 4, i1 false) |
| 28 | +// CHECK-NEXT: %[[Ptr2:.*]] = getelementptr inbounds %"class.hlsl::RWBuffer", ptr %First, i32 2 |
| 29 | +// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %[[Ptr2]], ptr align 4 @_ZL1C, i32 4, i1 false) |
| 30 | + |
| 31 | +// Verify default initialization of Second array, which means there is a loop iterating |
| 32 | +// over the array elements and calling the default constructor for each |
| 33 | +// CHECK-NEXT: %[[ArrayBeginPtr:.*]] = getelementptr inbounds [4 x %"class.hlsl::RWBuffer"], ptr %Second, i32 0, i32 0 |
| 34 | +// CHECK-NEXT: %[[ArrayEndPtr:.*]] = getelementptr inbounds %"class.hlsl::RWBuffer", ptr %[[ArrayBeginPtr]], i32 4 |
| 35 | +// CHECK-NEXT: br label %[[ArrayInitLoop:.*]] |
| 36 | +// CHECK: [[ArrayInitLoop]]: |
| 37 | +// CHECK-NEXT: %[[ArrayCurPtr:.*]] = phi ptr [ %[[ArrayBeginPtr]], %entry ], [ %[[ArrayNextPtr:.*]], %[[ArrayInitLoop]] ] |
| 38 | +// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1Ev(ptr {{.*}} %[[ArrayCurPtr]]) |
| 39 | +// CHECK-NEXT: %[[ArrayNextPtr]] = getelementptr inbounds %"class.hlsl::RWBuffer", ptr %[[ArrayCurPtr]], i32 1 |
| 40 | +// CHECK-NEXT: %[[ArrayInitDone:.*]] = icmp eq ptr %[[ArrayNextPtr]], %[[ArrayEndPtr]] |
| 41 | +// CHECK-NEXT: br i1 %[[ArrayInitDone]], label %[[AfterArrayInit:.*]], label %[[ArrayInitLoop]] |
| 42 | +// CHECK: [[AfterArrayInit]]: |
| 43 | + |
| 44 | +// Initialize First[2] with C |
| 45 | +// CHECK: %[[Ptr3:.*]] = getelementptr inbounds [4 x %"class.hlsl::RWBuffer"], ptr %Second, i32 0, i32 2 |
| 46 | +// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %[[Ptr3]], ptr align 4 @_ZL1C, i32 4, i1 false) |
| 47 | + Second[2] = C; |
| 48 | + |
| 49 | +// get First[1][0] value |
| 50 | +// CHECK: %[[First_1_Ptr:.*]] = getelementptr inbounds [3 x %"class.hlsl::RWBuffer"], ptr %First, i32 0, i32 1 |
| 51 | +// CHECK: %[[BufPtr1:.*]] = call {{.*}} ptr @_ZN4hlsl8RWBufferIfEixEj(ptr {{.*}} %[[First_1_Ptr]], i32 noundef 0) |
| 52 | +// CHECK: %[[Value1:.*]] = load float, ptr %[[BufPtr1]], align 4 |
| 53 | + |
| 54 | +// get Second[2][0] value |
| 55 | +// CHECK: %[[Second_2_Ptr:.*]] = getelementptr inbounds [4 x %"class.hlsl::RWBuffer"], ptr %Second, i32 0, i32 2 |
| 56 | +// CHECK: %[[BufPtr2:.*]] = call {{.*}} ptr @_ZN4hlsl8RWBufferIfEixEj(ptr {{.*}} %[[Second_2_Ptr]], i32 noundef 0) |
| 57 | +// CHECK: %[[Value2:.*]] = load float, ptr %[[BufPtr2]], align 4 |
| 58 | + |
| 59 | +// add them |
| 60 | +// CHECK: %{{.*}} = fadd {{.*}} float %[[Value1]], %[[Value2]] |
| 61 | + Out[0] = First[1][0] + Second[2][0]; |
| 62 | +} |
0 commit comments