On Mon, Oct 26, 2015 at 11:08 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_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, > > diff --git a/gcc/builtins.c b/gcc/builtins.c > index 260b66d..248c009 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 f2e7d64..b15f42f 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) > @@ -2580,6 +2583,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/gcc.dg/torture/builtin-ldexp-1.c > b/gcc/testsuite/gcc.dg/torture/builtin-ldexp-1.c > index 94560a8..6412274 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); > >