> On Mar 16, 2023, at 12:31 PM, Andrew Pinski <pins...@gmail.com> wrote: > > 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.
Okay. > >> >> 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. So, what’s the major reason we keep the default that is not IEEE754 compliant from the beginning? thanks. Qing > > Thanks, > Andrew Pinski > >> >> Thanks. >> >> Qing