PR middle-end/11771
* fold-const.c (negate_expr_p <MINUS_EXPR>): Change to match the
logic in negate_expr, i.e. we don't invert (A-B) for floating
point types unless flag_unsafe_math_optimizations.
* gcc.c-torture/compile/
20030804-1.c: New test case.
From-SVN: r70159
+2003-08-04 Roger Sayle <roger@eyesopen.com>
+
+ PR middle-end/11771
+ * fold-const.c (negate_expr_p <MINUS_EXPR>): Change to match the
+ logic in negate_expr, i.e. we don't invert (A-B) for floating
+ point types unless flag_unsafe_math_optimizations.
+
2003-08-04 Roger Sayle <roger@eyesopen.com>
* fold-const.c (fold <PLUS_EXPR>): Transform x+x into x*2.0.
case REAL_CST:
case NEGATE_EXPR:
- case MINUS_EXPR:
return true;
+ 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;
+
default:
break;
}
+2003-08-04 Roger Sayle <roger@eyesopen.com>
+
+ PR middle-end/11771
+ * gcc.c-torture/compile/20030804-1.c: New test case.
+
2003-08-04 Roger Sayle <roger@eyesopen.com>
* gcc.dg/20030804-1.c: New test case.
--- /dev/null
+/* Extracted from PR middle-end/11771. */
+/* The following testcase used to ICE without -ffast-math from unbounded
+ recursion in fold. This was due to the logic in negate_expr_p not
+ matching that in negate_expr. */
+
+double f(double x) {
+ return -(1 - x) + (x ? -(1 - x) : 0);
+}
+