This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: patch to fix rtl documentation for new floating point comparisons
- From: Joseph Myers <joseph at codesourcery dot com>
- To: Kenneth Zadeck <zadeck at naturalbridge dot com>
- Cc: Richard Earnshaw <Richard dot Earnshaw at foss dot arm dot com>, Paolo Bonzini <bonzini at gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 18 Feb 2015 01:01:32 +0000
- Subject: Re: patch to fix rtl documentation for new floating point comparisons
- Authentication-results: sourceware.org; auth=none
- References: <54D9063D dot 1000102 at naturalbridge dot com> <alpine dot DEB dot 2 dot 10 dot 1502092223140 dot 32543 at digraph dot polyomino dot org dot uk> <54D95C03 dot 1090904 at naturalbridge dot com> <alpine dot DEB dot 2 dot 10 dot 1502102141060 dot 31125 at digraph dot polyomino dot org dot uk> <54DFAF8C dot 6000906 at gnu dot org> <54E0C471 dot 1090704 at naturalbridge dot com> <54E312E4 dot 707 at foss dot arm dot com> <alpine dot DEB dot 2 dot 10 dot 1502171155440 dot 26958 at digraph dot polyomino dot org dot uk> <54E3DA03 dot 5010901 at naturalbridge dot com>
On Tue, 17 Feb 2015, Kenneth Zadeck wrote:
> On 02/17/2015 07:05 AM, Joseph Myers wrote:
> > On Tue, 17 Feb 2015, Richard Earnshaw wrote:
> >
> > > So the problem we have today is the compiler has no way to distinguish
> > > between, say, < and __builtin_isless. According to Annex F (c99) the
> > > former should be signalling while the latter quiet.
> > We do have a way: < is LT and __builtin_isless is !UNGE.
> >
> > __builtin_islessgreater is !UNEQ. The question is whether it's also LTGT
> > or whether LTGT means LT || GT. And the existing documentation of
> > LTGT_EXPR leaves this unspecified, which seems clearly unhelpful. Either
> > way, you have existing code in GCC that's incorrect (i.e. that does not
> > correspond to the set of transformations that are actually valid for the
> > chosen semantics).
> >
> Having spent the majority of my gcc life at the rtl level, i find it
> astonishing that the designers of the tree level allowed this machine
> dependency to get into what i was always told was a pristine machine
> independent pass. i would have thought that the at the tree level this
> could/should be nailed down to being quiet and if someone wanted to support a
> noisy version in their port, then they would look for lt || gt when converting
> to the rtl level which has never been so pristine.
As I said in <https://gcc.gnu.org/ml/gcc-patches/2015-02/msg00583.html>, I
can't find any posting to gcc-patches of the r82467 commit that introduced
the "possible exception" wording.
> it would be nice to know exactly how many ports (if any) actually have a noisy
> version of this in hardware. ltgt is not a common primitive (it is not even
> mentioned in the ieee fp standards).
For example, on MIPS the C.cond.fmt instruction has a four-bit condition
field: "In the cond field of the instruction: cond 2..1 specify the nature
of the comparison (equals, less than, and so on); cond 0 specifies whether
the comparison is ordered or unordered, i.e. false or true if any operand
is a NaN; cond 3 indicates whether the instruction should signal an
exception on QNaN inputs, or not". Together with possibly negating the
result you get all 32 possible comparisons (choice of whether the
comparison is true or false for each of = < > unordered, choice of whether
to raise invalid for quiet NaNs).
> > I think the main difficulty in proper Annex F support would be making
> > optimizers (on each IR) understand the side-effects operations have in
> > terms of raising exceptions, and how operations may take the rounding mode
> > or existing exceptions raised as inputs - with an associated issue of
> > defining the existing default floating-point rules well enough to keep a
> > default mode that doesn't unduly inhibit optimization.
> i have been thinking a lot about the rounding modes. the only way that
> could think about properly supporting them was to actually add new rtl and
> tree operations that take the rounding mode as an extra parameter. i think
> that this is going to be the only way to support both the static and dynamic
> models. This will be ugly, but having just finished the wide int patch it is
> natural to say "how bad could it be?" some ports will want to support this
> and some will not.
My starting point is to presume that any port with hardware floating-point
exceptions and rounding modes should support this. But since ports would
probably need to change anyway to ensure operations do raise the right
exceptions, and to ensure that the machine-independent compiler can tell
which registers referred to in inline asm are part of the floating-point
exceptions / rounding modes state, maybe it wouldn't be so bad if they
also need to change their instruction descriptions to describe the
involvement of exceptions and rounding modes explicitly. (You do need to
handle the case of exceptions and rounding modes with software floating
point, i.e. libcalls implicitly using them; this applies to powerpc-linux
soft float at least.)
Of course many target architecture ports are for architectures without
hardware floating point, and without any exception or rounding mode
support, and these issues don't arise for them.
(When I say above certain things are the main difficulty I mean they are
the only things with real design issues that I see. Lots of other issues
arise such as:
(a) writing thorough testcases for individual operations working properly
with exceptions and rounding modes in various contexts (I could probably
do that at least for basic arithmetic in a week or two; properly it should
be done for every IEEE operation for which GCC allows a built-in function
to be expanded inline);
(b) going through transformations to review whether they are correct for
exceptions and rounding modes (a good starting point would be all
references to e.g. HONOR_SIGN_DEPENDENT_ROUNDING, HONOR_NANS and
flag_trapping_math, many of which are likely not checking quite the right
condition, although transformations with no such checks are harder to
find);
(c) avoiding spurious exceptions from libgcc functions e.g. converting
floating-point to DImode;
(d) ensuring the right exceptions from converting floating-point to
bit-fields;
(e) converting the standard pragmas to appropriate IR describing what
transformations are permitted on what code;
(f) if you do Annex G as well, the ABI for _Imaginary argument passing.
When you get into static rounding modes, as described in TS 18661-1, there
are a few more issues; e.g.:
(g) supporting both architectures that can encode rounding modes in
instructions, and those where the rounding mode needs swapping at runtime;
(h) allowing library headers to define macros for standard library
functions that cause them to use the constant rounding mode;
(i) ensuring that <float.h> macros have the correct value in all constant
rounding modes, which is easy if they use hex floats, but if you allow the
combination of C90 mode with constant rounding modes then you need long
decimal expansions of those macros, so maybe that combination should be
disallowed.
Those are examples of miscellaneous issues that I generally expect could
be addressed by lots of incremental patches without tricky overall design
issues. More would probably come up in a full analysis / design process
of how to do a high-quality implementation of C99/C11 Annex F/G and TS
18661-1.)
--
Joseph S. Myers
joseph@codesourcery.com