From 730badc41e6995504471302afe66dcae5c7970a4 Mon Sep 17 00:00:00 2001 From: Mike Danes Date: Fri, 14 Dec 2018 21:36:10 +0200 Subject: [PATCH] Handle FP/int reinterpretation via GT_BITCAST --- src/jit/morph.cpp | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/src/jit/morph.cpp b/src/jit/morph.cpp index 0a6a6fc0b14a..c15ad093dc67 100644 --- a/src/jit/morph.cpp +++ b/src/jit/morph.cpp @@ -18415,6 +18415,31 @@ class LocalAddressVisitor final : public GenTreeVisitor { m_compiler->lvaSetVarAddrExposed(varDsc->lvIsStructField ? varDsc->lvParentLcl : val.LclNum()); } + else if ((val.Offset() == 0) && (genTypeSize(varDsc->TypeGet()) == genTypeSize(node->TypeGet())) && + (varTypeIsFloating(varDsc->TypeGet()) != varTypeIsFloating(node->TypeGet()))) + { + // We have something like IND(ADDR(LCL_VAR)) or some other + // floating point/integer reinterpretation tree, change it to use BITCAST. + if (user->OperIs(GT_ASG) && (user->gtGetOp1() == node)) + { + // This node is the LHS of an assignment, turn it into a LclVar + // and insert the BITCAST node on the RHS of the assignment + node->ChangeOper(GT_LCL_VAR); + node->gtType = varDsc->TypeGet(); + node->gtFlags &= ~GTF_ALL_EFFECT; + node->AsLclVar()->SetLclNum(val.LclNum()); + user->gtType = varDsc->TypeGet(); + user->AsOp()->gtOp2 = m_compiler->gtNewOperNode(GT_BITCAST, varDsc->TypeGet(), user->gtGetOp2()); + } + else + { + node->ChangeOper(GT_BITCAST); + node->gtFlags &= ~GTF_ALL_EFFECT; + node->AsUnOp()->gtOp1 = m_compiler->gtNewLclvNode(val.LclNum(), varDsc->TypeGet()); + } + + INDEBUG(m_stmtModified = true;) + } } INDEBUG(val.Consume();)