From: Roger Sayle Date: Mon, 13 Nov 2006 02:55:22 +0000 (+0000) Subject: fold-const.c (negate_expr_p): Correct/refine condition for transformations. X-Git-Tag: releases/gcc-4.3.0~8504 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1b43b96773b82117e3a194647a9e2cc3d8a3a6e0;p=thirdparty%2Fgcc.git fold-const.c (negate_expr_p): Correct/refine condition for transformations. * fold-const.c (negate_expr_p) : Correct/refine condition for transformations. Use !HONOR_SIGN_DEPENDENT_ROUNDING && !HONOR_SIGNED_ZEROS instead of flag_unsafe_math_optimizations. (fold_negate_expr) : Likewise. From-SVN: r118744 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ce01cd2c684f..2704ad3afc19 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2006-11-12 Roger Sayle + + * fold-const.c (negate_expr_p) : Correct/refine + condition for transformations. Use !HONOR_SIGN_DEPENDENT_ROUNDING + && !HONOR_SIGNED_ZEROS instead of flag_unsafe_math_optimizations. + (fold_negate_expr) : Likewise. + 2006-11-12 Daniel Berlin Fix PR tree-optimization/29587 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index eeec0c175bd4..c986503f1068 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -981,7 +981,8 @@ negate_expr_p (tree t) && negate_expr_p (TREE_IMAGPART (t)); case PLUS_EXPR: - if (FLOAT_TYPE_P (type) && !flag_unsafe_math_optimizations) + if (HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)) + || HONOR_SIGNED_ZEROS (TYPE_MODE (type))) return false; /* -(A + B) -> (-B) - A. */ if (negate_expr_p (TREE_OPERAND (t, 1)) @@ -993,7 +994,8 @@ negate_expr_p (tree t) case MINUS_EXPR: /* We can't turn -(A-B) into B-A when we honor signed zeros. */ - return (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations) + return !HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)) + && !HONOR_SIGNED_ZEROS (TYPE_MODE (type)) && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1)); @@ -1105,7 +1107,8 @@ fold_negate_expr (tree t) return TREE_OPERAND (t, 0); case PLUS_EXPR: - if (! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations) + if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)) + && !HONOR_SIGNED_ZEROS (TYPE_MODE (type))) { /* -(A + B) -> (-B) - A. */ if (negate_expr_p (TREE_OPERAND (t, 1)) @@ -1129,7 +1132,8 @@ fold_negate_expr (tree t) case MINUS_EXPR: /* - (A - B) -> B - A */ - if ((! FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations) + if (!HONOR_SIGN_DEPENDENT_ROUNDING (TYPE_MODE (type)) + && !HONOR_SIGNED_ZEROS (TYPE_MODE (type)) && reorder_operands_p (TREE_OPERAND (t, 0), TREE_OPERAND (t, 1))) return fold_build2 (MINUS_EXPR, type, TREE_OPERAND (t, 1), TREE_OPERAND (t, 0));