From 69e25d938b4fcca1a0f78e2224c1c524b9443b57 Mon Sep 17 00:00:00 2001 From: Brian Sullivan Date: Mon, 5 Dec 2016 17:06:40 -0800 Subject: [PATCH] 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 Commit migrated from https://github.com/dotnet/coreclr/commit/1e046fe3f79d4f352a36706cdb9a32a62af2339d --- src/coreclr/src/jit/gentree.cpp | 2 +- src/coreclr/src/jit/gentree.h | 10 ++++++++++ src/coreclr/src/jit/morph.cpp | 15 ++++++++++++--- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/coreclr/src/jit/gentree.cpp b/src/coreclr/src/jit/gentree.cpp index 9749574..a749cb5 100644 --- a/src/coreclr/src/jit/gentree.cpp +++ b/src/coreclr/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/coreclr/src/jit/gentree.h b/src/coreclr/src/jit/gentree.h index 6518f91..9be18b8 100644 --- a/src/coreclr/src/jit/gentree.h +++ b/src/coreclr/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/coreclr/src/jit/morph.cpp b/src/coreclr/src/jit/morph.cpp index d4dd7fa..463e4a9 100644 --- a/src/coreclr/src/jit/morph.cpp +++ b/src/coreclr/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 { -- 2.7.4