diff --git a/src/coreclr/jit/promotion.cpp b/src/coreclr/jit/promotion.cpp index c2d3f617af1086..7315cef5bc1c3c 100644 --- a/src/coreclr/jit/promotion.cpp +++ b/src/coreclr/jit/promotion.cpp @@ -1057,6 +1057,7 @@ class ReplaceVisitor : public GenTreeVisitor { assert(src->OperIs(GT_LCL_VAR, GT_LCL_FLD, GT_BLK, GT_FIELD)); + GenTreeFlags indirFlags = GTF_EMPTY; if (src->OperIs(GT_BLK, GT_FIELD)) { GenTree* addr = src->gtGetOp1(); @@ -1079,6 +1080,16 @@ class ReplaceVisitor : public GenTreeVisitor result->AddStatement(m_compiler->gtNewTempAssign(addrLcl, addr)); src->AsUnOp()->gtOp1 = m_compiler->gtNewLclvNode(addrLcl, addr->TypeGet()); } + + if (src->OperIs(GT_BLK)) + { + indirFlags = + src->gtFlags & (GTF_IND_VOLATILE | GTF_IND_NONFAULTING | GTF_IND_UNALIGNED | GTF_IND_INITCLASS); + } + else + { + indirFlags = src->gtFlags & GTF_IND_VOLATILE; + } } LclVarDsc* srcDsc = @@ -1128,8 +1139,10 @@ class ReplaceVisitor : public GenTreeVisitor if ((rep == firstRep) && m_compiler->fgIsBigOffset(srcOffs) && m_compiler->fgAddrCouldBeNull(src->gtGetOp1())) { - GenTree* addrForNullCheck = m_compiler->gtCloneExpr(src->gtGetOp1()); - result->AddStatement(m_compiler->gtNewIndir(TYP_BYTE, addrForNullCheck)); + GenTree* addrForNullCheck = m_compiler->gtCloneExpr(src->gtGetOp1()); + GenTreeIndir* indir = m_compiler->gtNewIndir(TYP_BYTE, addrForNullCheck); + indir->gtFlags |= indirFlags; + result->AddStatement(indir); UpdateEarlyRefCount(addrForNullCheck); } @@ -1143,7 +1156,7 @@ class ReplaceVisitor : public GenTreeVisitor } GenTree* dstLcl = m_compiler->gtNewLclvNode(rep->LclNum, rep->AccessType); - srcFld = m_compiler->gtNewIndir(rep->AccessType, addr, src->gtFlags & GTF_IND_VOLATILE); + srcFld = m_compiler->gtNewIndir(rep->AccessType, addr, indirFlags); srcFld->gtFlags |= GTF_GLOB_REF; }