]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/30447 (Evaluate complex math functions at compile-time)
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>
Thu, 25 Jan 2007 04:15:26 +0000 (04:15 +0000)
committerKaveh Ghazi <ghazi@gcc.gnu.org>
Thu, 25 Jan 2007 04:15:26 +0000 (04:15 +0000)
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

gcc/ChangeLog
gcc/builtins.c

index 70402852f14e9b735ae9d2e76e552ab27080b0a3..d8f1cddc59cf46b6b283d6d1071bfc183066333c 100644 (file)
@@ -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.
index 19e7d345e53df3a310ed8bcf404c8128f4671689..c33cdf13979ce2435936cce8611927727e0d6740 100644 (file)
@@ -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)))