From 983b2870e342e201dceeb6a1c8850783433a718b Mon Sep 17 00:00:00 2001 From: Bruce Forstall Date: Wed, 22 Mar 2017 16:21:04 -0700 Subject: [PATCH] Fix CSE bug with GT_MUL and GTF_MUL_64RSLT Unconditionally set op1 and op2 as GTF_DONT_CSE. Previously, this was only done if the cast was not a GT_NOP. It is possible for it already to come in as GT_NOP, thus leading to the possibility to CSE the operand, and leading to this assert firing: ``` assert(tree->gtIsValid64RsltMul()); ``` Commit migrated from https://github.com/dotnet/coreclr/commit/f401bfc49f96c12d90ec63bd4d4ef74d0cd998e6 --- src/coreclr/src/jit/morph.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/coreclr/src/jit/morph.cpp b/src/coreclr/src/jit/morph.cpp index bc80f9c..1f28a07 100644 --- a/src/coreclr/src/jit/morph.cpp +++ b/src/coreclr/src/jit/morph.cpp @@ -10869,7 +10869,6 @@ GenTreePtr Compiler::fgMorphSmpOp(GenTreePtr tree, MorphAddrContext* mac) op1->gtOp.gtOp1 = gtNewOperNode(GT_NOP, TYP_INT, op1->gtCast.CastOp()); op1->gtFlags &= ~GTF_ALL_EFFECT; op1->gtFlags |= (op1->gtCast.CastOp()->gtFlags & GTF_ALL_EFFECT); - op1->gtFlags |= GTF_DONT_CSE; } if (op2->gtCast.CastOp()->OperGet() != GT_NOP) @@ -10877,9 +10876,11 @@ GenTreePtr Compiler::fgMorphSmpOp(GenTreePtr tree, MorphAddrContext* mac) op2->gtOp.gtOp1 = gtNewOperNode(GT_NOP, TYP_INT, op2->gtCast.CastOp()); op2->gtFlags &= ~GTF_ALL_EFFECT; op2->gtFlags |= (op2->gtCast.CastOp()->gtFlags & GTF_ALL_EFFECT); - op2->gtFlags |= GTF_DONT_CSE; } + op1->gtFlags |= GTF_DONT_CSE; + op2->gtFlags |= GTF_DONT_CSE; + tree->gtFlags &= ~GTF_ALL_EFFECT; tree->gtFlags |= ((op1->gtFlags | op2->gtFlags) & GTF_ALL_EFFECT); -- 2.7.4