Hi,

On Tue, 24 Nov 2015, Richard Biener wrote:

> On Tue, Nov 24, 2015 at 12:01 AM, Jason Merrill <ja...@redhat.com> wrote:
> > There's a proposal working through the C++ committee to define the order of
> > evaluation of subexpressions that previously had unspecified ordering:
> >
> > http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2015/p0145r0.pdf
> >
> > I agree with much of this, but was concerned about the proposal to define
> > order of evaluation of function arguments as left-to-right, since GCC does
> > right-to-left on PUSH_ARGS_REVERSED targets, including x86_64.

Actually the most natural order for an (normal, stack-passing) 
implementation that supports varargs is right-to-left, so the proposal has 
it exactly backwards.  (Reason being that named arguments then have 
constant offsets from stack pointer).

right-to-left is also the better order for all ABIs that pass (at least 
some) arguments on stack but give left arguments smaller offsets from 
top-of-stack (as most ABIs do).

> The reason we have PUSH_ARGS_REVERSED is to get more optimal
> code generation for calls reducing lifetime of argument computation
> results.  Like when you have
> 
>  foo (bar(), baz())
> 
> then generate
> 
>   reg = bar();
>   push reg;
>   reg = baz();
>   push reg;
>   foo ();
> 
> instead of
> 
>   reg = baz();
>   spill reg;
>   reg = bar();
>   push reg;
>   push spilled reg;
>   foo ();

Your examples are switched, but the idea is the correct one (result of bar 
needs to be pushed last in the x86 ABI).

> I would like to get rid of PUSH_ARGS_REVERSED (as used in 
> gimplification) because it's also one source of very early IL 
> differences across archs.

Actually most other targets should also act as if PUSH_ARGS_REVERSED, not 
only x86_64.


Ciao,
Michael.

Reply via email to