aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>2007-01-25 04:15:26 +0000
committerKaveh Ghazi <ghazi@gcc.gnu.org>2007-01-25 04:15:26 +0000
commit01ffa370154d0d553874a5fa4e8e54852a8b93e7 (patch)
treed9f25c626dbbd015348068c552bd651f441b5dc8 /gcc
parente1f1ee86a8b97bdf12593c02c0ef6e286f2c795d (diff)
downloadgcc-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')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/builtins.c29
2 files changed, 14 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7040285..d8f1cdd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2007-01-24 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
+
+ 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.
+
2007-01-24 Douglas Gregor <dgregor@osl.iu.edu>
* c-common.h (RID_FIRST_CXX0X): New.
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)))