On Mon, Oct 26, 2015 at 10:50 AM, Richard Sandiford <rdsandif...@googlemail.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_exponent): Delete. > (fold_builtin_2): Handle constant expN arguments here. > * match.pd: Fold expN(logN(x)) -> x. > > diff --git a/gcc/builtins.c b/gcc/builtins.c > index 3d39d43..e5a00ee 100644 > --- a/gcc/builtins.c > +++ b/gcc/builtins.c > @@ -7516,47 +7516,6 @@ fold_const_builtin_pow (tree arg0, tree arg1, tree > type) > return NULL_TREE; > } > > -/* A subroutine of fold_builtin to fold the various exponent > - functions. Return NULL_TREE if no simplification can be made. > - FUNC is the corresponding MPFR exponent function. */ > - > -static tree > -fold_builtin_exponent (location_t loc, tree fndecl, tree arg, > - int (*func)(mpfr_ptr, mpfr_srcptr, mp_rnd_t)) > -{ > - if (validate_arg (arg, REAL_TYPE)) > - { > - tree type = TREE_TYPE (TREE_TYPE (fndecl)); > - tree res; > - > - /* Calculate the result when the argument is a constant. */ > - if ((res = do_mpfr_arg1 (arg, type, func, NULL, NULL, 0))) > - return res; > - > - /* Optimize expN(logN(x)) = x. */ > - if (flag_unsafe_math_optimizations) > - { > - const enum built_in_function fcode = builtin_mathfn_code (arg); > - > - if ((func == mpfr_exp > - && (fcode == BUILT_IN_LOG > - || fcode == BUILT_IN_LOGF > - || fcode == BUILT_IN_LOGL)) > - || (func == mpfr_exp2 > - && (fcode == BUILT_IN_LOG2 > - || fcode == BUILT_IN_LOG2F > - || fcode == BUILT_IN_LOG2L)) > - || (func == mpfr_exp10 > - && (fcode == BUILT_IN_LOG10 > - || fcode == BUILT_IN_LOG10F > - || fcode == BUILT_IN_LOG10L))) > - return fold_convert_loc (loc, type, CALL_EXPR_ARG (arg, 0)); > - } > - } > - > - return NULL_TREE; > -} > - > /* Fold function call to builtin memchr. ARG1, ARG2 and LEN are the > arguments to the call, and TYPE is its return type. > Return NULL_TREE if no simplification can be made. */ > @@ -9004,14 +8963,20 @@ fold_builtin_1 (location_t loc, tree fndecl, tree > arg0) > break; > > CASE_FLT_FN (BUILT_IN_EXP): > - return fold_builtin_exponent (loc, fndecl, arg0, mpfr_exp); > + if (validate_arg (arg0, REAL_TYPE)) > + return do_mpfr_arg1 (arg0, type, mpfr_exp, NULL, NULL, 0); > + break; > > CASE_FLT_FN (BUILT_IN_EXP2): > - return fold_builtin_exponent (loc, fndecl, arg0, mpfr_exp2); > + if (validate_arg (arg0, REAL_TYPE)) > + return do_mpfr_arg1 (arg0, type, mpfr_exp2, NULL, NULL, 0); > + break; > > CASE_FLT_FN (BUILT_IN_EXP10): > CASE_FLT_FN (BUILT_IN_POW10): > - return fold_builtin_exponent (loc, fndecl, arg0, mpfr_exp10); > + if (validate_arg (arg0, REAL_TYPE)) > + return do_mpfr_arg1 (arg0, type, mpfr_exp10, NULL, NULL, 0); > + break; > > CASE_FLT_FN (BUILT_IN_EXPM1): > if (validate_arg (arg0, REAL_TYPE)) > diff --git a/gcc/match.pd b/gcc/match.pd > index a8adffb..303889b 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -2408,12 +2408,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (rdiv @0 (exps:s @1)) > (mult @0 (exps (negate @1))))) > > - /* Special case, optimize logN(expN(x)) = x. */ > (for logs (LOG LOG2 LOG10 LOG10) > exps (EXP EXP2 EXP10 POW10) > + /* logN(expN(x)) -> x. */ > (simplify > (logs (exps @0)) > - @0)) > + @0) > + /* expN(logN(x)) -> x. */ > + (simplify > + (exps (logs @0)) > + @0)) > > /* Optimize logN(func()) for various exponential functions. We > want to determine the value "x" and the power "exponent" in >