Skip to content

Commit c6fd054

Browse files
authored
Fix side-effect order for COMMA in impStoreStruct (#112455)
1 parent 06037f8 commit c6fd054

File tree

1 file changed

+23
-0
lines changed

1 file changed

+23
-0
lines changed

src/coreclr/jit/importer.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,16 +1004,35 @@ GenTree* Compiler::impStoreStruct(GenTree* store,
10041004
}
10051005
else if (src->OperIs(GT_COMMA))
10061006
{
1007+
GenTree* sideEffectAddressStore = nullptr;
1008+
if (store->OperIs(GT_STORE_BLK, GT_STOREIND) && ((store->AsIndir()->Addr()->gtFlags & GTF_ALL_EFFECT) != 0))
1009+
{
1010+
TempInfo addrTmp = fgMakeTemp(store->AsIndir()->Addr());
1011+
sideEffectAddressStore = addrTmp.store;
1012+
store->AsIndir()->Addr() = addrTmp.load;
1013+
}
1014+
10071015
if (pAfterStmt)
10081016
{
10091017
// Insert op1 after '*pAfterStmt'
1018+
if (sideEffectAddressStore != nullptr)
1019+
{
1020+
Statement* addrStmt = gtNewStmt(sideEffectAddressStore, usedDI);
1021+
fgInsertStmtAfter(block, *pAfterStmt, addrStmt);
1022+
*pAfterStmt = addrStmt;
1023+
}
1024+
10101025
Statement* newStmt = gtNewStmt(src->AsOp()->gtOp1, usedDI);
10111026
fgInsertStmtAfter(block, *pAfterStmt, newStmt);
10121027
*pAfterStmt = newStmt;
10131028
}
10141029
else if (impLastStmt != nullptr)
10151030
{
10161031
// Do the side-effect as a separate statement.
1032+
if (sideEffectAddressStore != nullptr)
1033+
{
1034+
impAppendTree(sideEffectAddressStore, curLevel, usedDI);
1035+
}
10171036
impAppendTree(src->AsOp()->gtOp1, curLevel, usedDI);
10181037
}
10191038
else
@@ -1026,6 +1045,10 @@ GenTree* Compiler::impStoreStruct(GenTree* store,
10261045
gtUpdateNodeSideEffects(store);
10271046
src->SetAllEffectsFlags(src->AsOp()->gtOp1, src->AsOp()->gtOp2);
10281047

1048+
if (sideEffectAddressStore != nullptr)
1049+
{
1050+
src = gtNewOperNode(GT_COMMA, src->TypeGet(), sideEffectAddressStore, src);
1051+
}
10291052
return src;
10301053
}
10311054

0 commit comments

Comments
 (0)