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;