[llvm-dev] Question on fast-math optimizations

Heiko Becker via llvm-dev llvm-dev at lists.llvm.org
Fri Nov 30 02:49:35 PST 2018


--Resending my last mail, as it might have gotten lost --

Thanks Nicolai and Steve for the initial replies.

So if I understand correctly there are 2 places you can pinpoint at 
where distributivity is used:

- simplification of infinity/NaN expressions

- combination with FMA introduction


@Steve: You mentioned "fast-math flags characterizing when it would be 
allowed" so is there a point of reference where it is exactly specified 
what fast-math flags allow and what not beyond the llvm documentation 
that gives the high-level explanation?


Thanks again,

Heiko

On 11/22/18 11:16 AM, Heiko Becker via llvm-dev wrote:
> On 11/21/18 12:41 PM, Nicolai Hähnle wrote:
>
>> On 20.11.18 16:38, Stephen Canon via llvm-dev wrote:
>>> Distribution doesn’t seem to be used by many transforms at present. 
>>> My vague recollection is that the fast math flags didn’t do a great 
>>> job of characterizing when it would be allowed, and using it 
>>> aggressively broke a lot of code in practice (code which was 
>>> numerical unstable already, but depended on getting the same 
>>> unstable results), so people have been gun-shy about using it. Owen 
>>> might remember more of the gory details.
>>>
>>> Arguably, it is implicitly used when FMA formation is combined with 
>>> fast-math, e.g.:
>>>
>>>     float foo(float x, float y) {
>>>       return x*(y + 1);
>>>     }
>>>
>>> Compiled with -mfma -ffast-math, this generates fma(x, y, x). Even 
>>> though this transform superficially appears to use distributivity, 
>>> that’s somewhat debatable because the fma computes the whole result 
>>> without any intermediate rounding, so it’s pretty wishy-washy to say 
>>> that it’s been used here.
>>
>> It most definitely has been used here, because of inf/nan behavior.
>>
>> inf*(0 + 1) == inf
>> inf*0 + inf == nan
>>
>> (I actually fixed this bug in the past because it occurred in practice.)
>>
>> Cheers,
>> Nicolai
>>
>>
>>>
>>> – Steve
>>>
>>>> On Nov 20, 2018, at 9:21 AM, Heiko Becker via llvm-dev 
>>>> <llvm-dev at lists.llvm.org> wrote:
>>>>
>>>> Dear LLVM developers,
>>>>
>>>> I have a question on the fast-math floating-point optimizations 
>>>> applied by LLVM:
>>>> Judging by the documentation at 
>>>> https://llvm.org/docs/LangRef.html#fast-math-flags I understood 
>>>> that rewriting with associativity and using reciprocal computations 
>>>> are possible optimizations. As the folklore description of 
>>>> fast-math is that it "applies real-valued identities", I was 
>>>> wondering whether LLVM does also rewrite with distributivity.
>>>>
>>>> If this is the case, could you point me to some specification when 
>>>> it is applied? If not, is there any particular reason against 
>>>> applying distributivity or whether this just has not been looked 
>>>> into so far?
>>>>
>>>> Thank you and best regards,
>>>>
>>>> Heiko
>>>>
>>>> _______________________________________________
>>>> LLVM Developers mailing list
>>>> llvm-dev at lists.llvm.org
>>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>
>>> _______________________________________________
>>> LLVM Developers mailing list
>>> llvm-dev at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>>>
>>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev


More information about the llvm-dev mailing list