diff options
| -rw-r--r-- | source/slang/slang-ir-lower-buffer-element-type.cpp | 8 | ||||
| -rw-r--r-- | tests/bugs/gh-3795.slang | 24 |
2 files changed, 28 insertions, 4 deletions
diff --git a/source/slang/slang-ir-lower-buffer-element-type.cpp b/source/slang/slang-ir-lower-buffer-element-type.cpp index eb5fba6a9..7deb5f151 100644 --- a/source/slang/slang-ir-lower-buffer-element-type.cpp +++ b/source/slang/slang-ir-lower-buffer-element-type.cpp @@ -651,7 +651,7 @@ namespace Slang for (UInt i = 0; i < user->getOperandCount(); i++) args.add(user->getOperand(i)); auto newArrayPtrVal = builder.emitFieldAddress( - builder.getPtrType(loweredElementTypeInfo.loweredInnerArrayType), + getLoweredPtrLikeType(ptrVal->getDataType(), loweredElementTypeInfo.loweredInnerArrayType), ptrVal, loweredElementTypeInfo.loweredInnerStructKey); builder.replaceOperand(use, newArrayPtrVal); @@ -745,7 +745,7 @@ namespace Slang { IRInst* resultInst = nullptr; auto dataPtr = builder.emitFieldAddress( - builder.getPtrType(matrixTypeInfo->loweredInnerArrayType), + getLoweredPtrLikeType(majorAddr->getDataType(), matrixTypeInfo->loweredInnerArrayType), majorGEP->getBase(), matrixTypeInfo->loweredInnerStructKey); if (getIntVal(matrixType->getLayout()) == SLANG_MATRIX_LAYOUT_COLUMN_MAJOR) @@ -774,7 +774,7 @@ namespace Slang if (storeInst->getOperand(0) != majorAddr) break; auto dataPtr = builder.emitFieldAddress( - builder.getPtrType(matrixTypeInfo->loweredInnerArrayType), + getLoweredPtrLikeType(majorAddr->getDataType(), matrixTypeInfo->loweredInnerArrayType), majorGEP->getBase(), matrixTypeInfo->loweredInnerStructKey); if (getIntVal(matrixType->getLayout()) == SLANG_MATRIX_LAYOUT_COLUMN_MAJOR) @@ -804,7 +804,7 @@ namespace Slang Swap(rowIndex, colIndex); } auto dataPtr = builder.emitFieldAddress( - builder.getPtrType(matrixTypeInfo->loweredInnerArrayType), + getLoweredPtrLikeType(majorAddr->getDataType(), matrixTypeInfo->loweredInnerArrayType), majorGEP->getBase(), matrixTypeInfo->loweredInnerStructKey); auto vectorAddr = builder.emitElementAddress(dataPtr, rowIndex); diff --git a/tests/bugs/gh-3795.slang b/tests/bugs/gh-3795.slang new file mode 100644 index 000000000..4030c565a --- /dev/null +++ b/tests/bugs/gh-3795.slang @@ -0,0 +1,24 @@ +//TEST:SIMPLE(filecheck=CHECK): -target spirv -emit-spirv-directly + +// CHECK: OpEntryPoint + +struct Tester +{ + uint values[2]; +}; + +struct TestPush +{ + Tester* src; + uint* dst; +}; + +[[vk::push_constant]] TestPush test_p; + +[shader("compute")] +[numthreads(1,1,1)] +void main(uint3 dtid : SV_DispatchThreadID) +{ + uint value = test_p.src.values[0]; + *test_p.dst = value; +} |
