PR feedback and fix test.
authorCarol Eidt <carol.eidt@microsoft.com>
Fri, 11 May 2018 22:03:35 +0000 (15:03 -0700)
committerCarol Eidt <carol.eidt@microsoft.com>
Fri, 11 May 2018 22:03:35 +0000 (15:03 -0700)
Commit migrated from https://github.com/dotnet/coreclr/commit/f48ca8f3be0dae733068d43d8c99d27a520d8b2d

src/coreclr/src/jit/morph.cpp
src/coreclr/tests/src/JIT/Regression/JitBlue/GitHub_17969/GitHub_17969.il

index 8fe6372..698c041 100644 (file)
@@ -10744,22 +10744,24 @@ GenTree* Compiler::fgMorphCopyBlock(GenTree* tree)
             }
         }
 
-        // 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
-        //
-        bool requiresCopyBlock   = false;
-        bool srcSingleLclVarAsg  = false;
-        bool destSingleLclVarAsg = false;
-
+        // 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())
         {
-            // Self-assign; no effect.
+            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
+        //
+        bool requiresCopyBlock   = false;
+        bool srcSingleLclVarAsg  = false;
+        bool destSingleLclVarAsg = false;
+
         // 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))
         {
index bd49170..7af2f54 100644 (file)
         // s4[j].a2 = 16;
         ldloca.s   s4
         ldloc      j
-        conv.i8
+        conv.i
         ldc.i4.s   84
-        conv.i8
+        conv.i
         mul
         add
         ldc.i4.s   80
-        conv.i8
+        conv.i
         add
         ldc.i4.s   16
         stind.i4
         // s4[i] = s4[j];
         ldloca.s   s4
         ldloc      i
-        conv.i8
+        conv.i
         ldc.i4.s   84
-        conv.i8
+        conv.i
         mul
         add
         ldloca.s   s4
         ldloc      j
-        conv.i8
+        conv.i
         ldc.i4.s   84
-        conv.i8
+        conv.i
         mul
         add
         ldc.i4.s   84
@@ -92,9 +92,9 @@
         ldloca.s   s2
         ldloca.s   s4
         ldloc      i
-        conv.i8
+        conv.i
         ldc.i4.s   84
-        conv.i8
+        conv.i
         mul
         add
         ldc.i4.s   84
         // if (s4[i].a2 != 16) goto F1
         ldloca.s   s4
         ldloc      i
-        conv.i8
+        conv.i
         ldc.i4.s   84
-        conv.i8
+        conv.i
         mul
         add
         ldc.i4.s   80
-        conv.i8
+        conv.i
         add
         ldind.i4
         ldc.i4.s   16