From: Kaveh R. Ghazi Date: Tue, 12 Jun 2007 16:28:01 +0000 (+0000) Subject: fold-const.c (fold_binary): Guard (X-X) -> 0 transformation with !HONOR_NANS and... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=52a39a4c5db03b2e614f4bde1632e025348d1ebe;p=gcc.git fold-const.c (fold_binary): Guard (X-X) -> 0 transformation with !HONOR_NANS and !HONOR_INFINITIES. * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f95014c3d69..616bc5097e9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-06-12 Kaveh R. Ghazi + + * 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 * gcov.c: Comments updated. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 06b7c74a2b5..814d033ffc4 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -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); diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index cb79aa93d70..ade3968d0e6 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -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