[llvm-dev] RFC: Consider changing the semantics of 'fast' flag implying all fast-math-flags
Hal Finkel via llvm-dev
llvm-dev at lists.llvm.org
Tue Nov 15 23:59:45 PST 2016
----- Original Message -----
> From: "Mehdi Amini via llvm-dev" <llvm-dev at lists.llvm.org>
> To: "Warren Ristow" <warren.ristow at sony.com>
> Cc: llvm-dev at lists.llvm.org
> Sent: Tuesday, November 15, 2016 11:10:48 PM
> Subject: Re: [llvm-dev] RFC: Consider changing the semantics of
> 'fast' flag implying all fast-math-flags
> Hi,
> > On Nov 15, 2016, at 5:15 PM, Ristow, Warren via llvm-dev <
> > llvm-dev at lists.llvm.org > wrote:
>
> > Hi all,
>
> > This is about https://reviews.llvm.org/D26708
>
> > Currently when the command-line switch '-ffast-math' is specified,
> > the
>
> > IR-level fast-math-flag 'fast' gets attached to appropriate FP math
>
> > instructions. That flag acts as an "umbrella" to implicitly turn on
> > all the
>
> > other fast-math-flags ('nnan', 'ninf', 'nsz' and 'arcp'):
>
> > http://llvm.org/docs/LangRef.html#fast-math-flags
>
> > This approach has the shortcoming that when there is a desire to
> > disable one
>
> > of these fast-math-flags, if the 'fast' flag remains, it implicitly
>
> > re-enables the one being disabled. For example, compiling this
> > test-case:
>
> > extern void use(float x, float y);
>
> > void test(float a, float b, float c) {
>
> > float q1 = a / c;
>
> > float q2 = b / c;
>
> > use(q1, q2);
>
> > }
>
> > at '-O2 -ffast-math' does a reciprocal-transformation, so only one
> > division
>
> > is done (as desired with fast-math). Compiling it with:
>
> > -O2 -ffast-math -fno-reciprocal-math
>
> > should disable the reciprocal transformations (the flag 'arcp'),
> > but
> > leave
>
> > all the other fast-math transformations enabled. The current
> > implementation
>
> > doesn't do that, since the 'fast' IR-level flag still gets set.
>
> > Motivation of this discussion:
> > https://llvm.org/bugs/show_bug.cgi?id=27372#c2
>
> > As an aside, when '-ffast-math' is specified on the command-line,
> > the
>
> > following six switches are all passed to cc1:
>
> > -menable-no-infs
>
> > -menable-no-nans
>
> > -fno-signed-zeros
>
> > -freciprocal-math
>
> > -fno-trapping-math
>
> > -ffp-contract=fast
>
> > and '-ffast-math' itself is also passed cc1 (the act of passing
> > '-ffast-math'
>
> > to cc1 results in the macro '__FAST_MATH__' being defined). When
> > (for
>
> > example) '-fno-reciprocal-math' is passed in addition to
> > '-ffast-math', then
>
> > '-freciprocal-math' is no longer passed to cc1 (and the other five
> > listed
>
> > above still are passed, along with '-ffast-math' still being
> > passed).
> > It
>
> > seems like the intention was that these individual switches were to
> > enable
>
> > the individual floating-point transformations (and so the lack of
> > any
> > of
>
> > those switches would suppress the relevant transformations), but
> > the
>
> > '-ffast-math' "umbrella" is over-riding the attempted suppression.
>
> Sure, this looks like a bug, disable an individual fast-math flag on
> the command line should be possible and override a prior -ffast-math
> (usually the last one on the command line “wins”/override).
> The Cfe-dev mailing list would be more appropriate to discuss the
> behavior of clang command line flags though.
> > The change proposed at https://reviews.llvm.org/D26708 deals with
> > this issue
>
> This patch seems to modify on LLVM, it does not deal at all with the
> issue you describe above.
> I don’t see why the issue with the clang command line flags need to
> be dealt with at the LLVM level.
> > just for the reciprocal-transformation case, but it changes the
> > semantics of
>
> > the 'fast' IR-level flag so that it no longer implies all the
> > others.
>
> The starting point for any change is:
> http://llvm.org/docs/LangRef.html#fast-math-flags
> You would need to write a new definition for what “fast” would mean.
> However I don’t need anything need to be changed here to address the
> use-case you want to fix.
I suspect that we want to start by getting rid of 'fast' on the IR level and replacing it with individual flags for the various optimization classes - Do we have only allowing reassociation and libm optimizations? Then we can readjust the Clang flags in a straightforward way.
-Hal
> > With
>
> > that proposed approach, rather than an "umbrella" flag such as
> > 'fast'
> > being
>
> > checked in the back-end (along with an individual flag like
> > 'arcp'),
> > just
>
> > checking the individual flag ('arcp') would be done.
>
> There is already no need to check the “fast” *and* arcp flag, if a
> transformation is about reciprocal, then you only need to check arcp
> (fast implies arcp, checking for fast would be redundant).
> Be careful also that the fast-math flags are mainly an IR level
> definition, the backend only inherited these per instruction flag
> very recently. It has been entirely converted to use these, and it
> still uses a global flag in some places.
> The line you’re touching in your patch for instance is about this
> legacy:
> if (!UnsafeMath && !Flags->hasAllowReciprocal())
> The first flag is the global “fast-math” mode on the backend, which
> is not as fine grain as the per-instruction model.
> The second flag is the “per instruction” flag, which is the model we
> aim at.
> We should get rid of the “global” UnsafeMath in the backend, but that
> does not require any change to the IR or the individual fast-math
> flags.
> > Any fast-math-related
>
> > transformation that doesn't have an individual flag (e.g.,
> > re-association
>
> > currently doesn't), should eventually have an individual flag
> > defined
> > for
>
> > it, and then that individual flag should be checked.
>
> > What do people think?
>
> I think these are valuable problems to solve, but you should tackle
> them piece by piece:
> 1) the clang part of overriding the individual FMF and emitting the
> right IR is the first thing to fix.
> 2) the backend is still using the global UnsafeFPMath and it should
> be killed.
> Hope this makes sense.
> —
> Mehdi
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
--
Hal Finkel
Lead, Compiler Technology and Programming Languages
Leadership Computing Facility
Argonne National Laboratory
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20161116/d3a077b2/attachment.html>
More information about the llvm-dev
mailing list