From c10166c437ce15a119b663ac153a6bbcddb1ce84 Mon Sep 17 00:00:00 2001 From: Roger Sayle Date: Thu, 26 May 2005 05:51:22 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 +++++ gcc/fold-const.c | 45 +++++++++++++++++--------------- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gcc.dg/pr21709-1.c | 6 +++++ 4 files changed, 41 insertions(+), 21 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr21709-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e179c5f429f..6d9e69f5c19 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-05-25 Roger Sayle + + PR middle-end/21709 + * fold-const.c (const_binop): Check for division by zero during + complex division. + 2005-05-26 Ian Lance Taylor * reload1.c (verify_initial_elim_offsets): Add braces to avoid diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 050d45c6069..0d5f4ebf2b1 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 0944c2943d9..9f2f537a924 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-05-25 Roger Sayle + + PR middle-end/21709 + * gcc.dg/pr21709-1.c: New test case. + 2005-05-25 Ziemowit Laski Mike Stump diff --git a/gcc/testsuite/gcc.dg/pr21709-1.c b/gcc/testsuite/gcc.dg/pr21709-1.c new file mode 100644 index 00000000000..0d6f20f3260 --- /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; } +