Fix CSE bug with GT_MUL and GTF_MUL_64RSLT
authorBruce Forstall <brucefo@microsoft.com>
Wed, 22 Mar 2017 23:21:04 +0000 (16:21 -0700)
committerBruce Forstall <brucefo@microsoft.com>
Wed, 22 Mar 2017 23:21:04 +0000 (16:21 -0700)
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());
```

src/jit/morph.cpp

index bc80f9c..1f28a07 100644 (file)
@@ -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);