fold-const.c (fold): Canonicalize X + -C as X - C for floating point additions...
authorRoger Sayle <roger@eyesopen.com>
Sun, 11 Jul 2004 21:56:37 +0000 (21:56 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Sun, 11 Jul 2004 21:56:37 +0000 (21:56 +0000)
* fold-const.c (fold) <PLUS_EXPR>: Canonicalize X + -C as X - C for
floating point additions, to keep real immediate constant positive.
<MINUS_EXPR>:  For floating point subtractions, only transform X - -C
into X + C, and leave positive real constants as X - C.

From-SVN: r84535

gcc/ChangeLog
gcc/fold-const.c

index 77123a09e91e61379ff5070f4243774799c45baa..89ff347dceb6b09e59eee2a6e069eb4403949805 100644 (file)
@@ -1,3 +1,10 @@
+2004-07-11  Roger Sayle  <roger@eyesopen.com>
+
+       * fold-const.c (fold) <PLUS_EXPR>: Canonicalize X + -C as X - C for
+       floating point additions, to keep real immediate constant positive.
+       <MINUS_EXPR>:  For floating point subtractions, only transform X - -C
+       into X + C, and leave positive real constants as X - C.
+
 2004-07-11  John David Anglin  <dave.anglin@nrc-cnrc.gc.ca>
 
        * pa.c (hppa_gimplify_va_arg_expr): Remove comment.
index f1927f27995e48e48db5cbb0df0324df075aca40..bc1e8773c97d154e6de7500d792d774323436140 100644 (file)
@@ -6589,6 +6589,17 @@ fold (tree expr)
          if (fold_real_zero_addition_p (TREE_TYPE (arg1), arg0, 0))
            return non_lvalue (fold_convert (type, arg1));
 
+         /* Convert X + -C into X - C.  */
+         if (TREE_CODE (arg1) == REAL_CST
+             && REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1)))
+           {
+             tem = fold_negate_const (arg1, type);
+             if (!TREE_OVERFLOW (arg1) || !flag_trapping_math)
+               return fold (build2 (MINUS_EXPR, type,
+                                    fold_convert (type, arg0),
+                                    fold_convert (type, tem)));
+           }
+
          /* Convert x+x into x*2.0.  */
          if (operand_equal_p (arg0, arg1, 0)
              && SCALAR_FLOAT_TYPE_P (type))
@@ -6921,7 +6932,10 @@ fold (tree expr)
 
       /* A - B -> A + (-B) if B is easily negatable.  */
       if (!wins && negate_expr_p (arg1)
-         && (FLOAT_TYPE_P (type)
+         && ((FLOAT_TYPE_P (type)
+               /* Avoid this transformation if B is a positive REAL_CST.  */
+              && (TREE_CODE (arg1) != REAL_CST
+                  ||  REAL_VALUE_NEGATIVE (TREE_REAL_CST (arg1))))
              || (INTEGRAL_TYPE_P (type) && flag_wrapv && !flag_trapv)))
        return fold (build2 (PLUS_EXPR, type, arg0, negate_expr (arg1)));