The following patch fixes a latent bug uncovered by stmt folding
that expansion of FMA_EXPR didn't consider the multiplication
commutative when looking for feeding negates.

Bootstrap & regtest pending.

Richard.

2014-11-10  Richard Biener  <rguent...@suse.de>

        PR middle-end/63798
        * expr.c (expand_expr_real_2): When expanding FMA_EXPRs
        properly treat the embedded multiplication as commutative
        when looking for feeding negates.

Index: gcc/expr.c
===================================================================
--- gcc/expr.c  (revision 217281)
+++ gcc/expr.c  (working copy)
@@ -8621,6 +8621,19 @@ expand_expr_real_2 (sepops ops, rtx targ
          }
 
        def0 = get_def_for_expr (treeop0, NEGATE_EXPR);
+       /* The multiplication is commutative - look at its 2nd operand
+          if the first isn't fed by a negate.  */
+       if (!def0)
+         {
+           def0 = get_def_for_expr (treeop1, NEGATE_EXPR);
+           /* Swap operands if the 2nd operand is fed by a negate.  */
+           if (def0)
+             {
+               tree tem = treeop0;
+               treeop0 = treeop1;
+               treeop1 = tem;
+             }
+         }
        def2 = get_def_for_expr (treeop2, NEGATE_EXPR);
 
        op0 = op2 = NULL;

Reply via email to