From 86c0733fed7007dd41efe7739c8295e9933e7f98 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Tue, 27 Oct 2015 12:00:34 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 8 ++++++++ gcc/builtins.c | 20 ++++++------------- gcc/match.pd | 18 +++++++++++++++++ gcc/testsuite/ChangeLog | 4 ++++ .../gcc.dg/torture/builtin-ldexp-1.c | 1 + 5 files changed, 37 insertions(+), 14 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8711203c3d7..8880e994361 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2015-10-27 Richard Sandiford + + * 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 * builtins.c (fold_builtin_logb): Rename to... diff --git a/gcc/builtins.c b/gcc/builtins.c index 260b66d7810..248c00997c5 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -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); diff --git a/gcc/match.pd b/gcc/match.pd index 73090066d3a..1d6dde19f47 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -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. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 355059c09e1..5a99607884f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-10-27 Richard Sandiford + + * gcc.dg/torture/builtin-ldexp-1.c: Skip at -O9, + 2015-10-27 Richard Sandiford PR tree-optimization/68097 diff --git a/gcc/testsuite/gcc.dg/torture/builtin-ldexp-1.c b/gcc/testsuite/gcc.dg/torture/builtin-ldexp-1.c index 94560a8abb4..64122747570 100644 --- a/gcc/testsuite/gcc.dg/torture/builtin-ldexp-1.c +++ b/gcc/testsuite/gcc.dg/torture/builtin-ldexp-1.c @@ -7,6 +7,7 @@ /* { dg-do link } */ /* { dg-options "-fno-finite-math-only" { target sh*-*-* } } */ +/* { dg-skip-if "" { *-*-* } { "-O0" } { "" } } */ extern void link_error(int); -- 2.30.2