----- 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

Reply via email to