fold-const.c (fold_binary): Guard (X-X) -> 0 transformation with !HONOR_NANS and...
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>
Tue, 12 Jun 2007 16:28:01 +0000 (16:28 +0000)
committerKaveh Ghazi <ghazi@gcc.gnu.org>
Tue, 12 Jun 2007 16:28:01 +0000 (16:28 +0000)
* fold-const.c (fold_binary): Guard (X-X) -> 0 transformation
with !HONOR_NANS and !HONOR_INFINITIES.
* simplify-rtx.c (simplify_binary_operation_1): Likewise.

From-SVN: r125652

gcc/ChangeLog
gcc/fold-const.c
gcc/simplify-rtx.c

index f95014c3d69722420d9eebe9ed14b718bbccccc0..616bc5097e97e3bb504e606fd0633e874a50f9c8 100644 (file)
@@ -1,3 +1,9 @@
+2007-06-12  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+       * fold-const.c (fold_binary): Guard (X-X) -> 0 transformation
+       with !HONOR_NANS and !HONOR_INFINITIES.
+       * simplify-rtx.c (simplify_binary_operation_1): Likewise.
+
 2007-06-12  Tristan Gingold  <gingold@adacore.com>
 
        * gcov.c: Comments updated.
index 06b7c74a2b56b798896f5cc99070c5785d9c4421..814d033ffc4ffa319d7493718b0d8f0e646758d1 100644 (file)
@@ -9585,7 +9585,10 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
         Also note that operand_equal_p is always false if an operand
         is volatile.  */
 
-      if ((! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations)
+      if ((! FLOAT_TYPE_P (type)
+          || (flag_unsafe_math_optimizations
+              && !HONOR_NANS (TYPE_MODE (type))
+              && !HONOR_INFINITIES (TYPE_MODE (type))))
          && operand_equal_p (arg0, arg1, 0))
        return fold_convert (type, integer_zero_node);
 
index cb79aa93d70a3f1b115c3e8155182df69ecf14d7..ade3968d0e68a1e35511ded5b58c8c1ada9fa2d8 100644 (file)
@@ -1772,10 +1772,14 @@ simplify_binary_operation_1 (enum rtx_code code, enum machine_mode mode,
     case MINUS:
       /* We can't assume x-x is 0 even with non-IEEE floating point,
         but since it is zero except in very strange circumstances, we
-        will treat it as zero with -funsafe-math-optimizations.  */
+        will treat it as zero with -funsafe-math-optimizations and
+        -ffinite-math-only.  */
       if (rtx_equal_p (trueop0, trueop1)
          && ! side_effects_p (op0)
-         && (! FLOAT_MODE_P (mode) || flag_unsafe_math_optimizations))
+         && (! FLOAT_MODE_P (mode)
+             || (flag_unsafe_math_optimizations
+                 && !HONOR_NANS (mode)
+                 && !HONOR_INFINITIES (mode))))
        return CONST0_RTX (mode);
 
       /* Change subtraction from zero into negation.  (0 - x) is the