From: Carol Eidt Date: Mon, 2 Jul 2018 21:48:10 +0000 (-0700) Subject: Port the fix for Issue 17969 to Rel/2.1 X-Git-Tag: accepted/tizen/5.0/base/20181101.090356~60^2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0a04fd06050f11c1e99ad3114fe71594899bd46a;p=platform%2Fupstream%2Fcoreclr.git Port the fix for Issue 17969 to Rel/2.1 --- diff --git a/src/jit/morph.cpp b/src/jit/morph.cpp index 2c3c280..bd07098 100644 --- a/src/jit/morph.cpp +++ b/src/jit/morph.cpp @@ -10714,6 +10714,17 @@ GenTree* Compiler::fgMorphCopyBlock(GenTree* tree) } } + // Check to see if we are doing a copy to/from the same local block. + // If so, morph it to a nop. + if ((destLclVar != nullptr) && (srcLclVar == destLclVar) && (destFldSeq == srcFldSeq) && + destFldSeq != FieldSeqStore::NotAField()) + { + JITDUMP("Self-copy; replaced with a NOP.\n"); + GenTree* nop = gtNewNothingNode(); + INDEBUG(nop->gtDebugFlags |= GTF_DEBUG_NODE_MORPHED); + return nop; + } + // Check to see if we are required to do a copy block because the struct contains holes // and either the src or dest is externally visible // @@ -10721,14 +10732,6 @@ GenTree* Compiler::fgMorphCopyBlock(GenTree* tree) bool srcSingleLclVarAsg = false; bool destSingleLclVarAsg = false; - if ((destLclVar != nullptr) && (srcLclVar == destLclVar) && (destFldSeq == srcFldSeq)) - { - // Self-assign; no effect. - GenTree* nop = gtNewNothingNode(); - INDEBUG(nop->gtDebugFlags |= GTF_DEBUG_NODE_MORPHED); - return nop; - } - // If either src or dest is a reg-sized non-field-addressed struct, keep the copyBlock. if ((destLclVar != nullptr && destLclVar->lvRegStruct) || (srcLclVar != nullptr && srcLclVar->lvRegStruct)) {