Hi,

Gentle ping this:

https://gcc.gnu.org/pipermail/gcc-patches/2023-December/639140.html

BR,
Kewen

on 2023/12/4 17:49, Kewen.Lin wrote:
> Hi,
> 
> As PR112788 shows, on rs6000 with -mabi=ieeelongdouble type _Float128
> has the different type precision (128) from that (127) of type long
> double, but actually they has the same underlying mode, so they have
> the same precision as the mode indicates the same real type format
> ieee_quad_format.
> 
> It's not sensible to have such two types which have the same mode but
> different type precisions, some fix attempt was posted at [1].
> As the discussion there, there are some historical reasons and
> practical issues.  Considering we passed stage 1 and it also affected
> the build as reported, this patch is trying to temporarily workaround
> it.  I thought to introduce a hookpod but that seems a bit overkill,
> assuming scalar float type with the same mode should have the same
> precision looks sensible.
> 
> Bootstrapped and regtested on powerpc64-linux-gnu P7/P8/P9 and
> powerpc64le-linux-gnu P9/P10.
> 
> Is it ok for trunk?
> 
> [1] 
> https://inbox.sourceware.org/gcc-patches/718677e7-614d-7977-312d-05a75e1fd...@linux.ibm.com/
> 
> BR,
> Kewen
> ----
>       PR tree-optimization/112788
> 
> gcc/ChangeLog:
> 
>       * value-range.h (range_compatible_p): Workaround same type mode but
>       different type precision issue for rs6000 scalar float types
>       _Float128 and long double.
> ---
>  gcc/value-range.h | 10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/gcc/value-range.h b/gcc/value-range.h
> index 33f204a7171..d0a84754a10 100644
> --- a/gcc/value-range.h
> +++ b/gcc/value-range.h
> @@ -1558,7 +1558,13 @@ range_compatible_p (tree type1, tree type2)
>    // types_compatible_p requires conversion in both directions to be useless.
>    // GIMPLE only requires a cast one way in order to be compatible.
>    // Ranges really only need the sign and precision to be the same.
> -  return (TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
> -       && TYPE_SIGN (type1) == TYPE_SIGN (type2));
> +  return TYPE_SIGN (type1) == TYPE_SIGN (type2)
> +      && (TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
> +          // FIXME: As PR112788 shows, for now on rs6000 _Float128 has
> +          // type precision 128 while long double has type precision 127
> +          // but both have the same mode so their precision is actually
> +          // the same, workaround it temporarily.
> +          || (SCALAR_FLOAT_TYPE_P (type1)
> +              && TYPE_MODE (type1) == TYPE_MODE (type2)));
>  }
>  #endif // GCC_VALUE_RANGE_H
> --
> 2.42.0
>

Reply via email to