|
1 | 1 | // RUN: %clang_cc1 -triple dxil-pc-shadermodel6.6-compute -finclude-default-header \ |
2 | 2 | // RUN: -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s |
3 | 3 |
|
| 4 | +// https://github.com/llvm/llvm-project/issues/156786 |
| 5 | +// XFAIL: * |
| 6 | + |
4 | 7 | // This test verifies handling of multi-dimensional local arrays of resources |
5 | 8 | // when used as a function argument and local variable. |
6 | 9 |
|
@@ -29,19 +32,35 @@ float foo(RWBuffer<float> Arr[2][2]) { |
29 | 32 | // CHECK-NEXT: entry: |
30 | 33 | [numthreads(4,1,1)] |
31 | 34 | void main() { |
32 | | -// CHECK-NEXT: %L = alloca [2 x [2 x %"class.hlsl::RWBuffer"]], align 4 |
33 | | -// CHECK-NEXT: %[[Tmp:.*]] = alloca [2 x [2 x %"class.hlsl::RWBuffer"]], align 4 |
34 | | -// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %L, ptr align 4 @_ZL1A, i32 4, i1 false) |
35 | | -// CHECK-NEXT: %[[Ptr1:.*]] = getelementptr inbounds %"class.hlsl::RWBuffer", ptr %L, i32 1 |
36 | | -// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %[[Ptr1]], ptr align 4 @_ZL1B, i32 4, i1 false) |
37 | | -// CHECK-NEXT: %[[Ptr2:.*]] = getelementptr inbounds [2 x %"class.hlsl::RWBuffer"], ptr %L, i32 1 |
38 | | -// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %[[Ptr2]], ptr align 4 @_ZL1A, i32 4, i1 false) |
39 | | -// CHECK-NEXT: %[[Ptr3:.*]] = getelementptr inbounds %"class.hlsl::RWBuffer", ptr %[[Ptr2]], i32 1 |
40 | | -// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %[[Ptr3]], ptr align 4 @_ZL1B, i32 4, i1 false) |
| 35 | +// CHECK: %L = alloca [2 x [2 x %"class.hlsl::RWBuffer"]], align 4 |
| 36 | +// CHECK: %[[ref_tmp:.*]] = alloca %"class.hlsl::RWBuffer", align 4 |
| 37 | +// CHECK: %[[ref_tmp1:.*]] = alloca %"class.hlsl::RWBuffer", align 4 |
| 38 | +// CHECK: %[[ref_tmp2:.*]] = alloca %"class.hlsl::RWBuffer", align 4 |
| 39 | +// CHECK: %[[ref_tmp3:.*]] = alloca %"class.hlsl::RWBuffer", align 4 |
| 40 | +// CHECK: %[[ref_tmp4:.*]] = alloca %"class.hlsl::RWBuffer", align 4 |
| 41 | +// CHECK: %[[ref_tmp5:.*]] = alloca %"class.hlsl::RWBuffer", align 4 |
| 42 | +// CHECK: %[[ref_tmp6:.*]] = alloca %"class.hlsl::RWBuffer", align 4 |
| 43 | +// CHECK: %[[ref_tmp7:.*]] = alloca %"class.hlsl::RWBuffer", align 4 |
| 44 | +// CHECK: %[[agg_tmp:.*]] = alloca [2 x [2 x %"class.hlsl::RWBuffer"]], align 4 |
| 45 | +// CHECK: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp]], ptr {{.*}} @_ZL1A) |
| 46 | +// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp1]], ptr {{.*}} %[[ref_tmp]]) |
| 47 | +// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp2]], ptr {{.*}} @_ZL1B) |
| 48 | +// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp3]], ptr {{.*}} %[[ref_tmp2]]) |
| 49 | +// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp4]], ptr {{.*}} @_ZL1A) |
| 50 | +// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp5]], ptr {{.*}} %[[ref_tmp4]]) |
| 51 | +// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp6]], ptr {{.*}} @_ZL1B) |
| 52 | +// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[ref_tmp7]], ptr {{.*}} %[[ref_tmp6]]) |
| 53 | +// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %L, ptr {{.*}} %[[ref_tmp1]]) |
| 54 | +// CHECK-NEXT: %[[arrayinit_element:.*]] = getelementptr inbounds %"class.hlsl::RWBuffer", ptr %L, i32 1 |
| 55 | +// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[arrayinit_element]], ptr {{.*}} %[[ref_tmp3]]) |
| 56 | +// CHECK-NEXT: %[[arrayinit_element8:.*]] = getelementptr inbounds [2 x %"class.hlsl::RWBuffer"], ptr %L, i32 1 |
| 57 | +// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[arrayinit_element8]], ptr {{.*}} %[[ref_tmp5]]) |
| 58 | +// CHECK-NEXT: %[[arrayinit_element9:.*]] = getelementptr inbounds %"class.hlsl::RWBuffer", ptr %[[arrayinit_element8]], i32 1 |
| 59 | +// CHECK-NEXT: call void @_ZN4hlsl8RWBufferIfEC1ERKS1_(ptr {{.*}} %[[arrayinit_element9]], ptr {{.*}} %[[ref_tmp7]]) |
41 | 60 | RWBuffer<float> L[2][2] = { { A, B }, { A, B } }; |
42 | 61 |
|
43 | | -// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %[[Tmp]], ptr align 4 %L, i32 16, i1 false) |
44 | | -// CHECK-NEXT: %[[ReturnedValue:.*]] = call {{.*}}float @_Z3fooA2_A2_N4hlsl8RWBufferIfEE(ptr noundef byval([2 x [2 x %"class.hlsl::RWBuffer"]]) align 4 %[[Tmp]]) |
| 62 | +// CHECK: call void @llvm.memcpy.p0.p0.i32(ptr align 4 %[[agg_tmp]], ptr align 4 %L, i32 16, i1 false) |
| 63 | +// CHECK-NEXT: %[[ReturnedValue:.*]] = call {{.*}}float @_Z3fooA2_A2_N4hlsl8RWBufferIfEE(ptr noundef byval([2 x [2 x %"class.hlsl::RWBuffer"]]) align 4 %[[agg_tmp]]) |
45 | 64 | // CHECK-NEXT: %[[OutBufPtr:.*]] = call {{.*}} ptr @_ZN4hlsl18RWStructuredBufferIfEixEj(ptr {{.*}} @_ZL3Out, i32 noundef 0) |
46 | 65 | // CHECK-NEXT: store float %[[ReturnedValue]], ptr %[[OutBufPtr]], align 4 |
47 | 66 | // CHECK-NEXT: ret void |
|
0 commit comments