diff options
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fold-const.c | 45 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr21709-1.c | 6 |
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; } + |