On Thu, Mar 16, 2023 at 9:25 AM Qing Zhao via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> Hi,
>
> Recently, we discovered some floating point precision diffs when using GCC8 
> to build our
> application on arm64: After some investigation, it turns out that this is due 
> to the
> -ffp-contract=fast option that is on by default. Therefore, we have to 
> explicitly add
> -ffp-contract=off and do a full-rebuild.
>
> GCC by default turns -ffp-contract=fast on.
> https://gcc.gnu.org/onlinedocs/gcc-8.5.0/gcc/Optimize-Options.html#Optimize-Options
> https://gcc.gnu.org/onlinedocs/gcc-12.2.0/gcc/Optimize-Options.html#Optimize-Options
>
> "
> -ffp-contract=style
> -ffp-contract=off disables floating-point expression contraction. 
> -ffp-contract=fast enables
> floating-point expression contraction such as forming of fused multiply-add 
> operations if
> the target has native support for them. -ffp-contract=on enables 
> floating-point expression
> contraction if allowed by the language standard. This is currently not 
> implemented and
> treated equal to -ffp-contract=off.
>
> The default is -ffp-contract=fast.
> "
>
> This can be shown by a small example for arm64 with gcc8.5 in 
> https://godbolt.org/z/MxYfnG8TE.
> Only when adding -std=c89 explicitly, this transformaton is off.
>
> another exmaple also shows that Clang and MSVC only allow this transformation 
> when speifiying
> ffast-math and fp:fast:  https://godbolt.org/z/o54bYfPbP
>
> When searching online, we found that there were similar discussions recently 
> on the exact same issue:
> https://github.com/dotnet/runtime/issues/64604
> https://github.com/dotnet/runtime/issues/64591
>
> a summary of these discussions is:
>
> 1. "fmadd" is a fused operation and will return a different result for many 
> inputs;
> 2. therefore, -ffp-contract=fast is not a safe optimization to be on by 
> default;
> 3. Clang and MSVC only allow this when specifying ffast-math and fp:fast 
> since this is not an
>   IEEE754 compliant optimization;
> 4. The reasons why GCC turns on this option by default are:
>   A. GNU C language spec allows such transformation.
>   B. this did not expose real problem for most X86/X64 apps previously since 
> FMA instructions
>      didn't exist until 2013 when the FMA3 instruction set was added, and 
> also these instructions
>      were not always available..
> 5. Arm64 has fused multiply-add instructions as "baseline" and are always 
> available. therefore
>   -ffp-contract=fast exposed more serious problems on Arm64 platforms.

This summary ignores x87 and even ignores PowerPC in GCC having FMA
even before clang/LLVM was around.

>
> our major question:
>
> Should GCC turn off -ffp-contract=fast by default since it's not IEEE754 
> compliant and more
>   modern processors have the FMA instructions available by default?


NO. We have this debate every few years and such.

Thanks,
Andrew Pinski

>
> Thanks.
>
> Qing

Reply via email to