On 11/15/2017 08:36 AM, Wilco Dijkstra wrote:
> Richard Biener wrote:
>> On Tue, Oct 17, 2017 at 6:28 PM, Wilco Dijkstra <[email protected]>
>> wrote:
>
>>> +(if (flag_unsafe_math_optimizations)
>>> + /* Simplify (C / x op 0.0) to x op 0.0 for C > 0. */
>>> + (for op (lt le gt ge)
>>> + neg_op (gt ge lt le)
>>> + (simplify
>>> + (op (rdiv REAL_CST@0 @1) real_zerop@2)
>>> + (switch
>>> + (if (real_less (&dconst0, TREE_REAL_CST_PTR (@0)))
>>
>> Note that real_less (0., +Inf) so I think you either need to check C is
>> 'normal'
>> or ! HONOR_INFINITIES.
>
> Yes, it was missing an explicit check for infinity, now added.
>
>> There's also the underflow issue I guess this is what
>> -funsafe-math-optimizations
>> is for. I think ignoring underflows is dangerous though.
>
> We could change C / x > 0 to x >= 0 so the underflow case is included.
> However that still means x == 0.0 would behave differently - so the question
> is
> what exactly does -funsafe-math-optimization allow?
Well, we largely define what it means. I believe we have in the past
stated that it can't break SPEC. It's as good a rule as anything,
though it is underspecified (what version, what other flags, what
targets, etc).
With that bit of background, I believe that -funsafe-math-optimizations
has been allowed to inhibit or introduce underflows (reassociation in
particular I think does this and is enabled by
-funsafe-math-optimizations). So I don't think ignoring underflow
should inherently block this patch.
>
>
>>> + (for cmp (lt le gt ge)
>>> + neg_cmp (gt ge lt le)
>>> + /* Simplify (x * C1) cmp C2 -> x cmp (C2 / C1), where C1 != 0. */
>>> + (simplify
>>> + (cmp (mult @0 REAL_CST@1) REAL_CST@2)
>>> + (with
>>> + { tree tem = const_binop (RDIV_EXPR, type, @2, @1); }
>>> + (if (tem)
>>> + (switch
>>> + (if (real_less (&dconst0, TREE_REAL_CST_PTR (@1)))
>>> + (cmp @0 { tem; }))
>>> + (if (real_less (TREE_REAL_CST_PTR (@1), &dconst0))
>>> + (neg_cmp @0 { tem; })))))))
>>
>>
>> Drops possible overflow/underflow in x * C1 and may create underflow
>> or overflow with C2/C1 which you should detect here at least.
>
> I've added checks for this, however I thought -funsafe-math-optimizations is
> allowed to insert/remove underflow/overflow, like in these cases:
>
> (x * 1e20f) * 1e20f and (x * 1e40f) * 1e-30f.
Right. That's my understanding as well.
>
>> Existing overflows may be guarded against with a HONOR_INFINITIES check.
>
> Not sure what you mean with this?
>
>> When overflow/underflow can be disregarded is there any reason remaining to
>> make this guarded by flag_unsafe_math_optimizations? Are there any cases
>> where rounding issues can flip the comparison result?
>
> I think it needs to remain under -funsafe-math-optimizations. Here is the
> updated
> version:
Richi has taken the lead on this review and should probably own it.
Just thought it was worth chiming in on the underflow issue.
jeff