diff options
| author | Yong He <yonghe@outlook.com> | 2023-01-25 17:27:40 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-25 17:27:40 -0800 |
| commit | 1f4c7cab13341c2e9d48df2b01ed2c048c17c152 (patch) | |
| tree | ed85dda63e1c939cf474961b965b7cc1883940bb /source/slang/slang-emit-c-like.cpp | |
| parent | aa6814be1f7dea20597ae34d477e79e53d4a543f (diff) | |
Unify UpdateField and UpdateElement with access chain. (#2611)
* Unify UpdateField and UpdateElement with access chain.
* Fix warnings.
Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-emit-c-like.cpp')
| -rw-r--r-- | source/slang/slang-emit-c-like.cpp | 65 |
1 files changed, 33 insertions, 32 deletions
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<IRIntLit>(as<IRArrayType>(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<IRArrayType>(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<IRIntLit>(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<IRStructKey>(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"); |
