diff options
author | Kaveh R. Ghazi <ghazi@caip.rutgers.edu> | 2007-01-25 04:15:26 +0000 |
---|---|---|
committer | Kaveh Ghazi <ghazi@gcc.gnu.org> | 2007-01-25 04:15:26 +0000 |
commit | 01ffa370154d0d553874a5fa4e8e54852a8b93e7 (patch) | |
tree | d9f25c626dbbd015348068c552bd651f441b5dc8 /gcc/builtins.c | |
parent | e1f1ee86a8b97bdf12593c02c0ef6e286f2c795d (diff) | |
download | gcc-01ffa370154d0d553874a5fa4e8e54852a8b93e7.zip gcc-01ffa370154d0d553874a5fa4e8e54852a8b93e7.tar.gz gcc-01ffa370154d0d553874a5fa4e8e54852a8b93e7.tar.bz2 |
re PR middle-end/30447 (Evaluate complex math functions at compile-time)
PR middle-end/30447
* builtins.c (fold_builtin_cabs): Use MPFR to evaluate a
constant argument to cabs and do it without checking for
-funsafe-math-optimizations.
From-SVN: r121163
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 29 |
1 files changed, 7 insertions, 22 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c index 19e7d34..c33cdf1 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -7021,7 +7021,7 @@ fold_fixed_mathfn (tree fndecl, tree arglist) static tree fold_builtin_cabs (tree arglist, tree type, tree fndecl) { - tree arg; + tree arg, res; if (!arglist || TREE_CHAIN (arglist)) return NULL_TREE; @@ -7031,27 +7031,12 @@ fold_builtin_cabs (tree arglist, tree type, tree fndecl) || TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) != REAL_TYPE) return NULL_TREE; - /* Evaluate cabs of a constant at compile-time. */ - if (flag_unsafe_math_optimizations - && TREE_CODE (arg) == COMPLEX_CST - && TREE_CODE (TREE_REALPART (arg)) == REAL_CST - && TREE_CODE (TREE_IMAGPART (arg)) == REAL_CST - && !TREE_OVERFLOW (TREE_REALPART (arg)) - && !TREE_OVERFLOW (TREE_IMAGPART (arg))) - { - REAL_VALUE_TYPE r, i; - - r = TREE_REAL_CST (TREE_REALPART (arg)); - i = TREE_REAL_CST (TREE_IMAGPART (arg)); - - real_arithmetic (&r, MULT_EXPR, &r, &r); - real_arithmetic (&i, MULT_EXPR, &i, &i); - real_arithmetic (&r, PLUS_EXPR, &r, &i); - if (real_sqrt (&r, TYPE_MODE (type), &r) - || ! flag_trapping_math) - return build_real (type, r); - } - + /* Calculate the result when the argument is a constant. */ + if (TREE_CODE (arg) == COMPLEX_CST + && (res = do_mpfr_arg2 (TREE_REALPART (arg), TREE_IMAGPART (arg), + type, mpfr_hypot))) + return res; + /* If either part is zero, cabs is fabs of the other. */ if (TREE_CODE (arg) == COMPLEX_EXPR && real_zerop (TREE_OPERAND (arg, 0))) |