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.
>
> Any thoughts?

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 ();

where GCC cannot re-order baz() and bar() later because the undefined evaluation
order isn't exposed in the IL.

Of course this matters most to archs that pass arguments via the stack.  And it
doesn't work in the case above because we don't interleave argument setup
of foo () with the calls.

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.

But because of the above idea the effects on code generation may be visible.

As x86_64 is affected investigating the effects on it (and i?86 for the stack
passing case) would be a start.

Of course in the end the frontend should be responsible for enforcing proper
evaluation order of side-effects in arguments so PUSH_ARGS_REVERSED
might still do all the important parts of getting better argument
setup for calls.

Richard.

> Jason

Reply via email to