On Mon, Dec 19, 2022 at 9:12 AM Kewen.Lin <li...@linux.ibm.com> wrote:
>
> Hi,
>
> In function fold_convert_const_real_from_real, when the modes of
> two types involved in fp conversion are the same, we can simply
> take it as copy, rebuild with the exactly same TREE_REAL_CST and
> the target type.  It is more efficient and helps to avoid possible
> unexpected signalling bit clearing in [1].
>
> Bootstrapped and regtested on x86_64-redhat-linux, aarch64-linux-gnu
> and powerpc64{,le}-linux-gnu.
>
> Is it ok for trunk?

But shouldn't

double x = (double) __builtin_nans("sNAN");

result in a quiet NaN?

> [1] https://gcc.gnu.org/pipermail/gcc-patches/2022-December/608533.html
>
> gcc/ChangeLog:
>
>         * fold-const.cc (fold_convert_const_real_from_real): Treat floating
>         point conversion to a type with same mode as copy instead of normal
>         convertFormat.
> ---
>  gcc/fold-const.cc | 9 +++++++++
>  1 file changed, 9 insertions(+)
>
> diff --git a/gcc/fold-const.cc b/gcc/fold-const.cc
> index 114258fa182..eb4b6ca8820 100644
> --- a/gcc/fold-const.cc
> +++ b/gcc/fold-const.cc
> @@ -2178,6 +2178,15 @@ fold_convert_const_real_from_real (tree type, 
> const_tree arg1)
>    REAL_VALUE_TYPE value;
>    tree t;
>
> +  /* If the underlying modes are the same, simply treat it as
> +     copy and rebuild with TREE_REAL_CST information and the
> +     given type.  */
> +  if (TYPE_MODE (type) == TYPE_MODE (TREE_TYPE (arg1)))
> +    {
> +      t = build_real (type, TREE_REAL_CST (arg1));
> +      return t;
> +    }
> +
>    /* Don't perform the operation if flag_signaling_nans is on
>       and the operand is a signaling NaN.  */
>    if (HONOR_SNANS (arg1)
> --
> 2.27.0

Reply via email to