[LLVMdev] problem trying to write an LLVM register-allocation pass
Susan Horwitz
horwitz at cs.wisc.edu
Mon Dec 3 07:11:36 PST 2012
Aha, yes, this is definitely helpful!
Is there documentation on all this somewhere? I still have errors for
some large test inputs, and it would be nice if I didn't have to keep
bugging you for information.
Thanks!
Susan
On 12/2/2012 10:55 PM, Lang Hames wrote:
> Hi Susan,
>
> Thanks for the clarification, and the test case. I think I know what
> the problem is now. Saving and restoring RBP is the job of the PEI
> (PrologEpilogInsertion) pass, which runs after register allocation. To
> determine which callee-saved physregs actually need to be saved it
> checks MachineRegisterInfo::isPhysRegOrOverlapUsed(unsigned reg). Your
> register allocator needs to notify MachineRegisterInfo about the
> physical registers that have been assigned by calling
> MachineRegisterInfo::setPhysRegUsed(unsigned reg).
>
> You only need to call setPhysRegUsed for the physregs that you
> actually use. You do not need to specify the aliasing registers.
>
> Hope this helps!
>
> Regards,
> Lang.
>
>
> On Sat, Dec 1, 2012 at 9:31 AM, Susan Horwitz <horwitz at cs.wisc.edu
> <mailto:horwitz at cs.wisc.edu>> wrote:
>
> On 11/30/2012 6:36 PM, Lang Hames wrote:
>>
>>
>> RBP is used as the frame pointer on x86 (hence its automatic
>> appearance in your code), and shouldn't be allocated to any vreg
>> in function bar. Loading/saving RBP should be managed by the
>> stack frame setup/teardown code.
>> If it doesn't already, your allocator should filter out reserved
>> registers (See MachineRegisterInfo::isReserved(unsigned preg))
>> when assigning physregs.
>
> I AM filtering out reserved registers.
>
> I am not allocating RBP in function bar, I am allocating EBP,
> because it is NOT in the list of reserved registers for function bar.
>
> Neither register RBP nor register EBP is saved/restored across the
> call from foo to bar, either by the code for the call or the code
> for entry to bar.
>
> The input C file that is causing this problem is flex.c
> (attached). The calling function is "yyparse" and the called
> function is "scinstal".
>
> Here are the reserved registers for yyparse: { 7 44 54 106 111 114
> 118 }
>
> Here are the reserved registers for scinstal: { 54 111 114 }
>
> Register EBP is preg 44, which is NOT in the reserved list for
> scinstal (nor is it an alias of any of those reserved registers;
> the aliases are { 50 64 117 118 <tel:50%2064%20117%20118> }). I
> don;t know which preg corresponds to RBP.
>
> You say that RBP should be saved/restored across the call. I
> tried to generate that code, but, as I said in my previous mail,
> I don't know how to get the appropriate TargetRegisterClass
> (needed to call CreateSpillStackObject). Should I instead be
> generating code to save register EBP at the start of scinstal,
> restoring it at the end of that function?
>
> Susan
>
>
>>
>> ArrayRef<MCPhysReg> pregs = TRC->getRawAllocationOrder(&MF);
>> for (int i = 0; i < pregs.size(); ++i) {
>> if (MRI->isReserved(pregs[i]))
>> continue;
>> // use preg...
>> }
>>
>> You could also use the AllocationOrder class to simplify the task
>> of finding valid pregs, though it does require you to use
>> VirtRegMap.
>>
>> If you are already checking the reserved regs then I've
>> misdiagnosed the problem. I'd be happy to dig further if you can
>> point me to a copy of your allocator and a test case.
>>
>> Cheers,
>> Lang.
>>
>>
>> On Thu, Nov 29, 2012 at 3:49 PM, Susan Horwitz
>> <horwitz at cs.wisc.edu <mailto:horwitz at cs.wisc.edu>> wrote:
>>
>> I have a new problem: Register RBP is used in a function foo.
>> (I am not allocating RBP to any virtual register, the
>> instances of RBP in function foo are in the machine code when
>> my register allocator starts.)
>>
>> Function foo calls function bar. Register RBP is not saved
>> across the call, though it is live after the call. Function
>> bar includes a virtual register. The code that I'm using to
>> find the registers available to be allocated to that virtual
>> register includes EBP in that available-preg set. This is a
>> disaster, since writing into EBP clobbers RBP.
>>
>> I tried to add code to save all live physical registers
>> across calls, but I don't know how to get the appropriate
>> TargetRegisterClass (needed to call CreateSpillStackObject).
>>
>> Is there a different way to save/restore RBP across calls?
>> Or a way to get its TargetRegisterClass?
>>
>> Susan
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20121203/3cafd5e4/attachment.html>
More information about the llvm-dev
mailing list