[LLVMdev] Heads up: Local register allocator going away

Sylvere Teissier st at invia.fr
Mon Jun 7 09:29:39 PDT 2010

Jakob Stoklund Olesen wrote:
> On Jun 4, 2010, at 3:05 AM, Sylvere Teissier wrote:
>> In my target the CALL instruction change the link Register %LR
>> In the target InstrInfo.td I have "Defs=[LR]" on the CALL instruction
>> definition to handle that.
> So your CALL instructions are clobbering your callee-saved registers, eh? ;-)

Yes, exactly !

>> It works well with others registers allocators: when there is a call
>> they mark LR used in the function with MRI->addPhysRegsUsed(UsedInInstr);
>> and LR is callee saved correctly during prolog/epilog insertion.
>> But with fast register allocator the following lines ignore the Def on
>> LR in the call instruction: (line 747)
>> if (TID.isCall()) {
>> // Spill all virtregs before a call. This serves two purposes: 1. If an
>> // exception is thrown, the landing pad is going to expect to find registers
>> // in their spill slots, and 2. we don't have to wade through all the
>> // <imp-def> operands on the call instruction.
>>  DefOpEnd = VirtOpEnd;
>>  DEBUG(dbgs() << "  Spilling remaining registers before call.\n");
>>  spillAll(MI);
>> }
>> if I remove this block this fix the bug: LR is marked used with
>> MRI->addPhysRegsUsed(UsedInInstr)
>> and LR is correctly saved and restored in the function prolog/epilog.
>> Is this code really usefull ? :D
> Yes, calls can have ridiculously long lists of clobbered registers that we really don't want to go through in a 'fast' allocator. 
> But you are right, those registers still need to be marked as used by the function.
> I'll fix it, thanks!

Your fix works, thanks !

> /jakob

More information about the llvm-dev mailing list