From: Richard Sandiford Date: Thu, 22 Oct 2015 08:32:01 +0000 (+0000) Subject: Move tan simplifications to match.pd X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=cfed37a03b7a495b25e63d335e9f00e2dc9583f0;p=gcc.git Move tan simplifications to match.pd 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index bd5aef52c91..2ec877a9256 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-10-22 Richard Sandiford + + * 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 * builtins.c (fold_builtin_cproj): Delete. diff --git a/gcc/builtins.c b/gcc/builtins.c index eec4b8898c1..02bf9f65a33 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -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); diff --git a/gcc/match.pd b/gcc/match.pd index 6b181897e2b..1ba43c44c16 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -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