[LLVMdev] llvm register reload/spilling around calls

Roland Scheidegger rscheidegger_lists at hispeed.ch
Wed Oct 20 07:46:35 PDT 2010


On 20.10.2010 05:00, Jakob Stoklund Olesen wrote:
> On Oct 19, 2010, at 6:37 PM, Roland Scheidegger wrote:
> 
>> Thanks for giving it a look!
>> 
>> On 19.10.2010 23:21, Jakob Stoklund Olesen wrote:
>>> On Oct 19, 2010, at 11:40 AM, Roland Scheidegger wrote:
>>> 
>>>> So I saw that the code is doing lots of register 
>>>> spilling/reloading. Now I understand that due to calling 
>>>> conventions, there's not really a way to avoid this - I tried
>>>> using coldcc but apparently the backend doesn't implement it
>>>> and hence this is ignored.
>>> Yes, unfortunately the list of call-clobbered registers is fixed
>>> at the moment, so coldcc is mostly ignored by the backend.
>>> 
>>> Patches welcome.
>> What would be needed there? I actually tried a quick hack and
>> simply changed the registers included in the list in 
>> X86RegisterInfo::getCalleeSavedRegs, so some xmm regs were included
>>  (similar to what was done for win64). But the result wasn't what I
>>  expected - the callee now indeed saved/restored all the xmm regs I
>>  added, however the calling code did not change at all...
> 
> Look in X86InstrControl.td. The call instructions are all prefixed
> by:
> 
> let Defs = [RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11, FP0, FP1, FP2,
> FP3, FP4, FP5, FP6, ST0, ST1, MM0, MM1, MM2, MM3, MM4, MM5, MM6, MM7,
>  XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM9, XMM10,
> XMM11, XMM12, XMM13, XMM14, XMM15, EFLAGS],
> 
> This is the fixed list of call-clobbered registers. It should really
> be controlled by the calling convention of the called function
> instead.
> 
> The WINCALL* instructions only exist because of this.
Ahh I see now. I hacked this up and indeed the code looks much better.
I can't force it to use win64 calling conventions right?
Would do just fine for this case (much closer to a cold calling
convention, I really only need 5 preserved xmm regs).

Roland


> 
> One problem is that calling conventions are handled while building
> the selection DAG, and the DAG doesn't really know to represent
> clobbered registers.
> 
> Perhaps X86TargetLowering::LowerCall() could decorate the
> X86ISD::CALL node with the calling convention somehow?
> 
> Dan, do you have any thoughts on how to communicate the calling
> convention and call clobbered registers to the eventual CALL
> MachineInstr?
> 
> /jakob
> 




More information about the llvm-dev mailing list