Re: FP fetch_add and "ignoring FP environment" attribute

Matthew Malcomson <[email protected]> Mon, 3 Aug 2026 11:23:48 +0100
Newsgroups gmane.comp.gcc.patches
Message-ID <[email protected]>
Ah, thanks!

So to make sure I understand correctly, this means:
1) My concern about `-fno-trapping-math` is not a problem.
    (Will need to update the documentation but can use this).
2) `-fno-rounding-math` is indeed not enough for these new methods.
3) The default behaviour is enough to not worry about NaN semantics.

and hence the extra fast-math flag that we'd need is *only* something 
like `-funpecified-rounding` allowing any rounding that the 
implementation chooses.

Would it be reasonable to put a new flag like this into the 
`-ffast-math` flags?  Considering that it's an even more relaxed version 
of `-fno-rounding-math` so they kind of conflict?

I'd like to include enough in `-ffast-math` that the pattern-matching 
has a chance of matching standard code, but it's not hugely important so 
I'm OK if that relaxation of the semantics is not desirable.

On 7/31/26 22:41, Joseph Myers wrote:
> External email: Use caution opening links or attachments
> 
> 
> On Thu, 16 Jul 2026, Matthew Malcomson wrote:
> 
>> 1) -fno-trapping-math says that invalid operations do not generate
>>     runtime exceptions. This is necessary, but says nothing about
>>     allowing us to skip setting status flags in the FP environment.
>>     - Hence doesn't seem to give us everything we need.
> 
> I think -fno-trapping-math is misnamed - it's about exception flags just
> as much as it's about traps.
> 
>> 2) -fno-rounding-math allows optimisations that assume round-to-nearest.
>>     This seems to not be sufficient for the fetch_add semantics.
>>     libstdc++ FP atomics semantics say can act as if in different FP
>>     environment, which I would expect means a hardware implementation can
>>     choose whatever FP rounding mode (doesn't have to be the default
>>     one).
> 
> Indeed, -fno-rounding-math isn't supposed to allow random other rounding
> modes, just round-to-nearest.
> 
>> 3) No -ffast-math flag mentions anything about what NaN is generated --
>>     These methods need to allow choosing something different, and the
>>     AArch64 implementation actually does change what kind of NaN's are
>>     produced.
> 
> The only property of the NaN produced that's ever significant is whether
> it's a quiet or signaling NaN; at the language level, nothing is defined
> about the sign or payload of a NaN.
> 
> Given -fsignaling-nans (not the default), code should produce quiet or
> signaling NaNs according to language semantics.
> 
> By default, without -fsignaling-nans, code with only quiet NaN inputs
> should only produce quiet NaN outputs, but operations with a signaling NaN
> input might sometimes return that NaN (or its negation or a version with
> different payload) when the proper semantics would return a quiet NaN,
> because optimizations are applied (such as 1.0 * x -> x) that aren't valid
> for signaling NaNs.
> 
> --
> Joseph S. Myers
> [email protected]
>