+2006-11-12 Roger Sayle <roger@eyesopen.com>
+
+ * fold-const.c (negate_expr_p) <PLUS_EXPR, MINUS_EXPR>: Correct/refine
+ condition for transformations. Use !HONOR_SIGN_DEPENDENT_ROUNDING
+ && !HONOR_SIGNED_ZEROS instead of flag_unsafe_math_optimizations.
+ (fold_negate_expr) <PLUS_EXPR, MINUS_EXPR>: Likewise.
+
2006-11-12 Daniel Berlin <dberlin@dberlin.org>
Fix PR tree-optimization/29587
&& 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))
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));
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))
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));