diff options
| author | Yong He <yonghe@outlook.com> | 2025-07-01 19:09:29 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-02 02:09:29 +0000 |
| commit | c701ec00ccce6dfa8094d6550ce2db929fc8cefe (patch) | |
| tree | 4f729e8fa5700b2d6d7d99f34514682e3ad351f8 /tests/spirv | |
| parent | 83c72fd8772d312233f4e3ccd4154b81030d4795 (diff) | |
Defer immutable buffer loads when emitting spirv. (#7579)
* Defer immutable buffer loads when emitting spirv.
* Fix.
* Fix.
* Fix.
* Fix tests.
* Fix test.
Diffstat (limited to 'tests/spirv')
| -rw-r--r-- | tests/spirv/aligned-load-store.slang | 7 | ||||
| -rw-r--r-- | tests/spirv/fetch-array-from-parameter-block.slang | 22 | ||||
| -rw-r--r-- | tests/spirv/large-struct.slang | 9 | ||||
| -rw-r--r-- | tests/spirv/pointer-data-marshal.slang | 6 | ||||
| -rw-r--r-- | tests/spirv/ptr-unsized-array-2.slang | 2 | ||||
| -rw-r--r-- | tests/spirv/ref-this.slang | 2 | ||||
| -rw-r--r-- | tests/spirv/subgroup-size-2.slang | 6 |
7 files changed, 39 insertions, 15 deletions
diff --git a/tests/spirv/aligned-load-store.slang b/tests/spirv/aligned-load-store.slang index e8bee779e..c2f50b66c 100644 --- a/tests/spirv/aligned-load-store.slang +++ b/tests/spirv/aligned-load-store.slang @@ -3,8 +3,8 @@ // CHECK: OpLoad {{.*}} Aligned 8 // CHECK: OpStore {{.*}} Aligned 16 -// CHECK: OpLoad {{.*}} Aligned 8 -// CHECK: OpLoad {{.*}} Aligned 8 +// CHECK: OpLoad {{.*}} Aligned 16 +// CHECK: OpLoad {{.*}} Aligned 16 // CHECK: OpStore {{.*}} Aligned 16 // CHECK: OpStore {{.*}} Aligned 16 @@ -20,6 +20,7 @@ void computeMain() var v = loadAligned<8>((float2x4*)data); storeAligned<16>((float2x4*)data+1, v); - var v1 = loadAligned<8>(data2); + var v1 = loadAligned<16>(data2); + v1.v0 += 1.0f; storeAligned<16>(data2, v1); }
\ No newline at end of file diff --git a/tests/spirv/fetch-array-from-parameter-block.slang b/tests/spirv/fetch-array-from-parameter-block.slang new file mode 100644 index 000000000..4a86bfb8d --- /dev/null +++ b/tests/spirv/fetch-array-from-parameter-block.slang @@ -0,0 +1,22 @@ +//TEST:SIMPLE(filecheck=CHECK):-target spirv + +//CHECK-NOT: OpCompositeConstruct +//CHECK-COUNT-1: OpStore + +struct Data +{ + int bigArray[8]; + int fetch(int i) + { + return bigArray[i]; + } +} + +ParameterBlock<Data> pData; +uniform int* result; + +[numthreads(16,1,1)] +void main(int id : SV_DispatchThreadID) +{ + *result = pData.fetch(id); +}
\ No newline at end of file diff --git a/tests/spirv/large-struct.slang b/tests/spirv/large-struct.slang index 7738a5fcf..2d79c0aaf 100644 --- a/tests/spirv/large-struct.slang +++ b/tests/spirv/large-struct.slang @@ -3,9 +3,8 @@ //TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-d3d12 -compute -output-using-type //TEST(compute, vulkan):COMPARE_COMPUTE_EX(filecheck-buffer=BUF):-cpu -compute -output-using-type -// Check that when generating spirv directly, we use a loop -// to copy large arrays in input data out into a local variable, instead of emitting -// unrolled code that reads each element of the array individually. +// Check that when generating spirv directly, we do not load the entire big array +// from the constant buffer into registers. struct WorkData { @@ -21,7 +20,9 @@ ConstantBuffer<WorkData> input; //TEST_INPUT:set resultBuffer = out ubuffer(data=[0 0 0 0], stride=4) RWStructuredBuffer<float> resultBuffer; -// CHECK: OpLoopMerge +// CHECK-NOT: OpLoopMerge +// CHECK-NOT: OpCompositeConstruct +// CHECK-COUNT-1: OpStore [numthreads(2, 1, 1)] void computeMain(uint3 tid: SV_DispatchThreadID) diff --git a/tests/spirv/pointer-data-marshal.slang b/tests/spirv/pointer-data-marshal.slang index 3ad6c373b..a07a365ce 100644 --- a/tests/spirv/pointer-data-marshal.slang +++ b/tests/spirv/pointer-data-marshal.slang @@ -8,9 +8,9 @@ struct Params { Foo *foo; }; -// CHECK: %[[PTR0:[A-Za-z0-9_]+]] = OpAccessChain %_ptr_PhysicalStorageBuffer__arr_v3float_int_2 %{{.*}} %int_0 -// CHECK: %[[PTR1:[A-Za-z0-9_]+]] = OpAccessChain %_ptr_PhysicalStorageBuffer_v3float %[[PTR0]] %int_1 -// CHECK: %[[PTR2:[A-Za-z0-9_]+]] = OpAccessChain %_ptr_PhysicalStorageBuffer_float %[[PTR1]] %int_2 +// CHECK: %[[PTR0:[A-Za-z0-9_]+]] = Op{{.*}}AccessChain %_ptr_PhysicalStorageBuffer__arr_v3float_int_2 %{{.*}} %int_0 +// CHECK: %[[PTR1:[A-Za-z0-9_]+]] = Op{{.*}}AccessChain %_ptr_PhysicalStorageBuffer_v3float %[[PTR0]] %int_1 +// CHECK: %[[PTR2:[A-Za-z0-9_]+]] = Op{{.*}}AccessChain %_ptr_PhysicalStorageBuffer_float %[[PTR1]] %int_2 ConstantBuffer<Params> params; diff --git a/tests/spirv/ptr-unsized-array-2.slang b/tests/spirv/ptr-unsized-array-2.slang index ac0911d76..eb653d0a6 100644 --- a/tests/spirv/ptr-unsized-array-2.slang +++ b/tests/spirv/ptr-unsized-array-2.slang @@ -3,7 +3,7 @@ // CHECK-DAG: %[[cbuffer__t:[A-Za-z0-9_]+]] = OpTypeStruct %_ptr_PhysicalStorageBuffer_uint // CHECK-DAG: %light_buffer = OpVariable %_ptr_PushConstant_[[cbuffer__t]] PushConstant -// CHECK: OpAccessChain %_ptr_PushConstant +// CHECK: Op{{.*}}AccessChain %_ptr_PushConstant // CHECK-NEXT: OpLoad // CHECK-NEXT: OpBitcast %_ptr_PhysicalStorageBuffer diff --git a/tests/spirv/ref-this.slang b/tests/spirv/ref-this.slang index de4263975..890e1451f 100644 --- a/tests/spirv/ref-this.slang +++ b/tests/spirv/ref-this.slang @@ -1,6 +1,6 @@ //TEST:SIMPLE(filecheck=CHECK): -target spirv -// CHECK: %[[PTR:[0-9a-zA-Z_]+]] = OpAccessChain %_ptr_PhysicalStorageBuffer_uint %{{.*}} %int_0 +// CHECK: %[[PTR:[0-9a-zA-Z_]+]] = Op{{.*}}AccessChain %_ptr_PhysicalStorageBuffer_uint %{{.*}} %int_0 // CHECK: %{{.*}} = OpAtomicIAdd %uint %[[PTR]] %uint_1 %uint_0 %uint_1 struct Buf diff --git a/tests/spirv/subgroup-size-2.slang b/tests/spirv/subgroup-size-2.slang index 500bd63c8..f7376f584 100644 --- a/tests/spirv/subgroup-size-2.slang +++ b/tests/spirv/subgroup-size-2.slang @@ -15,12 +15,12 @@ uint3 f() { return WorkgroupSize(); } void compute1() { // CHECK_EXPERIMENTAL-DAG: %[[VAR:[A-Za-z0-9_]+]] = OpTypePointer Function %v3int - // CHECK_EXPERIMENTAL: OpAccessChain %[[VAR]] + // CHECK_EXPERIMENTAL: Op{{.*}}AccessChain %[[VAR]] // // CHECK_EXPERIMENTAL-DAG: %[[CALL_RS:[A-Za-z0-9_]+]] = OpFunctionCall %v3uint %f // CHECK_EXPERIMENTAL: OpCompositeExtract %uint %[[CALL_RS]] 0 // - // CHECK_EXPERIMENTAL-DAG: %[[PTR:[A-Za-z0-9_]+]] = OpAccessChain %_ptr_StorageBuffer_int %outputBuffer %int_0 %int_1 + // CHECK_EXPERIMENTAL-DAG: %[[PTR:[A-Za-z0-9_]+]] = Op{{.*}}AccessChain %_ptr_StorageBuffer_int %outputBuffer %int_0 %int_1 // CHECK_EXPERIMENTAL: OpStore %[[PTR]] %int_2 // CHECK-DAG: %[[VAR:[A-Za-z0-9_]+]] = OpVariable %_ptr_Private_v3int Private @@ -29,7 +29,7 @@ void compute1() // CHECK-DAG: %[[CALL_RS:[A-Za-z0-9_]+]] = OpFunctionCall %v3uint %f // CHECK: OpCompositeExtract %uint %[[CALL_RS]] 0 // - // CHECK-DAG: %[[PTR:[A-Za-z0-9_]+]] = OpAccessChain %_ptr_StorageBuffer_int %outputBuffer %int_0 %int_1 + // CHECK-DAG: %[[PTR:[A-Za-z0-9_]+]] = Op{{.*}}AccessChain %_ptr_StorageBuffer_int %outputBuffer %int_0 %int_1 // CHECK: OpStore %[[PTR]] %int_2 const int x = f().x; |
