[LLVMdev] llvm register reload/spilling around calls

Jakob Stoklund Olesen stoklund at 2pi.dk
Wed Oct 20 09:13:29 PDT 2010


On Oct 20, 2010, at 7:46 AM, Roland Scheidegger wrote:

> On 20.10.2010 05:00, Jakob Stoklund Olesen wrote:
>> 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?

No, only by targeting Windows.

> Would do just fine for this case (much closer to a cold calling
> convention, I really only need 5 preserved xmm regs).

If XMM registers are the problem, -pre-alloc-split really ought to help you.

You may want to investigate why it doesn't.

/jakob




More information about the llvm-dev mailing list