[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