summaryrefslogtreecommitdiff
path: root/source/slang/slang-emit-c-like.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-01-25 17:27:40 -0800
committerGitHub <noreply@github.com>2023-01-25 17:27:40 -0800
commit1f4c7cab13341c2e9d48df2b01ed2c048c17c152 (patch)
treeed85dda63e1c939cf474961b965b7cc1883940bb /source/slang/slang-emit-c-like.cpp
parentaa6814be1f7dea20597ae34d477e79e53d4a543f (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.cpp65
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");