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