On Tue, Mar 10, 2009 at 4:45 PM, Sylvain Pion
<sylvain.p...@sophia.inria.fr> wrote:
> - Show quoted text -
> Joseph S. Myers wrote:
>>
>> On Mon, 9 Mar 2009, Sylvain Pion wrote:
>>
>>> Later, 1) started to be taken care of, and it was unfortunately
>>> added under the control of the same -frounding-math option.
>>> Which now, makes it harder to come back, since we want different
>>> defaults for these two aspects.
>>>
>>> I have already mentioned in a bugzilla PR that it could be nice
>>> to have 2 options, but IIRC, I did not get any reply to this.
>>
>> Patches to split the option into two *clearly-defined* options are more
>> likely to be accepted than changing the defaults, given that the fast-math
>> and related flags have been split more than once before.
>
> My goal is to have interval arithmetic work with the default flags,
> without more workarounds in the code (and as efficiently as possible).
> So, I'm not going to work on anything if it means only splitting it
> in separate flags, if we don't agree a priori on changing the default
> for at least one of those sub flags after that.
> That would be the opposite of progress for my usage, and so I would
> not volunteer.
>
>
> Currently, typical interval arithmetic code has to work around the fact that
> there is no good way to stop constant propagation reliably (so it's using
> some volatile or asm, or a big hammer like rounding-math, all these
> solutions
> having a performance cost).
> It would be nice to improve this, but a global flag, be it dedicated,
> strikes
> me as a clearly suboptimal solution here anyway (and, as has been mentioned,
> it causes problems with code which really needs cprop in other places).
> For IA, having a __builtin_stop_constant_propagation(expression) would be
> OK,
> which would reliably stop constant propagation on an expression, for
> example.
> I don't think there's anything like that already in GCC.
> That would be a real improvement, and would even improve the speed
> of interval arithmetic implementations as a bonus (because it wouldn't
> do any harm for the non-constant cases).
> I'm not sure what you think about such a built-in : it's more general
> than FP expressions, but may be only useful there in practice (?).
> Maybe it might even be able to replace most concrete needs for this
> aspect of -frounding-math.
> Moreover, I don't know how hard it would be to implement.  What do you
> think?
>
> (Of course this would still not be perfect to me : the ideal compiler
> interface for IA for me is something along the lines of what is described
> in N2811 which attaches a compile-time rounding mode to the operations.
> But at least this first step would mean progress, and might be otherwise
> useful, I don't know.)
>
> A quick audit says that the rest of -frounding-math seems indeed like it's
> about
> expression transformations which are valid when rounding is to the nearest.
> Maybe this part can indeed be seen as a subset of -fassociative-math
> as Paolo mentioned, which may or may not reserve a dedicated flag.
> (certainly I would push for these transformations to not be performed
> by default, just like -fassociative-math)
>
>
>
> FYI, "grep flag_rounding_math" gives the following uses of -frounding-math,
> with my interpretations :
>
> gcc/config/i386/i386.md
>
>  used to allow the selection of an SSE insn for a round operation
>  when the conditions are sufficiently relaxed (as far as I understood)
>
> gcc/config/arm/arm.c
>
>  triggers an ABI related thing in the ASM files.
>  (I have no clue how -frounding-math could possibly
>  affect the ABI, but I know nothing about ARM)
>
> gcc/flags.h
>
>  affects definition of HONOR_SIGN_DEPENDENT_ROUNDING
>  which is used in many places in fold-const and simplify-rtx
>  for expression transformations.
>
> gcc/builtins.def
>
>  affects definition of ATTR_MATHFN_FPROUNDING
>  which triggers const/pure attributes on "cmath" built-ins it seems.
>
> gcc/builtins.c
> gcc/fold-const.c
>
>  used for preventing constant folding in some cases
>
> gcc/opts.c
>
>  fast-math => no-rounding-math
>
> gcc/convert.c
>
>  guard  (float)-x => -(float)x  transformation
>
> gcc/simplify-rtx.c
>
>  guard constant folding
>
>
>
> I have not checked all this as carefully as can be, but enough
> to convince me that a good split of -frounding-math might indeed
> be between (1) stopping constant propagation (where the question
> is whether a builtin_stop_cprop(e) covers all needs), and
> (2) "associative-math"-like transformations which could be disabled
> by default.

The middle-end knows about an explicit association barrier (only
used from the Fortran FE sofar), a PAREN_EXPR.  Would exposing
that to C/C++ be of any help?  For example it would, even with
-ffast-math, avoid constant folding for (x + FLT_EPS) - FLT_EPS
(which FLT_EPS such that proper rounding to the nearest integer
value is performed).

Richard.

> - Show quoted text -
>
> --
> Sylvain Pion
> INRIA Sophia-Antipolis
> Geometrica Project-Team
> CGAL, http://cgal.org/
>

Reply via email to