patch to bug #86829

Jeff Law law@redhat.com
Thu Oct 4 07:40:00 GMT 2018


On 8/22/18 6:02 AM, Richard Biener wrote:
> On Tue, Aug 21, 2018 at 11:27 PM Jeff Law <law@redhat.com> wrote:
>>
>> On 08/21/2018 02:08 PM, Giuliano Augusto Faulin Belinassi wrote:
>>>> Just as an example, compare the results for
>>>> x = 0x1.fffffffffffffp1023
>>>
>>> Thank you for your answer and the counterexample. :-)
>>>
>>>> If we had useful range info on floats we might conditionalize such
>>>> transforms appropriately.  Or we can enable it on floats and do
>>>> the sqrt (x*x + 1) in double.
>>>
>>> I think I managed to find a bound were the transformation can be done
>>> without overflow harm, however I don't know about rounding problems,
>>> however
>>>
>>> Suppose we are handling double precision floats for now. The function
>>> x/sqrt(1 + x*x) approaches 1 when x is big enough. How big must be x
>>> for the function be 1?
>>>
>>> Since sqrt(1 + x*x) > x when x > 1, then we must find a value to x
>>> that x/sqrt(1 + x*x) < eps, where eps is the biggest double smaller
>>> than 1. Such eps must be around 1 - 2^-53 in ieee double because the
>>> mantissa has 52 bits. Solving for x yields that x must be somewhat
>>> bigger than 6.7e7, so let's take 1e8. Therefore if abs(x) > 1e8, it is
>>> enough to return copysign(1, x). Notice that this arguments is also
>>> valid for x = +-inf (if target supports that) because sin(atan(+-inf))
>>> = +-1, and it can be extended to other floating point formats.The
>>> following test code illustrates my point:
>>> https://pastebin.com/M4G4neLQ
>>>
>>> This might still be faster than calculating sin(atan(x)) explicitly.
>>>
>>> Please let me know if this is unfeasible. :-)
>> The problem is our VRP implementation doesn't handle any floating point
>> types at this time.   If we had range information for FP types, then
>> this kind of analysis is precisely what we'd need to do the
>> transformation regardless of -ffast-math.
> 
> I think his idea was to emit a runtime test?  You'd have to use a
> COND_EXPR and evaluate both arms at the same time because
> match.pd doesn't allow you to create control flow.
Right.  That's what his subsequent patch does.  Can you take a peek at
the match.pd part

> 
> Note the rounding issue is also real given for large x you strip
> away lower mantissa bits when computing x*x.
Does that happen for values less than 1e8?

Jeff



More information about the Gcc-patches mailing list