On Tue, Oct 20, 2015 at 11:14 AM, Richard Sandiford <richard.sandif...@arm.com> wrote: > Tested on x86_64-linux-gnu, aarch64-linux-gnu and arm-linux-gnueabi. > OK to install?
Ok. Thanks, Richard. > Thanks, > Richard > > > gcc/ > * builtins.c (fold_builtin_tab): Delete. > (fold_builtin_1): Handle constant tan arguments here. > * match.pd: Simplify (tan (atan x)) to x. > > diff --git a/gcc/builtins.c b/gcc/builtins.c > index 16f3bfd..3244538 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); > @@ -7539,33 +7538,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. */ > > @@ -9613,7 +9585,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 7d16c52..cd02b04 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) > @@ -2343,7 +2344,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 >