Move tan simplifications to match.pd
authorRichard Sandiford <richard.sandiford@arm.com>
Thu, 22 Oct 2015 08:32:01 +0000 (08:32 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 22 Oct 2015 08:32:01 +0000 (08:32 +0000)
Tested on x86_64-linux-gnu, aarch64-linux-gnu and arm-linux-gnueabi.

gcc/
* builtins.c (fold_builtin_tan): Delete.
(fold_builtin_1): Handle constant tan arguments here.
* match.pd: Simplify (tan (atan x)) to x.

From-SVN: r229166

gcc/ChangeLog
gcc/builtins.c
gcc/match.pd

index bd5aef52c9100d1d9fc771a31f2b09c53ef75761..2ec877a92566c8393fda139f815504cc96f092fb 100644 (file)
@@ -1,3 +1,9 @@
+2015-10-22  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * builtins.c (fold_builtin_tan): Delete.
+       (fold_builtin_1): Handle constant tan arguments here.
+       * match.pd: Simplify (tan (atan x)) to x.
+
 2015-10-22  Richard Sandiford  <richard.sandiford@arm.com>
 
        * builtins.c (fold_builtin_cproj): Delete.
index eec4b8898c16f05dfc8646ee0c1e5889723acbd4..02bf9f65a33907fdcfc77e5621f6acff22fa55cf 100644 (file)
@@ -160,7 +160,6 @@ static rtx expand_builtin_fabs (tree, rtx, rtx);
 static rtx expand_builtin_signbit (tree, rtx);
 static tree fold_builtin_pow (location_t, tree, tree, tree, tree);
 static tree fold_builtin_powi (location_t, tree, tree, tree, tree);
-static tree fold_builtin_tan (tree, tree);
 static tree fold_builtin_trunc (location_t, tree, tree);
 static tree fold_builtin_floor (location_t, tree, tree);
 static tree fold_builtin_ceil (location_t, tree, tree);
@@ -7538,33 +7537,6 @@ fold_fixed_mathfn (location_t loc, tree fndecl, tree arg)
   return NULL_TREE;
 }
 
-/* Fold function call to builtin tan, tanf, or tanl with argument ARG.
-   Return NULL_TREE if no simplification can be made.  */
-
-static tree
-fold_builtin_tan (tree arg, tree type)
-{
-  enum built_in_function fcode;
-  tree res;
-
-  if (!validate_arg (arg, REAL_TYPE))
-    return NULL_TREE;
-
-  /* Calculate the result when the argument is a constant.  */
-  if ((res = do_mpfr_arg1 (arg, type, mpfr_tan, NULL, NULL, 0)))
-    return res;
-
-  /* Optimize tan(atan(x)) = x.  */
-  fcode = builtin_mathfn_code (arg);
-  if (flag_unsafe_math_optimizations
-      && (fcode == BUILT_IN_ATAN
-         || fcode == BUILT_IN_ATANF
-         || fcode == BUILT_IN_ATANL))
-    return CALL_EXPR_ARG (arg, 0);
-
-  return NULL_TREE;
-}
-
 /* Fold function call to builtin sincos, sincosf, or sincosl.  Return
    NULL_TREE if no simplification can be made.  */
 
@@ -9612,7 +9584,9 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0)
       break;
 
     CASE_FLT_FN (BUILT_IN_TAN):
-      return fold_builtin_tan (arg0, type);
+      if (validate_arg (arg0, REAL_TYPE))
+       return do_mpfr_arg1 (arg0, type, mpfr_tan, NULL, NULL, 0);
+      break;
 
     CASE_FLT_FN (BUILT_IN_CEXP):
       return fold_builtin_cexp (loc, arg0, type);
index 6b181897e2b2b429492d60de54d93b7a6bf219da..1ba43c44c16851d5ad4cfc2a3d5c86995c763c60 100644 (file)
@@ -59,6 +59,7 @@ along with GCC; see the file COPYING3.  If not see
 (define_operator_list SIN BUILT_IN_SINF BUILT_IN_SIN BUILT_IN_SINL)
 (define_operator_list COS BUILT_IN_COSF BUILT_IN_COS BUILT_IN_COSL)
 (define_operator_list TAN BUILT_IN_TANF BUILT_IN_TAN BUILT_IN_TANL)
+(define_operator_list ATAN BUILT_IN_ATANF BUILT_IN_ATAN BUILT_IN_ATANL)
 (define_operator_list COSH BUILT_IN_COSHF BUILT_IN_COSH BUILT_IN_COSHL)
 (define_operator_list CEXPI BUILT_IN_CEXPIF BUILT_IN_CEXPI BUILT_IN_CEXPIL)
 (define_operator_list CPROJ BUILT_IN_CPROJF BUILT_IN_CPROJ BUILT_IN_CPROJL)
@@ -2374,7 +2375,14 @@ along with GCC; see the file COPYING3.  If not see
   /* cbrt(expN(x)) -> expN(x/3).  */
   (simplify
    (cbrts (exps @0))
-   (exps (mult @0 { build_real_truncate (type, dconst_third ()); })))))
+   (exps (mult @0 { build_real_truncate (type, dconst_third ()); }))))
+
+ /* tan(atan(x)) -> x.  */
+ (for tans (TAN)
+      atans (ATAN)
+  (simplify
+   (tans (atans @0))
+   @0)))
 
 /* cabs(x+0i) or cabs(0+xi) -> abs(x).  */
 (simplify