summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Sullivan <briansul@microsoft.com>2016-12-05 17:06:40 -0800
committerBrian Sullivan <briansul@microsoft.com>2016-12-06 10:16:31 -0800
commit1e046fe3f79d4f352a36706cdb9a32a62af2339d (patch)
treee121c3edabe0ef4aa1509d86567c98d2054b2e06
parent61ffc9f3fbf80a6b8a04eb2674b057c6cce465f0 (diff)
downloadcoreclr-1e046fe3f79d4f352a36706cdb9a32a62af2339d.tar.gz
coreclr-1e046fe3f79d4f352a36706cdb9a32a62af2339d.tar.bz2
coreclr-1e046fe3f79d4f352a36706cdb9a32a62af2339d.zip
We should not transform a GT_DYN_BLK with a constant zero size into a GT_BLK as we do not support a GT_BLK of size zero.
Fixes VSO 287663
-rw-r--r--src/jit/gentree.cpp2
-rw-r--r--src/jit/gentree.h10
-rw-r--r--src/jit/morph.cpp15
3 files changed, 23 insertions, 4 deletions
diff --git a/src/jit/gentree.cpp b/src/jit/gentree.cpp
index 9749574d1f..a749cb5107 100644
--- a/src/jit/gentree.cpp
+++ b/src/jit/gentree.cpp
@@ -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);
}
diff --git a/src/jit/gentree.h b/src/jit/gentree.h
index 6518f91c57..9be18b8bff 100644
--- a/src/jit/gentree.h
+++ b/src/jit/gentree.h
@@ -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));
diff --git a/src/jit/morph.cpp b/src/jit/morph.cpp
index d4dd7fa974..463e4a99ce 100644
--- a/src/jit/morph.cpp
+++ b/src/jit/morph.cpp
@@ -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
{