From: Roger Sayle Date: Mon, 4 Aug 2003 23:46:34 +0000 (+0000) Subject: re PR middle-end/11771 (Segfault with simple double arithmetics) X-Git-Tag: releases/gcc-3.4.0~4396 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=02a1994cbad7e89f535ee982c80def2bd6e7d9bf;p=thirdparty%2Fgcc.git re PR middle-end/11771 (Segfault with simple double arithmetics) PR middle-end/11771 * fold-const.c (negate_expr_p ): 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index daf0bec3424e..60bfb0289e43 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-08-04 Roger Sayle + + PR middle-end/11771 + * fold-const.c (negate_expr_p ): 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 * fold-const.c (fold ): Transform x+x into x*2.0. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 4dd606f68bf5..9333c5907477 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ba19bc89283a..86e12c522c41 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-08-04 Roger Sayle + + PR middle-end/11771 + * gcc.c-torture/compile/20030804-1.c: New test case. + 2003-08-04 Roger Sayle * gcc.dg/20030804-1.c: New test case. diff --git a/gcc/testsuite/gcc.c-torture/compile/20030804-1.c b/gcc/testsuite/gcc.c-torture/compile/20030804-1.c new file mode 100644 index 000000000000..189fde3cee5f --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/20030804-1.c @@ -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); +} +