re PR middle-end/11771 (Segfault with simple double arithmetics)

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
This commit is contained in:
Roger Sayle 2003-08-04 23:46:34 +00:00 committed by Roger Sayle
parent f2593a6649
commit 02a1994cba
4 changed files with 25 additions and 1 deletions

View File

@ -1,3 +1,10 @@
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.

View File

@ -841,9 +841,12 @@ negate_expr_p (tree t)
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;
}

View File

@ -1,3 +1,8 @@
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.

View File

@ -0,0 +1,9 @@
/* 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);
}