aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2003-08-04 23:46:34 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2003-08-04 23:46:34 +0000
commit02a1994cbad7e89f535ee982c80def2bd6e7d9bf (patch)
tree9c669844e1a60281f0d3d519b7d1aa95ce112ec3 /gcc
parentf2593a6649384b002184762c58b083eb5f8e939f (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/fold-const.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20030804-1.c9
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);
+}
+