diff options
author | Carol Eidt <carol.eidt@microsoft.com> | 2018-07-02 14:48:10 -0700 |
---|---|---|
committer | Carol Eidt <carol.eidt@microsoft.com> | 2018-07-02 14:51:24 -0700 |
commit | 0a04fd06050f11c1e99ad3114fe71594899bd46a (patch) | |
tree | 374e528bc7e143401419bb541d1af902f1ba0409 | |
parent | 73b3ec31925c11456924a95200a478af54d4b2e6 (diff) | |
download | coreclr-0a04fd06050f11c1e99ad3114fe71594899bd46a.tar.gz coreclr-0a04fd06050f11c1e99ad3114fe71594899bd46a.tar.bz2 coreclr-0a04fd06050f11c1e99ad3114fe71594899bd46a.zip |
Port the fix for Issue 17969 to Rel/2.1
-rw-r--r-- | src/jit/morph.cpp | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/src/jit/morph.cpp b/src/jit/morph.cpp index 2c3c280a11..bd07098390 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)) { |