From f8cb9c4d61c412e370e9e09a41b40a3818a70f34 Mon Sep 17 00:00:00 2001 From: yum Date: Wed, 17 Dec 2025 22:27:10 -0800 Subject: fix compiler bug lol --- source/slang/slang-ir-cleanup-void.cpp | 93 ++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) (limited to 'source/slang/slang-ir-cleanup-void.cpp') diff --git a/source/slang/slang-ir-cleanup-void.cpp b/source/slang/slang-ir-cleanup-void.cpp index 3a776fc4f..b6f9c94d1 100644 --- a/source/slang/slang-ir-cleanup-void.cpp +++ b/source/slang/slang-ir-cleanup-void.cpp @@ -67,6 +67,99 @@ struct CleanUpVoidContext } } break; + case kIROp_MakeMatrix: + { + // Replace void arguments with zero-initialized vectors. + // This can happen from autodiff with no_diff params. + auto matrixType = as(inst->getDataType()); + if (!matrixType) + break; + auto elementType = matrixType->getElementType(); + auto rowCount = matrixType->getRowCount(); + IRType* rowType = nullptr; + { + IRBuilder builder(module); + builder.setInsertBefore(inst); + rowType = builder.getVectorType(elementType, rowCount); + } + + List newArgs; + bool changed = false; + for (UInt i = 0; i < inst->getOperandCount(); i++) + { + auto arg = inst->getOperand(i); + if (arg->getDataType() && arg->getDataType()->getOp() == kIROp_VoidType) + { + // Replace void with zero-initialized row vector. + IRBuilder builder(module); + builder.setInsertBefore(inst); + auto zero = builder.emitDefaultConstruct(rowType); + newArgs.add(zero); + changed = true; + } + else + { + newArgs.add(arg); + } + } + if (changed) + { + IRBuilder builder(module); + builder.setInsertBefore(inst); + auto newInst = builder.emitIntrinsicInst( + inst->getFullType(), + inst->getOp(), + newArgs.getCount(), + newArgs.getBuffer()); + inst->replaceUsesWith(newInst); + inst->removeAndDeallocate(); + inst = newInst; + } + } + break; + case kIROp_MakeVector: + { + // Replace void arguments with zero values. + // This can happen from autodiff with no_diff params. + auto vectorType = as(inst->getDataType()); + if (!vectorType) + break; + auto elementType = vectorType->getElementType(); + + List newArgs; + bool changed = false; + for (UInt i = 0; i < inst->getOperandCount(); i++) + { + auto arg = inst->getOperand(i); + if (arg->getDataType() && arg->getDataType()->getOp() == kIROp_VoidType) + { + // Replace void with zero element. + IRBuilder builder(module); + builder.setInsertBefore(inst); + auto zero = builder.emitDefaultConstruct(elementType); + newArgs.add(zero); + changed = true; + } + else + { + newArgs.add(arg); + } + } + if (changed) + { + IRBuilder builder(module); + builder.setInsertBefore(inst); + auto newInst = builder.emitIntrinsicInst( + inst->getFullType(), + inst->getOp(), + newArgs.getCount(), + newArgs.getBuffer()); + inst->replaceUsesWith(newInst); + inst->removeAndDeallocate(); + inst = newInst; + } + } + break; case kIROp_Func: { // Remove void parameter. -- cgit v1.2.3