From 1f4c7cab13341c2e9d48df2b01ed2c048c17c152 Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 25 Jan 2023 17:27:40 -0800 Subject: Unify UpdateField and UpdateElement with access chain. (#2611) * Unify UpdateField and UpdateElement with access chain. * Fix warnings. Co-authored-by: Yong He --- source/slang/slang-emit-c-like.cpp | 65 +++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 32 deletions(-) (limited to 'source/slang/slang-emit-c-like.cpp') diff --git a/source/slang/slang-emit-c-like.cpp b/source/slang/slang-emit-c-like.cpp index ffb469b9d..160585e26 100644 --- a/source/slang/slang-emit-c-like.cpp +++ b/source/slang/slang-emit-c-like.cpp @@ -1087,7 +1087,6 @@ bool CLikeSourceEmitter::shouldFoldInstIntoUseSites(IRInst* inst) // Never fold these, because their result cannot be computed // as a sub-expression (they must be emitted as a declaration // or statement). - case kIROp_UpdateField: case kIROp_UpdateElement: case kIROp_DefaultConstruct: return false; @@ -2487,43 +2486,45 @@ void CLikeSourceEmitter::_emitInst(IRInst* inst) auto ii = (IRUpdateElement*)inst; auto subscriptOuter = getInfo(EmitOp::General); auto subscriptPrec = getInfo(EmitOp::Postfix); - auto arraySize = as(as(inst->getDataType())->getElementCount()); - SLANG_RELEASE_ASSERT(arraySize); emitInstResultDecl(inst); - m_writer->emit("{"); - for (UInt i = 0; i < (UInt)arraySize->getValue(); i++) + if (auto arrayType = as(inst->getDataType())) { - if (i > 0) - m_writer->emit(", "); - emitOperand(ii->getOldValue(), leftSide(subscriptOuter, subscriptPrec)); - m_writer->emit("["); - m_writer->emit(i); - m_writer->emit("]"); + auto arraySize = as(arrayType->getElementCount()); + SLANG_RELEASE_ASSERT(arraySize); + m_writer->emit("{"); + for (UInt i = 0; i < (UInt)arraySize->getValue(); i++) + { + if (i > 0) + m_writer->emit(", "); + emitOperand(ii->getOldValue(), leftSide(subscriptOuter, subscriptPrec)); + m_writer->emit("["); + m_writer->emit(i); + m_writer->emit("]"); + } + m_writer->emit("}"); + } + else + { + emitOperand(ii->getOldValue(), getInfo(EmitOp::General)); } - - m_writer->emit("}"); - m_writer->emit(";\n"); - - emitOperand(ii, leftSide(subscriptOuter, subscriptPrec)); - m_writer->emit("["); - emitOperand(ii->getIndex(), getInfo(EmitOp::General)); - m_writer->emit("] = "); - emitOperand(ii->getElementValue(), getInfo(EmitOp::General)); - m_writer->emit(";\n"); - } - break; - case kIROp_UpdateField: - { - auto ii = (IRUpdateField*)inst; - emitInstResultDecl(inst); - emitOperand(ii->getOldValue(), getInfo(EmitOp::General)); m_writer->emit(";\n"); - auto subscriptOuter = getInfo(EmitOp::General); - auto subscriptPrec = getInfo(EmitOp::Postfix); emitOperand(ii, leftSide(subscriptOuter, subscriptPrec)); - m_writer->emit("."); - m_writer->emit(getName(ii->getFieldKey())); + for (UInt i = 0; i < ii->getAccessKeyCount(); i++) + { + auto key = ii->getAccessKey(i); + if (as(key)) + { + m_writer->emit("."); + m_writer->emit(getName(key)); + } + else + { + m_writer->emit("["); + emitOperand(key, getInfo(EmitOp::General)); + m_writer->emit("]"); + } + } m_writer->emit(" = "); emitOperand(ii->getElementValue(), getInfo(EmitOp::General)); m_writer->emit(";\n"); -- cgit v1.2.3