diff options
author | Roger Sayle <roger@eyesopen.com> | 2003-08-04 23:46:34 +0000 |
---|---|---|
committer | Roger Sayle <sayle@gcc.gnu.org> | 2003-08-04 23:46:34 +0000 |
commit | 02a1994cbad7e89f535ee982c80def2bd6e7d9bf (patch) | |
tree | 9c669844e1a60281f0d3d519b7d1aa95ce112ec3 /gcc | |
parent | f2593a6649384b002184762c58b083eb5f8e939f (diff) | |
download | gcc-02a1994cbad7e89f535ee982c80def2bd6e7d9bf.zip gcc-02a1994cbad7e89f535ee982c80def2bd6e7d9bf.tar.gz gcc-02a1994cbad7e89f535ee982c80def2bd6e7d9bf.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fold-const.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/20030804-1.c | 9 |
4 files changed, 25 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index daf0bec..60bfb02 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 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. Optimize x*c+x and x+x*c into x*(c+1) and x*c1+x*c2 into x*(c1+c2) for floating point expressions with -ffast-math. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 4dd606f..9333c59 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 ba19bc8..86e12c5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 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. 2003-08-04 Alexandre Oliva <aoliva@redhat.com> 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 0000000..189fde3 --- /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); +} + |