From 9d35b6d189897e54df0d7ba1b19327cea5c89372 Mon Sep 17 00:00:00 2001 From: Eugene Rozenfeld Date: Tue, 23 Jun 2020 18:16:19 -0700 Subject: [PATCH] Extend redundant zero init optimization to recognize assignments to `GT_OBJ(lcl_addr)` and `GT_BLK(lcl_addr)` Fixes #38070. --- src/coreclr/src/jit/optimizer.cpp | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/coreclr/src/jit/optimizer.cpp b/src/coreclr/src/jit/optimizer.cpp index cd76b05dcce304..a418520c4f06fd 100644 --- a/src/coreclr/src/jit/optimizer.cpp +++ b/src/coreclr/src/jit/optimizer.cpp @@ -9279,12 +9279,28 @@ void Compiler::optRemoveRedundantZeroInits() case GT_ASG: { GenTreeOp* treeOp = tree->AsOp(); - if (!treeOp->gtOp1->OperIs(GT_LCL_VAR, GT_LCL_FLD)) + + unsigned lclNum = BAD_VAR_NUM; + + if (treeOp->gtOp1->OperIs(GT_LCL_VAR, GT_LCL_FLD)) + { + lclNum = treeOp->gtOp1->AsLclVarCommon()->GetLclNum(); + } + else if (treeOp->gtOp1->OperIs(GT_OBJ, GT_BLK)) + { + GenTreeLclVarCommon* lcl = treeOp->gtOp1->gtGetOp1()->IsLocalAddrExpr(); + + if (lcl != nullptr) + { + lclNum = lcl->GetLclNum(); + } + } + + if (lclNum == BAD_VAR_NUM) { break; } - unsigned lclNum = treeOp->gtOp1->AsLclVarCommon()->GetLclNum(); LclVarDsc* const lclDsc = lvaGetDesc(lclNum); unsigned* pRefCount = refCounts.LookupPointer(lclNum);