Yuri Gribov <tetra2...@gmail.com> writes:
> Hi all,
>
> This is a second iteration of patch which gets rid of float casts in
> comparisons when all values of casted integral type are exactly
> representable by the float type
> (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81376). The new version
> addresses Richard's review
> (https://gcc.gnu.org/ml/gcc-patches/2017-10/msg00481.html).
>
> Bootstrapped and regtested on x64_64. Ok to commit?
>
> -Y
>
> From 1ea62f7bf4394142e0c473a69de8a0e9b1718a69 Mon Sep 17 00:00:00 2001
> From: Yury Gribov <tetra2...@gmail.com>
> Date: Fri, 29 Sep 2017 07:34:54 +0200
> Subject: [PATCH] Add pattern to remove useless float casts in comparison.
>
> 2018-02-17  Yury Gribov  <tetra2...@gmail.com>
>
>       PR middle-end/81376
>
> gcc/
>       * real.c (format_helper::can_represent_integral_type_p): New function
>       * real.h (format_helper::can_represent_integral_type_p): Ditto.
>       * match.pd: New pattern.
>
> gcc/testsuite/
>       * c-c++-common/pr81376.c: New test.
> ---
>  gcc/match.pd                         | 30 ++++++++++++++++++++-------
>  gcc/real.c                           | 13 ++++++++++++
>  gcc/real.h                           |  1 +
>  gcc/testsuite/c-c++-common/pr81376.c | 39 
> ++++++++++++++++++++++++++++++++++++
>  4 files changed, 76 insertions(+), 7 deletions(-)
>  create mode 100644 gcc/testsuite/c-c++-common/pr81376.c
>
> diff --git a/gcc/match.pd b/gcc/match.pd
> index 4452b58..33a5f36 100644
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -3252,6 +3252,27 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>        (if (! HONOR_NANS (@0))
>       (cmp @0 @1))))))
>  
> +/* Optimize various special cases of (FTYPE) N CMP (FTYPE) M.  */
> +(for cmp (tcc_comparison)
> + (simplify
> +  (cmp (float@0 @1) (float @2))
> +   (if (SCALAR_FLOAT_TYPE_P (TREE_TYPE (@0))
> +     && ! DECIMAL_FLOAT_TYPE_P (TREE_TYPE (@0)))
> +    (with
> +     {
> +       format_helper fmt (REAL_MODE_FORMAT (TYPE_MODE (TREE_TYPE (@0))));
> +       tree type1 = TREE_TYPE (@1);
> +       tree type2 = TREE_TYPE (@2);
> +     }
> +     (if (fmt.can_represent_integral_type_p (type1)
> +       && fmt.can_represent_integral_type_p (type2))
> +      (if (TYPE_PRECISION (type1) > TYPE_PRECISION (type2))
> +       (cmp @1 (convert @2))
> +       (if (TYPE_PRECISION (type1) < TYPE_PRECISION (type2))
> +        (cmp (convert:type2 @1) @2)
> +        (if (TYPE_SIGN (type1) == TYPE_SIGN (type2))
> +      (cmp @1 @2)))))))))

I think this would mishandle combinations in which the wider type
is unsigned and the narrower type is signed, like @1:short @2:unsigned int.

Thanks,
Richard

Reply via email to