On Fri, Jul 7, 2017 at 11:51 PM, Joseph Myers <jos...@codesourcery.com> wrote:
> On Fri, 7 Jul 2017, Yuri Gribov wrote:
>
>> > I suspect infinities would already work with the patch as-is (the logic
>> > dealing with constants outside the range of the integer type).  I'm less
>> > clear that NaNs would work properly.  (If the comparison is == or != you
>> > can optimize it for quiet NaNs, to false and true respectively.  If it's a
>> > signaling NaN, or < <= > >=, optimizing to false is only valid with
>> > -fno-trapping-math, as it would lose an "invalid" exception.)
>>
>> It's actually under -fsignaling-nans (which if off by default). I've
>
> No, ordered comparisons with qNaNs should result in exceptions,

I assume you mean sNaNs.

> so it's not valid by default to optimize them to false (whereas it is valid 
> for
> equality comparisons, as those only raise exceptions for signaling NaNs).

I'm afraid this is default GCC behavior atm - e.g. check existing
   /* a CMP (-0) -> a CMP 0  */
   ...
   (if (REAL_VALUE_ISNAN (TREE_REAL_CST (@1))
        && ! HONOR_SNANS (@1))
    { constant_boolean_node (cmp == NE_EXPR, type); })
(this pattern causes testcase in my patch pr53731-5.c to be optimized).

Or documentation for -fsignaling-nans which says that "the default is
-fno-signaling-nans" and it "may change the number of exceptions
visible with signaling NaNs".

In any case, decision to optimize sNaNs is done in HONOR_NANS macro
which my code duly checks so I'm not really sure what else needs to be
done about discussed patch in this regards.

-Y

Reply via email to