summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2014-11-10 14:06:56 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2014-11-10 14:06:56 +0000
commitec4d2c3d71e53c1a84c520b4761c9df6a52ab73b (patch)
treef4818fc8c8e6bf0a682024c1468df6402331438b
parent0eac737b74c9243af70933ff77f9b5e6a9697f5c (diff)
downloadgcc-ec4d2c3d71e53c1a84c520b4761c9df6a52ab73b.tar.gz
2014-11-10 Richard Biener <rguenther@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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@217287 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/expr.c13
2 files changed, 20 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a8ecaeaebb2..a2157f63203 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2014-11-10 Richard Biener <rguenther@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.
+
2014-11-10 Joern Rennecke <joern.rennecke@embecosm.com>
* config/avr/avr.h (CPLUSPLUS_CPP_SPEC): Define.
diff --git a/gcc/expr.c b/gcc/expr.c
index 203e28f56d1..0ef06ea98ae 100644
--- a/gcc/expr.c
+++ b/gcc/expr.c
@@ -8621,6 +8621,19 @@ expand_expr_real_2 (sepops ops, rtx target, machine_mode tmode,
}
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;