brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · 92dba21 Raw
66 lines · plain
1// RUN: %clang_cc1 -triple dxil-pc-shadermodel6.6-compute -finclude-default-header \2// RUN:   -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s3 4// This test verifies handling of multi-dimensional local arrays of resources5// when used as a function argument and local variable.6 7// CHECK: @_ZL1A = internal global %"class.hlsl::RWBuffer" poison, align 48// CHECK: @_ZL1B = internal global %"class.hlsl::RWBuffer" poison, align 49 10RWBuffer<float> A : register(u10);11RWBuffer<float> B : register(u20);12RWStructuredBuffer<float> Out;13 14// NOTE: _ZN4hlsl8RWBufferIfEixEj is the subscript operator for RWBuffer<float> and15//       _ZN4hlsl18RWStructuredBufferIfEixEj is the subscript operator for RWStructuredBuffer<float>16 17// CHECK: define {{.*}} float @_Z3fooA2_A2_N4hlsl8RWBufferIfEE(ptr noundef byval([2 x [2 x %"class.hlsl::RWBuffer"]]) align 4 %Arr)18// CHECK-NEXT: entry:19float foo(RWBuffer<float> Arr[2][2]) {20// CHECK-NEXT: %[[Arr_1_Ptr:.*]] = getelementptr inbounds [2 x [2 x %"class.hlsl::RWBuffer"]], ptr %Arr, i32 0, i32 121// CHECK-NEXT: %[[Arr_1_1_Ptr:.*]] = getelementptr inbounds [2 x %"class.hlsl::RWBuffer"], ptr %[[Arr_1_Ptr]], i32 0, i32 122// CHECK-NEXT: %[[BufPtr:.*]] = call {{.*}} ptr @_ZN4hlsl8RWBufferIfEixEj(ptr {{.*}} %[[Arr_1_1_Ptr]], i32 noundef 0)23// CHECK-NEXT: %[[Value:.*]] = load float, ptr %[[BufPtr]], align 424// CHECK-NEXT: ret float %[[Value]]25  return Arr[1][1][0];26}27 28// CHECK: define internal void @_Z4mainv()29// CHECK-NEXT: entry:30[numthreads(4,1,1)]31void main() {32// CHECK: %L = alloca [2 x [2 x %"class.hlsl::RWBuffer"]], align 433// CHECK: %[[ref_tmp:.*]] = alloca %"class.hlsl::RWBuffer", align 434// CHECK: %[[ref_tmp1:.*]] = alloca %"class.hlsl::RWBuffer", align 435// CHECK: %[[ref_tmp2:.*]] = alloca %"class.hlsl::RWBuffer", align 436// CHECK: %[[ref_tmp3:.*]] = alloca %"class.hlsl::RWBuffer", align 437// CHECK: %[[ref_tmp4:.*]] = alloca %"class.hlsl::RWBuffer", align 438// CHECK: %[[ref_tmp5:.*]] = alloca %"class.hlsl::RWBuffer", align 439// CHECK: %[[ref_tmp6:.*]] = alloca %"class.hlsl::RWBuffer", align 440// CHECK: %[[ref_tmp7:.*]] = alloca %"class.hlsl::RWBuffer", align 441// CHECK: %[[agg_tmp:.*]] = alloca [2 x [2 x %"class.hlsl::RWBuffer"]], align 442// CHECK: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp]], ptr {{.*}} @_ZL1A)43// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp1]], ptr {{.*}} %[[ref_tmp]])44// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp2]], ptr {{.*}} @_ZL1B)45// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp3]], ptr {{.*}} %[[ref_tmp2]])46// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp4]], ptr {{.*}} @_ZL1A)47// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp5]], ptr {{.*}} %[[ref_tmp4]])48// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp6]], ptr {{.*}} @_ZL1B)49// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp7]], ptr {{.*}} %[[ref_tmp6]])50// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %L, ptr {{.*}} %[[ref_tmp1]])51// CHECK-NEXT: %[[arrayinit_element:.*]] = getelementptr inbounds %"class.hlsl::RWBuffer", ptr %L, i32 152// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[arrayinit_element]], ptr {{.*}} %[[ref_tmp3]])53// CHECK-NEXT: %[[arrayinit_element8:.*]] = getelementptr inbounds [2 x %"class.hlsl::RWBuffer"], ptr %L, i32 154// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[arrayinit_element8]], ptr {{.*}} %[[ref_tmp5]])55// CHECK-NEXT: %[[arrayinit_element9:.*]] = getelementptr inbounds %"class.hlsl::RWBuffer", ptr %[[arrayinit_element8]], i32 156// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[arrayinit_element9]], ptr {{.*}} %[[ref_tmp7]])57  RWBuffer<float> L[2][2] = { { A, B }, { A, B } };58 59// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %[[agg_tmp]], ptr align 4 %L, i32 16, i1 false)60// CHECK-NEXT: %[[ReturnedValue:.*]] = call {{.*}}float @_Z3fooA2_A2_N4hlsl8RWBufferIfEE(ptr noundef byval([2 x [2 x %"class.hlsl::RWBuffer"]]) align 4 %[[agg_tmp]])61// CHECK-NEXT: %[[OutBufPtr:.*]] = call {{.*}} ptr @_ZN4hlsl18RWStructuredBufferIfEixEj(ptr {{.*}} @_ZL3Out, i32 noundef 0)62// CHECK-NEXT: store float %[[ReturnedValue]], ptr %[[OutBufPtr]], align 463// CHECK-NEXT: ret void64  Out[0] = foo(L);65}66