aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2005-05-26 05:51:22 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2005-05-26 05:51:22 +0000
commitc10166c437ce15a119b663ac153a6bbcddb1ce84 (patch)
treef1a62da9b426bbca532d566171554a727730161b
parent67730e237530f73a8ac3ff9ea35d7a6438407cd2 (diff)
downloadgcc-c10166c437ce15a119b663ac153a6bbcddb1ce84.zip
gcc-c10166c437ce15a119b663ac153a6bbcddb1ce84.tar.gz
gcc-c10166c437ce15a119b663ac153a6bbcddb1ce84.tar.bz2
re PR middle-end/21709 (ICE on compile-time complex NaN)
PR middle-end/21709 * fold-const.c (const_binop): Check for division by zero during complex division. * gcc.dg/pr21709-1.c: New test case. From-SVN: r100188
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c45
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr21709-1.c6
4 files changed, 41 insertions, 21 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e179c5f..6d9e69f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-05-25 Roger Sayle <roger@eyesopen.com>
+
+ PR middle-end/21709
+ * fold-const.c (const_binop): Check for division by zero during
+ complex division.
+
2005-05-26 Ian Lance Taylor <ian@airs.com>
* reload1.c (verify_initial_elim_offsets): Add braces to avoid
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 050d45c..0d5f4eb 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -1600,33 +1600,36 @@ const_binop (enum tree_code code, tree arg1, tree arg2, int notrunc)
case RDIV_EXPR:
{
+ tree t1, t2, real, imag;
tree magsquared
= const_binop (PLUS_EXPR,
const_binop (MULT_EXPR, r2, r2, notrunc),
const_binop (MULT_EXPR, i2, i2, notrunc),
notrunc);
- t = build_complex (type,
- const_binop
- (INTEGRAL_TYPE_P (TREE_TYPE (r1))
- ? TRUNC_DIV_EXPR : RDIV_EXPR,
- const_binop (PLUS_EXPR,
- const_binop (MULT_EXPR, r1, r2,
- notrunc),
- const_binop (MULT_EXPR, i1, i2,
- notrunc),
- notrunc),
- magsquared, notrunc),
- const_binop
- (INTEGRAL_TYPE_P (TREE_TYPE (r1))
- ? TRUNC_DIV_EXPR : RDIV_EXPR,
- const_binop (MINUS_EXPR,
- const_binop (MULT_EXPR, i1, r2,
- notrunc),
- const_binop (MULT_EXPR, r1, i2,
- notrunc),
- notrunc),
- magsquared, notrunc));
+ t1 = const_binop (PLUS_EXPR,
+ const_binop (MULT_EXPR, r1, r2, notrunc),
+ const_binop (MULT_EXPR, i1, i2, notrunc),
+ notrunc);
+ t2 = const_binop (MINUS_EXPR,
+ const_binop (MULT_EXPR, i1, r2, notrunc),
+ const_binop (MULT_EXPR, r1, i2, notrunc),
+ notrunc);
+
+ if (INTEGRAL_TYPE_P (TREE_TYPE (r1)))
+ {
+ real = const_binop (TRUNC_DIV_EXPR, t1, magsquared, notrunc);
+ imag = const_binop (TRUNC_DIV_EXPR, t2, magsquared, notrunc);
+ }
+ else
+ {
+ real = const_binop (RDIV_EXPR, t1, magsquared, notrunc);
+ imag = const_binop (RDIV_EXPR, t2, magsquared, notrunc);
+ if (!real || !imag)
+ return NULL_TREE;
+ }
+
+ t = build_complex (type, real, imag);
}
break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0944c29..9f2f537 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2005-05-25 Roger Sayle <roger@eyesopen.com>
+
+ PR middle-end/21709
+ * gcc.dg/pr21709-1.c: New test case.
+
2005-05-25 Ziemowit Laski <zlaski@apple.com>
Mike Stump <mrs@apple.com>
diff --git a/gcc/testsuite/gcc.dg/pr21709-1.c b/gcc/testsuite/gcc.dg/pr21709-1.c
new file mode 100644
index 0000000..0d6f20f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr21709-1.c
@@ -0,0 +1,6 @@
+/* PR middle-end/21709 */
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+
+double _Complex f(void) { return 1.0iF / 0.0; }
+