From 70e2aa72045c6fce4c9df752070bc17590bf8423 Mon Sep 17 00:00:00 2001 From: Vadim Sychev Date: Sun, 11 Sep 2022 14:17:07 +0200 Subject: [PATCH] Draft fix for a series of multiplications (#75413) --- src/coreclr/jit/morph.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/coreclr/jit/morph.cpp b/src/coreclr/jit/morph.cpp index d4eee4b3d21c30..1855b265fb1393 100644 --- a/src/coreclr/jit/morph.cpp +++ b/src/coreclr/jit/morph.cpp @@ -12687,6 +12687,24 @@ GenTree* Compiler::fgOptimizeMultiply(GenTreeOp* mul) fgUpdateConstTreeValueNumber(op2); mul->ChangeOper(GT_LSH, GenTree::PRESERVE_VN); + if (mul->gtGetOp1()->OperIs(GT_LSH) && mul->gtGetOp1()->gtGetOp2()->IsIntegralConst()) + { + GenTree* lsOp = mul->gtGetOp1(); + GenTree* rsOp = mul->gtGetOp2(); + GenTree* lsOpChOp1 = lsOp->gtGetOp1(); + GenTree* lsOpChOp2 = lsOp->gtGetOp2(); + + int64_t child_val = lsOpChOp2->AsIntConCommon()->IntegralValue(); + int64_t root_val = rsOp->AsIntConCommon()->IntegralValue(); + + mul->gtOp1 = lsOpChOp1; + mul->gtOp2 = lsOpChOp2; + mul->gtOp2->AsIntConCommon()->SetIntegralValue(root_val + child_val); + + DEBUG_DESTROY_NODE(lsOp); + DEBUG_DESTROY_NODE(rsOp); + } + return mul; } }