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);
>
>

Reply via email to