[llvm-dev] Question on fast-math optimizations

Heiko Becker via llvm-dev llvm-dev at lists.llvm.org
Thu Nov 22 02:16:30 PST 2018


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.)


Thanks Nicolai and Steve for the initial reply.

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


>
> 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
>>
>


More information about the llvm-dev mailing list