[llvm-commits] llvm/lib/Target/PowerPC/PPCRegisterInfo.cpp
Chris Lattner
clattner at apple.com
Fri Mar 9 03:43:53 PST 2007
On Mar 5, 2007, at 12:58 AM, Nicolas Geoffray wrote:
> Chris Lattner wrote:
>>
>> Ok, so it's not related to NoFramePointerElim? If that's the
>> case, you should just have Macho and ELF return different sets of
>> callee saved regs.
>>
> No, that's not the issue.
>
> Let me rephrase why I need this patch :)
>
> In PowerPC, whether it's on ELF ABI or MachO, R31 is a normal,
> callee-saved register. With one exception: when it is used as a
> frame pointer. When it is used as a frame pointer, both MachO and
> ELF remove R31 from the callee-saved registers set.
Ok.
> There are two different ways to use R31 as a frame pointer: 1) with
> an alloca when the stack is growing in a non-compilation
> deterministic size, or 2) when NoFramePointerElim is set.
Ah, gotcha.
> 1) When there is an alloca that modifies the size of the stack,
> compilation goes through the LowerDYNAMIC_STACKALLOC method. In
> this method, you find the code:
>
>
> // Find out what the fix offset of the frame pointer save area.
> int FPOffset = PPCFrameInfo::getFramePointerSaveOffset(IsPPC64,
> isMachoABI);
> // Allocate the frame index for frame pointer save area.
> FPSI = MF.getFrameInfo()->CreateFixedObject(IsPPC64? 8 : 4,
> FPOffset);
> // Save the result.
> FI->setFramePointerSaveIndex(FPSI);
Ok
> With this code you give the info to the FrameInfo object that the
> frame pointer offset is at FPOffset. Therefore, this offset will
> never be used as an offset for another purpose. And this is
> _really_ important for ELF, because the frame pointer, R31, is
> saved in the callee-saved area. With this code, you are sure that
> no callee-saved register will be spilled to R31's offset.
Ok.
> 2) When NoFramePointerElim is set, R31 is always used as a frame
> pointer. However, the stack size may be decided at a compilation
> time, therefore the compilation process never goes through the
> LowerDYNAMIC_STACKALLOC. And LowerDYNAMIC_STACKALLOC is the only
> method that saves the frame pointer offset in the frame info.
> The bug arrives here: the frame info object never had the info that
> R31 is saved in the callee-saved area. Therefore, it may allocate
> the frame pointer offset for spilling an other register. This was
> not an issue for the MachO ABI because the frame pointer offset in
> MachO is not in the callee-saved area.
>
> With this patch I give the info to the FrameInfo object, before the
> callee-saved scan, that R31 is saved in the callee-saved area. Thus
> I am sure that no register will be spilled in R31's offset.
Ahhh, ok. I think I understand now what is going on. Thank you for
the very clear explanation.
In this case, it seems like a clearly good thing to just call
CreateFixedObject unconditionally early on (e.g.) when lowering the
arguments.
I don't have your proposed patch handy, but it seems like you know
what the issues are :), so go ahead and check it in.
-Chris
More information about the llvm-commits
mailing list