On Mon, Oct 26, 2015 at 10:38 AM, Richard Sandiford
<[email protected]> 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_hypot): Delete.
> (fold_builtin_2): Handle constant hypot arguments here.
> * match.pd: Fold hypot(x, 0) and hypot(0, x) to x. Canonicalize
> hypot(x, x) to fabs(x)*sqrt(2).
>
> diff --git a/gcc/builtins.c b/gcc/builtins.c
> index f947f1e..64106a1 100644
> --- a/gcc/builtins.c
> +++ b/gcc/builtins.c
> @@ -7475,39 +7475,6 @@ fold_builtin_bswap (tree fndecl, tree arg)
> return NULL_TREE;
> }
>
> -/* Fold a builtin function call to hypot, hypotf, or hypotl. Return
> - NULL_TREE if no simplification can be made. */
> -
> -static tree
> -fold_builtin_hypot (location_t loc, tree arg0, tree arg1, tree type)
> -{
> - tree res;
> -
> - if (!validate_arg (arg0, REAL_TYPE)
> - || !validate_arg (arg1, REAL_TYPE))
> - return NULL_TREE;
> -
> - /* Calculate the result when the argument is a constant. */
> - if ((res = do_mpfr_arg2 (arg0, arg1, type, mpfr_hypot)))
> - return res;
> -
> - /* If either argument is zero, hypot is fabs of the other. */
> - if (real_zerop (arg0))
> - return fold_build1_loc (loc, ABS_EXPR, type, arg1);
> - else if (real_zerop (arg1))
> - return fold_build1_loc (loc, ABS_EXPR, type, arg0);
> -
> - /* hypot(x,x) -> fabs(x)*sqrt(2). */
> - if (flag_unsafe_math_optimizations
> - && operand_equal_p (arg0, arg1, OEP_PURE_SAME))
> - return fold_build2_loc (loc, MULT_EXPR, type,
> - fold_build1_loc (loc, ABS_EXPR, type, arg0),
> - build_real_truncate (type, dconst_sqrt2 ()));
> -
> - return NULL_TREE;
> -}
> -
> -
> /* Fold a builtin function call to pow, powf, or powl. Return
> NULL_TREE if no simplification can be made. */
> static tree
> @@ -9456,7 +9423,10 @@ fold_builtin_2 (location_t loc, tree fndecl, tree
> arg0, tree arg1)
> break;
>
> CASE_FLT_FN (BUILT_IN_HYPOT):
> - return fold_builtin_hypot (loc, arg0, arg1, type);
> + if (validate_arg (arg0, REAL_TYPE)
> + && validate_arg (arg1, REAL_TYPE))
> + return do_mpfr_arg2 (arg0, arg1, type, mpfr_hypot);
> + break;
>
> CASE_FLT_FN (BUILT_IN_CPOW):
> if (validate_arg (arg0, COMPLEX_TYPE)
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 00c6e7c..8cd55f6 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -2520,6 +2520,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> (RINT integer_valued_real_p@0)
> @0))
>
> +/* hypot(x,0) and hypot(0,x) -> abs(x). */
> +(simplify
> + (hypot:c @0 real_zerop@1)
> + (abs @0))
> +
> /* Canonicalization of sequences of math builtins. These rules represent
> IL simplifications but are not necessarily optimizations.
>
> @@ -2618,6 +2623,11 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
> (CABS (complex @0 @0))
> (mult (abs @0) { build_real_truncate (type, dconst_sqrt2 ()); }))
>
> + /* hypot(x,x) -> fabs(x)*sqrt(2). */
> + (simplify
> + (HYPOT @0 @0)
> + (mult (abs @0) { build_real_truncate (type, dconst_sqrt2 ()); }))
> +
> /* cexp(x+yi) -> exp(x)*cexpi(y). */
> (for cexps (CEXP)
> exps (EXP)
>