Hi everyone,
I’ve been exploring clang’s fp-contract behavior recently, and I see that when ‘-ffp-contract=fast’ is used it can’t be overridden with a pragma. I would have regarded this as a bug (and in fact, a bug has been filed https://bugs.llvm.org/show_bug.cgi?id=39679). However, I’ve found some discussions on the mailing lists that described this as expected behavior.
Last October, Sam Liu added support for a new setting (‘fp-contract=fast-honor-pragmas’) and updated the clang documentation to reflect the behavior of fp-contract=fast. See https://reviews.llvm.org/D90174. I feel very strongly that this should have been done the other way around -- fp-contract=fast should honor pragmas and if we need an option that doesn’t that could be added.
In the above review, John McCall asked what “other compilers” do. Steve Canon showed that GCC doesn’t honor the pragma. If I may humbly offer another “other compiler”, ICC (which doesn’t distinguish between ‘on’ and ‘fast’ for fp-contract) does respect the pragma (https://godbolt.org/z/x5r9WdYb4). I’m not saying that ICC should be treated as a reference implementation over GCC or anything like that, but I am saying that its behavior strikes me as more correct than what GCC or clang currently do.
Thoughts and opinions?
Thanks,
Andy
I don’t disagree with you in the abstract, but we consider this a GCC-designed feature.  ICC’s value as contrary precedent appears especially weak because, as you point out, they don’t really implement -ffp-contract=fast.
There are plenty of other GCC-designed things that I don’t particularly like the design of, but where we nonetheless consider ourselves bound by their behavior.
John.
Hi John,
Let me be clarify that ICC-compatibility isn’t my goal here. We can do that out-of-tree for Intel compilers based on LLVM.
My motivation is a problem I’m working on with the LLVM test suite. The Polybench benchmarks in the test are currently attempting to use ‘#pragma STDC FP_CONTRACT OFF’ to create a value-safe kernel whose results can be compared against an otherwise identical kernel that is compiled with whatever options the test suite is configured to use. This strategy fails if the test suite is configured to compile with ‘-ffp-contract=fast’. That’s the problem I’m trying to solve by having clang respect the pragma.
See https://reviews.llvm.org/D25346, https://reviews.llvm.org/D102861, and https://reviews.llvm.org/D104935.
Thanks,
Andy
It seems awkward to me that we have a command-line switch that overrides source code to this extent. Typically our command-line arguments cause us to change ‘defaults’, rarely do they cause us to ignore the source code. IMO, there is a bit of a natural ‘order’ to where how an option like this should be specified, that is, code overrides command line overrides default.
At bare minimum, having a pragma like this that is supported, but just ignored in this case needs to have some level of diagnostic. Silently ignoring a developer’s preference is the worst thing we can do.
From: Steve (Numerics) Canon <sca...@apple.com> 
Sent: Wednesday, June 30, 2021 10:20 AM
To: Kaylor, Andrew <andrew...@intel.com>
Cc: John McCall <rjmc...@apple.com>; llvm...@lists.llvm.org; cfe...@lists.llvm.org; Yaxun Liu <yaxu...@amd.com>; Keane, Erich <erich...@intel.com>; Blower, Melanie I <melanie...@intel.com>; Sanjay Patel <spa...@rotateright.com>; Renato Golin
 <reng...@gmail.com>; Hal Finkel <hal.fin...@gmail.com>; gui...@berkeley.edu; ueno.m...@jp.fujitsu.com; Matthew....@amd.com
Subject: Re: fp-contract=fast and pragmas
It sounds to me like this test is simply incompatible with fp-contract=fast and should not be used in that mode.
I personally am not/have nothing to do with it, but I don’t doubt Intel is doing something like that.
The difference is that the flag alters the ‘default’ semantics. Here, the #pragma ALSO attempts to alter the ‘default’ semantics explicitly, but is ignored.
_______________________________________________
LLVM Developers mailing list
llvm...@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
I would also expect/hope fast-math to work the same way.
As far as GCC compat, I know we play a little fast/loose with it in other cases, but I can definitely see the danger here. To me, this feels like “GCC made a bad choice, so we are sticking ourselves with it”.
Yes, deliberately, because that’s the apparently-intended interaction 
by the compiler that introduced those two features.  Go convince the GCC 
developers that they’re wrong about their feature, and then I’ll 
happily sign off on changing Clang’s behavior to match.  Otherwise you 
might as well be arguing that the “pure” and “const” attributes 
are backwards.
John.
>
> From: Steve (Numerics) Canon <sca...@apple.com>
> Sent: Wednesday, June 30, 2021 10:34 AM
> To: Keane, Erich <erich...@intel.com>
> Cc: Kaylor, Andrew <andrew...@intel.com>; John McCall 
> <rjmc...@apple.com>; llvm...@lists.llvm.org; cfe...@lists.llvm.org; 
> Yaxun Liu <yaxu...@amd.com>; Blower, Melanie I 
> <melanie...@intel.com>; Sanjay Patel <spa...@rotateright.com>; 
> Renato Golin <reng...@gmail.com>; Hal Finkel 
> <hal.fin...@gmail.com>; gui...@berkeley.edu; 
> ueno.m...@jp.fujitsu.com; Matthew....@amd.com
> Subject: Re: fp-contract=fast and pragmas
>
> Aren’t you all (Intel) the ones promoting -f(no-)protect-parens, 
> which is a command line flag that overrides source code semantics in 
> _exactly_ the same manner?
>
>
> – Steve
>
>
>
> On Jun 30, 2021, at 1:30 PM, Keane, Erich 
> <erich...@intel.com<mailto:erich...@intel.com>> wrote:
>
> It seems awkward to me that we have a command-line switch that 
> overrides source code to this extent.  Typically our command-line 
> arguments cause us to change ‘defaults’, rarely do they cause us 
> to ignore the source code.  IMO, there is a bit of a natural 
> ‘order’ to where how an option like this should be specified, that 
> is, code overrides command line overrides default.
>
> At bare minimum, having a pragma like this that is supported, but just 
> ignored in this case needs to have some level of diagnostic.  Silently 
> ignoring a developer’s preference is the worst thing we can do.
>
> From: Steve (Numerics) Canon 
> <sca...@apple.com<mailto:sca...@apple.com>>
> Sent: Wednesday, June 30, 2021 10:20 AM
> To: Kaylor, Andrew 
> <andrew...@intel.com<mailto:andrew...@intel.com>>
> Cc: John McCall <rjmc...@apple.com<mailto:rjmc...@apple.com>>; 
> llvm...@lists.llvm.org<mailto:llvm...@lists.llvm.org>; 
> cfe...@lists.llvm.org<mailto:cfe...@lists.llvm.org>; Yaxun Liu 
> <yaxu...@amd.com<mailto:yaxu...@amd.com>>; Keane, Erich 
> <erich...@intel.com<mailto:erich...@intel.com>>; Blower, Melanie 
> I <melanie...@intel.com<mailto:melanie...@intel.com>>; Sanjay 
> Patel <spa...@rotateright.com<mailto:spa...@rotateright.com>>; Renato 
> Golin <reng...@gmail.com<mailto:reng...@gmail.com>>; Hal Finkel 
> <hal.fin...@gmail.com<mailto:hal.fin...@gmail.com>>; 
> gui...@berkeley.edu<mailto:gui...@berkeley.edu>; 
> ueno.m...@jp.fujitsu.com<mailto:ueno.m...@jp.fujitsu.com>; 
> Matthew....@amd.com<mailto:Matthew....@amd.com>
> Subject: Re: fp-contract=fast and pragmas
>
> It sounds to me like this test is simply incompatible with 
> fp-contract=fast and should not be used in that mode.
>
> – Steve
>
>
>
> On Jun 30, 2021, at 11:14 AM, Kaylor, Andrew 
> <andrew...@intel.com<mailto:andrew...@intel.com>> wrote:
>
> Hi John,
>
> Let me be clarify that ICC-compatibility isn’t my goal here. We can 
> do that out-of-tree for Intel compilers based on LLVM.
>
> My motivation is a problem I’m working on with the LLVM test suite. 
> The Polybench benchmarks in the test are currently attempting to use 
> ‘#pragma STDC FP_CONTRACT OFF’ to create a value-safe kernel whose 
> results can be compared against an otherwise identical kernel that is 
> compiled with whatever options the test suite is configured to use. 
> This strategy fails if the test suite is configured to compile with 
> ‘-ffp-contract=fast’. That’s the problem I’m trying to solve 
> by having clang respect the pragma.
>
> See https://reviews.llvm.org/D25346, https://reviews.llvm.org/D102861, 
> and https://reviews.llvm.org/D104935.