On Thu, Nov 26, 2020 at 01:56:03PM -0000, Roger Sayle wrote:
> --- a/gcc/match.pd
> +++ b/gcc/match.pd
> @@ -3998,7 +3998,7 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
>      (cmp @0 { build_real (TREE_TYPE (@1), dconst0); }))
>     /* x != NaN is always true, other ops are always false.  */
>     (if (REAL_VALUE_ISNAN (TREE_REAL_CST (@1))
> -     && ! HONOR_SNANS (@1))
> +     && ! flag_trapping_math)

Shouldn't this one stay as is for cmp == EQ_EXPR || cmp == NE_EXPR?
I mean, == or != only raise exceptions on sNaNs, while other simple
comparisons raise on both sNaNs and qNaNs.

> --- a/gcc/simplify-rtx.c
> +++ b/gcc/simplify-rtx.c
> @@ -5732,12 +5732,13 @@ simplify_const_relational_operation (enum rtx_code 
> code,
>        if (REAL_VALUE_ISNAN (*d0) || REAL_VALUE_ISNAN (*d1))
>       switch (code)
>         {
> +       case NE:
> +         return flag_trapping_math ? 0 : const_true_rtx;

And here too (for NE and would need moving EQ later too.

>         case UNEQ:
>         case UNLT:
>         case UNGT:
>         case UNLE:
>         case UNGE:
> -       case NE:
>         case UNORDERED:
>           return const_true_rtx;
>         case EQ:
> @@ -5746,6 +5747,7 @@ simplify_const_relational_operation (enum rtx_code code,
>         case LE:
>         case GE:
>         case LTGT:
> +         return flag_trapping_math ? 0 : const0_rtx;
>         case ORDERED:
>           return const0_rtx;
>         default:


        Jakub

Reply via email to