We should not transform a GT_DYN_BLK with a constant zero size into a GT_BLK as we...
authorBrian Sullivan <briansul@microsoft.com>
Tue, 6 Dec 2016 01:06:40 +0000 (17:06 -0800)
committerBrian Sullivan <briansul@microsoft.com>
Tue, 6 Dec 2016 18:16:31 +0000 (10:16 -0800)
Fixes VSO 287663

src/jit/gentree.cpp
src/jit/gentree.h
src/jit/morph.cpp

index 9749574..a749cb5 100644 (file)
@@ -9874,7 +9874,7 @@ void Compiler::gtDispNodeName(GenTree* tree)
     {
         sprintf_s(bufp, sizeof(buf), " %s_ovfl%c", name, 0);
     }
-    else if (tree->OperIsBlk() && (tree->AsBlk()->gtBlkSize != 0))
+    else if (tree->OperIsBlk() && !tree->OperIsDynBlk())
     {
         sprintf_s(bufp, sizeof(buf), " %s(%d)", name, tree->AsBlk()->gtBlkSize);
     }
index 6518f91..9be18b8 100644 (file)
@@ -1171,6 +1171,16 @@ public:
         return OperIsBlk(OperGet());
     }
 
+    static bool OperIsDynBlk(genTreeOps gtOper)
+    {
+        return ((gtOper == GT_DYN_BLK) || (gtOper == GT_STORE_DYN_BLK));
+    }
+
+    bool OperIsDynBlk() const
+    {
+        return OperIsDynBlk(OperGet());
+    }
+
     static bool OperIsStoreBlk(genTreeOps gtOper)
     {
         return ((gtOper == GT_STORE_BLK) || (gtOper == GT_STORE_OBJ) || (gtOper == GT_STORE_DYN_BLK));
index d4dd7fa..463e4a9 100644 (file)
@@ -9217,9 +9217,18 @@ GenTree* Compiler::fgMorphBlkNode(GenTreePtr tree, bool isDest)
         if (blkNode->AsDynBlk()->gtDynamicSize->IsCnsIntOrI())
         {
             unsigned size = (unsigned)blkNode->AsDynBlk()->gtDynamicSize->AsIntConCommon()->IconValue();
-            blkNode->AsDynBlk()->gtDynamicSize = nullptr;
-            blkNode->ChangeOper(GT_BLK);
-            blkNode->gtBlkSize = size;
+            // A GT_BLK with size of zero is not supported,
+            // so if we encounter such a thing we just leave it as a GT_DYN_BLK
+            if (size != 0)
+            {
+                blkNode->AsDynBlk()->gtDynamicSize = nullptr;
+                blkNode->ChangeOper(GT_BLK);
+                blkNode->gtBlkSize = size;
+            }
+            else
+            {
+                return tree;
+            }
         }
         else
         {