Move expN folds to match.pd

Tested on x86_64-linux-gnu, aarch64-linux-gnu and arm-linux-gnueabi.

gcc/
	* builtins.c (fold_builtin_exponent): Delete.
	(fold_builtin_2): Handle constant expN arguments here.
	* match.pd: Fold expN(logN(x)) -> x.

From-SVN: r229410
This commit is contained in:
Richard Sandiford 2015-10-27 09:32:11 +00:00 committed by Richard Sandiford
parent 5ddc84ca83
commit 8acda9b2c0
3 changed files with 21 additions and 46 deletions

View File

@ -1,3 +1,9 @@
2015-10-27 Richard Sandiford <richard.sandiford@arm.com>
* builtins.c (fold_builtin_exponent): Delete.
(fold_builtin_2): Handle constant expN arguments here.
* match.pd: Fold expN(logN(x)) -> x.
2015-10-27 Richard Sandiford <richard.sandiford@arm.com> 2015-10-27 Richard Sandiford <richard.sandiford@arm.com>
* builtins.c (fold_builtin_powi): Delete. * builtins.c (fold_builtin_powi): Delete.

View File

@ -7516,47 +7516,6 @@ fold_const_builtin_pow (tree arg0, tree arg1, tree type)
return NULL_TREE; 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 /* Fold function call to builtin memchr. ARG1, ARG2 and LEN are the
arguments to the call, and TYPE is its return type. arguments to the call, and TYPE is its return type.
Return NULL_TREE if no simplification can be made. */ Return NULL_TREE if no simplification can be made. */
@ -9004,14 +8963,20 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0)
break; break;
CASE_FLT_FN (BUILT_IN_EXP): 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): 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_EXP10):
CASE_FLT_FN (BUILT_IN_POW10): 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): CASE_FLT_FN (BUILT_IN_EXPM1):
if (validate_arg (arg0, REAL_TYPE)) if (validate_arg (arg0, REAL_TYPE))

View File

@ -2407,12 +2407,16 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(rdiv @0 (exps:s @1)) (rdiv @0 (exps:s @1))
(mult @0 (exps (negate @1))))) (mult @0 (exps (negate @1)))))
/* Special case, optimize logN(expN(x)) = x. */
(for logs (LOG LOG2 LOG10 LOG10) (for logs (LOG LOG2 LOG10 LOG10)
exps (EXP EXP2 EXP10 POW10) exps (EXP EXP2 EXP10 POW10)
/* logN(expN(x)) -> x. */
(simplify (simplify
(logs (exps @0)) (logs (exps @0))
@0)) @0)
/* expN(logN(x)) -> x. */
(simplify
(exps (logs @0))
@0))
/* Optimize logN(func()) for various exponential functions. We /* Optimize logN(func()) for various exponential functions. We
want to determine the value "x" and the power "exponent" in want to determine the value "x" and the power "exponent" in