re PR middle-end/31530 (Incorrect folding of multiplication and sign change when...
authorRichard Guenther <rguenther@suse.de>
Wed, 11 Apr 2007 11:13:54 +0000 (11:13 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 11 Apr 2007 11:13:54 +0000 (11:13 +0000)
2007-04-11  Richard Guenther  <rguenther@suse.de>

PR middle-end/31530
* simplify-rtx.c (simplify_binary_operation_1): Do not simplify
a * -b + c as c - a * b if we honor sign dependent rounding.

From-SVN: r123715

gcc/ChangeLog
gcc/simplify-rtx.c

index 31b0174c9b97ede7ba75db0ed20c7a42db2976c2..7d85c96bd313c53bb072aa3451b3a3e83726b7a2 100644 (file)
@@ -1,3 +1,9 @@
+2007-04-11  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/31530
+       * simplify-rtx.c (simplify_binary_operation_1): Do not simplify
+       a * -b + c as c - a * b if we honor sign dependent rounding.
+
 2007-04-11  Bernd Schmidt  <bernd.schmidt@analog.com>
 
        * config/bfin/bfin-protos.h (bfin_expand_movmem): Renamed from
index e4af34d7adf73cf505c2ba480f7b868a6227bb5a..cb79aa93d70a3f1b115c3e8155182df69ecf14d7 100644 (file)
@@ -1688,7 +1688,8 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
                                                         XEXP (op0, 1)));
 
       /* Canonicalize (plus (mult (neg B) C) A) to (minus A (mult B C)).  */
-      if (GET_CODE (op0) == MULT
+      if (!HONOR_SIGN_DEPENDENT_ROUNDING (mode)
+         && GET_CODE (op0) == MULT
          && GET_CODE (XEXP (op0, 0)) == NEG)
        {
          rtx in1, in2;
@@ -1916,7 +1917,8 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
        return reversed;
 
       /* Canonicalize (minus A (mult (neg B) C)) to (plus (mult B C) A).  */
-      if (GET_CODE (op1) == MULT
+      if (!HONOR_SIGN_DEPENDENT_ROUNDING (mode)
+         && GET_CODE (op1) == MULT
          && GET_CODE (XEXP (op1, 0)) == NEG)
        {
          rtx in1, in2;
@@ -1931,7 +1933,8 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
 
       /* Canonicalize (minus (neg A) (mult B C)) to
         (minus (mult (neg B) C) A).  */
-      if (GET_CODE (op1) == MULT
+      if (!HONOR_SIGN_DEPENDENT_ROUNDING (mode)
+         && GET_CODE (op1) == MULT
          && GET_CODE (op0) == NEG)
        {
          rtx in1, in2;