diff --git a/tools/clang/lib/SPIRV/SpirvEmitter.cpp b/tools/clang/lib/SPIRV/SpirvEmitter.cpp index 8da3a3e6a0..288b926f24 100644 --- a/tools/clang/lib/SPIRV/SpirvEmitter.cpp +++ b/tools/clang/lib/SPIRV/SpirvEmitter.cpp @@ -2967,13 +2967,13 @@ void SpirvEmitter::doReturnStmt(const ReturnStmt *stmt) { declIdMapper.createResourceHeap(decl, resourceType); } - // Update counter variable associated with function returns - tryToAssignCounterVar(curFunction, retVal); - auto *retInfo = loadIfGLValue(retVal); if (!retInfo) return; + // Update counter variable associated with function returns + tryToAssignCounterVar(curFunction, retVal); + auto retType = retVal->getType(); if (retInfo->getLayoutRule() != SpirvLayoutRule::Void && retType->isStructureType()) { diff --git a/tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.return.counter.nested.call.hlsl b/tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.return.counter.nested.call.hlsl new file mode 100644 index 0000000000..5a7d177e47 --- /dev/null +++ b/tools/clang/test/CodeGenSPIRV/sm6_6.descriptorheap.return.counter.nested.call.hlsl @@ -0,0 +1,27 @@ +// RUN: %dxc -T cs_6_6 -E main -O3 %s -spirv | FileCheck %s + +RWStructuredBuffer GetBindlessResource_UIntBuffer_inner() { + return ResourceDescriptorHeap[1]; +} + +RWStructuredBuffer GetBindlessResource_UIntBuffer_outter() { + return GetBindlessResource_UIntBuffer_inner(); +} + +RWStructuredBuffer GetBindlessResource_UIntBuffer() { + return ResourceDescriptorHeap[0]; +} + +[numthreads(1, 1, 1)] +void main() { + RWStructuredBuffer a = GetBindlessResource_UIntBuffer(); + RWStructuredBuffer b = GetBindlessResource_UIntBuffer_outter(); +// CHECK-DAG: [[counter_a:%[0-9]+]] = OpAccessChain %_ptr_Uniform_int %counter_var_ResourceDescriptorHeap %uint_0 %uint_0 +// CHECK-DAG: [[counter_b:%[0-9]+]] = OpAccessChain %_ptr_Uniform_int %counter_var_ResourceDescriptorHeap %uint_1 %uint_0 + + a.IncrementCounter(); + b.IncrementCounter(); + +// CHECK-DAG: {{%[0-9]+}} = OpAtomicIAdd %int [[counter_a]] %uint_1 %uint_0 %int_1 +// CHECK-DAG: {{%[0-9]+}} = OpAtomicIAdd %int [[counter_b]] %uint_1 %uint_0 %int_1 +} diff --git a/tools/clang/test/CodeGenSPIRV/spirv.legal.sbuffer.usage.hlsl b/tools/clang/test/CodeGenSPIRV/spirv.legal.sbuffer.usage.hlsl index a123809d6b..3756424f10 100644 --- a/tools/clang/test/CodeGenSPIRV/spirv.legal.sbuffer.usage.hlsl +++ b/tools/clang/test/CodeGenSPIRV/spirv.legal.sbuffer.usage.hlsl @@ -87,6 +87,6 @@ float4 useAsStaticRWSBuffer() { // CHECK: %paramRWSBuffer = OpFunctionParameter %_ptr_Function__ptr_Uniform_type_RWStructuredBuffer_S RWStructuredBuffer returnRWSBuffer(RWStructuredBuffer paramRWSBuffer) { // CHECK: [[ptr_1:%[0-9]+]] = OpLoad %_ptr_Uniform_type_RWStructuredBuffer_S %paramRWSBuffer -// CHECK-NEXT: OpReturnValue [[ptr_1]] +// CHECK: OpReturnValue [[ptr_1]] return paramRWSBuffer; } diff --git a/tools/clang/test/CodeGenSPIRV/type.rwstructured-buffer.return.counter.hlsl b/tools/clang/test/CodeGenSPIRV/type.rwstructured-buffer.return.counter.hlsl new file mode 100644 index 0000000000..7815c5f421 --- /dev/null +++ b/tools/clang/test/CodeGenSPIRV/type.rwstructured-buffer.return.counter.hlsl @@ -0,0 +1,28 @@ +// RUN: %dxc -T cs_6_6 -E main -O3 %s -spirv | FileCheck %s + +RWStructuredBuffer resource; + +RWStructuredBuffer get_resource_inner() { + return resource; +} + +RWStructuredBuffer get_resource_outter() { + return get_resource_inner(); +} + +RWStructuredBuffer get_resource() { + return resource; +} + +[numthreads(1, 1, 1)] +void main() { + RWStructuredBuffer a = get_resource(); + RWStructuredBuffer b = get_resource_outter(); +// CHECK-DAG: [[counter:%[0-9]+]] = OpAccessChain %_ptr_Uniform_int %counter_var_resource %uint_0 + + a.IncrementCounter(); + b.IncrementCounter(); + +// CHECK-DAG: {{%[0-9]+}} = OpAtomicIAdd %int [[counter]] %uint_1 %uint_0 %int_1 +// CHECK-DAG: {{%[0-9]+}} = OpAtomicIAdd %int [[counter]] %uint_1 %uint_0 %int_1 +}