Commit 86c0733f by Richard Sandiford Committed by Richard Sandiford

Move ldexp, scalbn and scalbln folds to match.pd

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

gcc/
	* builtins.c (fold_builtin_load_exponent): Rename to...
	(fold_const_builtin_load_exponent): ...this and only handle
	constant arguments.
	(fold_builtin_2): Update accordingly.
	* match.pd: Add rules previously handled by fold_builtin_load_exponent.

gcc/testsuite/
	* gcc.dg/torture/builtin-ldexp-1.c: Skip at -O9,

From-SVN: r229434
parent 83668c85
2015-10-27 Richard Sandiford <richard.sandiford@arm.com>
* builtins.c (fold_builtin_load_exponent): Rename to...
(fold_const_builtin_load_exponent): ...this and only handle
constant arguments.
(fold_builtin_2): Update accordingly.
* match.pd: Add rules previously handled by fold_builtin_load_exponent.
2015-10-27 Richard Sandiford <richard.sandiford@arm.com>
* builtins.c (fold_builtin_logb): Rename to...
(fold_const_builtin_logb): ...this and remove STRIP_NOPS call.
(fold_builtin_significand): Rename to...
......@@ -8060,20 +8060,11 @@ fold_builtin_frexp (location_t loc, tree arg0, tree arg1, tree rettype)
check the mode of the TYPE parameter in certain cases. */
static tree
fold_builtin_load_exponent (location_t loc, tree arg0, tree arg1,
tree type, bool ldexp)
fold_const_builtin_load_exponent (tree arg0, tree arg1,
tree type, bool ldexp)
{
if (validate_arg (arg0, REAL_TYPE) && validate_arg (arg1, INTEGER_TYPE))
{
STRIP_NOPS (arg0);
STRIP_NOPS (arg1);
/* If arg0 is 0, Inf or NaN, or if arg1 is 0, then return arg0. */
if (real_zerop (arg0) || integer_zerop (arg1)
|| (TREE_CODE (arg0) == REAL_CST
&& !real_isfinite (&TREE_REAL_CST (arg0))))
return omit_one_operand_loc (loc, type, arg0, arg1);
/* If both arguments are constant, then try to evaluate it. */
if ((ldexp || REAL_MODE_FORMAT (TYPE_MODE (type))->b == 2)
&& TREE_CODE (arg0) == REAL_CST && !TREE_OVERFLOW (arg0)
......@@ -9126,11 +9117,12 @@ fold_builtin_2 (location_t loc, tree fndecl, tree arg0, tree arg1)
break;
CASE_FLT_FN (BUILT_IN_LDEXP):
return fold_builtin_load_exponent (loc, arg0, arg1, type, /*ldexp=*/true);
return fold_const_builtin_load_exponent (arg0, arg1, type,
/*ldexp=*/true);
CASE_FLT_FN (BUILT_IN_SCALBN):
CASE_FLT_FN (BUILT_IN_SCALBLN):
return fold_builtin_load_exponent (loc, arg0, arg1,
type, /*ldexp=*/false);
return fold_const_builtin_load_exponent (arg0, arg1, type,
/*ldexp=*/false);
CASE_FLT_FN (BUILT_IN_FREXP):
return fold_builtin_frexp (loc, arg0, arg1, type);
......
......@@ -105,6 +105,9 @@ DEFINE_MATH_FN (NEARBYINT)
DEFINE_MATH_FN (SIGNBIT)
DEFINE_MATH_FN (FMIN)
DEFINE_MATH_FN (FMAX)
DEFINE_MATH_FN (LDEXP)
DEFINE_MATH_FN (SCALBN)
DEFINE_MATH_FN (SCALBLN)
DEFINE_INT_AND_FLOAT_ROUND_FN (FLOOR)
DEFINE_INT_AND_FLOAT_ROUND_FN (CEIL)
......@@ -2598,6 +2601,21 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
(COPYSIGN @0 tree_expr_nonnegative_p@1)
(abs @0))
(for scale (LDEXP SCALBN SCALBLN)
/* ldexp(0, x) -> 0. */
(simplify
(scale real_zerop@0 @1)
@0)
/* ldexp(x, 0) -> x. */
(simplify
(scale @0 integer_zerop@1)
@0)
/* ldexp(x, y) -> x if x is +-Inf or NaN. */
(simplify
(scale REAL_CST@0 @1)
(if (!real_isfinite (TREE_REAL_CST_PTR (@0)))
@0)))
/* Canonicalization of sequences of math builtins. These rules represent
IL simplifications but are not necessarily optimizations.
......
2015-10-27 Richard Sandiford <richard.sandiford@arm.com>
* gcc.dg/torture/builtin-ldexp-1.c: Skip at -O9,
2015-10-27 Richard Sandiford <richard.sandiford@arm.com>
PR tree-optimization/68097
* gcc.dg/torture/builtin-nonneg-1.c: Skip at -O0. Add
--param max-ssa-name-query-depth=3 to dg-options.
......
......@@ -7,6 +7,7 @@
/* { dg-do link } */
/* { dg-options "-fno-finite-math-only" { target sh*-*-* } } */
/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */
extern void link_error(int);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment