@@ -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