This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: x86: -Os -msse2 needs -maccumulate-outgoing-args
- From: Stuart Hastings <stuart at apple dot com>
- To: Jan Hubicka <hubicka at ucw dot cz>
- Cc: gcc at gcc dot gnu dot org, Falk Hueffner <falk dot hueffner at student dot uni-tuebingen dot de>, Richard Henderson <rth at redhat dot com>
- Date: Tue, 13 Jan 2004 16:56:00 -0800
- Subject: Re: x86: -Os -msse2 needs -maccumulate-outgoing-args
- References: <1F5C0B7C-2D05-11D8-8396-000A95A83B3C@apple.com> <20031218222508.GE10588@redhat.com> <FB5CAAB7-40B3-11D8-84FC-000A95A83B3C@apple.com> <20040107101305.GC21007@redhat.com> <E5C6E870-4161-11D8-84FC-000A95A83B3C@apple.com> <20040107224525.GB25232@redhat.com> <D38B6320-41FD-11D8-B2D3-000A95A83B3C@apple.com> <AF4DC065-4609-11D8-B14F-000A95A83B3C@apple.com> <20040113205102.GC19340@atrey.karlin.mff.cuni.cz>
On Jan 13, 2004, at 12:51 PM, Jan Hubicka wrote:
This testcase
Hi,
this is not -maccumulate-outgoing-args that breaks, it is
-mpreffered-stack-boundary=2 implied by -Os. We still don't have the
dynamic stack alignment code merged in, unfortunately.
I looked at this, and it's not clear to me how it would help. Here's
the thread:
http://gcc.gnu.org/ml/gcc-patches/2002-05/msg02282.html
Also, given the unique semantics of the Darwin linker, I'm not sure
this could work on Darwin today (our linker "knows" too much about
entry points). I think this would be implementable with a future
Darwin linker.
It would be probably sane to give some warning or hard error when SSE
register is put onto stack, but I don't see easy way to do this, as we
should not output such a warning for long doubles that have same
alignment properties.
I'm sorry, I didn't fully understand this.
If a long double has the same alignment properties as a vector, then
misaligned loads of that long double should fault just like a
misaligned vector load (?). If the long double prefers a high
alignment, but will work with lesser alignment, then its alignment
requirements aren't the same as a vector (??).
Ideas?
Here's another approach:
If main() is part of a module compiled with
-mpreferred-stack-boundary=2, and main() wants to pass a vector
argument to function foo_v() in another module, main() knows that A)
main()s own stackframe is not aligned, and B) since foo_v() is
expecting a vector parameter, foo_v() must have been compiled with a
suitable stack alignment. (O.K., it's a weak argument.)
Instead of generating a warning, howabout forcing the stack into
alignment just for the call to foo_v() ? Sort of a per-call variant of
FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN (see
function.c:expand_main_function()).
To insure safety, any function that accepts vector arguments would
insist upon a suitable stack alignment at compile time (hard error).
The problem I see here is what to do when a function accepts variable
arguments...
Ack! I just suggested an additional check to calls.c; it is already
much too complicated. :-(
stuart hastings
Apple Computer