----- Original Message -----
> On Mon, May 26, 2014 at 02:20:36PM -0400, Kai Tietz wrote:
> > --- i386.c (revision 210936)
> > +++ i386.c (working copy)
> > @@ -5298,6 +5298,12 @@ ix86_function_ok_for_sibcall (tree decl, tree exp)
> > decl_or_type = type;
> > }
> >
> > + /* We need to reject stdarg-function for x86_64 ABI as accumulator
> > + is used as argument. */
> > + if (TARGET_64BIT && stdarg_p (type)
> > + && ix86_function_type_abi (type) == SYSV_ABI)
> > + return false;
> > +
> > /* Check that the return value locations are the same. Like
> > if we are returning floats on the 80387 register stack, we cannot
> > make a sibcall from a function that doesn't return a float to a
> > @@ -24916,8 +24922,19 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx call
> > ? !sibcall_insn_operand (XEXP (fnaddr, 0), word_mode)
> > : !call_insn_operand (XEXP (fnaddr, 0), word_mode))
> > {
> > + rtx r;
> > fnaddr = convert_to_mode (word_mode, XEXP (fnaddr, 0), 1);
> > - fnaddr = gen_rtx_MEM (QImode, copy_to_mode_reg (word_mode, fnaddr));
> > + if (!sibcall)
> > + r = copy_to_mode_reg (word_mode, fnaddr);
> > + else
> > + {
> > + r = gen_rtx_REG (word_mode, AX_REG);
> > + if (! general_operand (fnaddr, VOIDmode))
> > + fnaddr = force_operand (fnaddr, r);
>
> Wrong formatting.
Thanks for the heads up. Fix the superflous tab.
> > + if (fnaddr != r)
> > + emit_move_insn (r, fnaddr);
> > + }
> > + fnaddr = gen_rtx_MEM (QImode, r);
> > }
> >
> > call = gen_rtx_CALL (VOIDmode, fnaddr, callarg1);
>
> In any case, I still can't understand how limiting the choices of the
> register allocator can improve code rather than making it worse.
> If the accumulator is available there, why doesn't the RA choose it
> if it is beneficial? And why aren't other registers similarly suitable for
> that? Say r10, r11...
I don't see it as limiting. The intend of this is more to have fixed patterns
on epilogue. And in fact is accumulator that register which can be used as
scratch-register for all i386-targets. Beside for varardic-functions, which
anyway aren't any good candidates for sibling-call-optimization (on x86_64 due
ABI).
Well, for x86_64 ABI we might could consider to use R11_REG instead of AX_REG.
Is there any advantage in special-case for x86_64 ABI?
The R10-register isn't a good choice due it might be used as drap-register and
therefore can't be loaded before epilogue gets destroyed.
> Jakub
>
Kai