[LLVMdev] Spilling register and frame indices

Vladimir Prus ghost at cs.msu.su
Tue May 23 06:33:37 PDT 2006


Hi,
right now, LLVM does register spilling by:

1. Creating stack object
2. Passing index of that stack object to MRegisterInfo::storeRegToStackSlot
3. At later stage, frame indices are replaced by calling to
MRegisterInfo::eliminateFrameIndex.

This works for me, but there's slight problem. The target does not have
"register + contant" addressing mode, so accessing frame index should be
done like this:

   some_register = frame_pointer + offset
         ...... [some_register]

Since frame index eliminations happens after register allocation, I must
make sure 'some_register' does not participate in normal register
allocation.

That approach sounds suboptimal. By "reserving" one register we can already
cause some values to be spilled, that otherwise would be stored in
register.

The lifetimes of those 'some_register' is likely to be very small (1
instruction), so "reserving" it everywhere is not good.

Ideal approach would be to add a method to MRegisterInfo to spill specific
virtual register. The implementation can then create code like:
 
   virtual_register = frame_pointer + offset
         [virtual_register]

and then have 'virtual_register' allocated on next iteration of register
allocator?

Also, while RegAllocLocal and RegAllocSimple directly call
storeRegToStackSlot, I would not found any calls to that method in
RegAllocLinearScan. Am I missing something?

- Volodya




More information about the llvm-dev mailing list