[LLVMdev] Overriding TargetRegisterInfo::hasReservedSpillSlot
William J. Schmidt
wschmidt at linux.vnet.ibm.com
Fri Aug 31 13:30:42 PDT 2012
On Fri, 2012-08-31 at 11:41 -0500, William J. Schmidt wrote:
> To fix some problems with how condition registers are saved/restored for
> PowerPC, I need to override TargetRegisterInfo::hasReservedSpillSlot()
> in PPCRegisterInfo. I've had some difficulties because of the constness
> of the function, and I'm wondering what the best way to handle this
> would be.
>
> Essentially I need to add a field to PPCRegisterInfo, and modify that
> field in hasReservedSpillSlot. (I need to reserve the spill slot only
> if condition registers are to be spilled, and reserve it only once even
> if more than one is to be spilled; so I need state that persists across
> multiple calls to this function.) Because hasReservedSpillSlot is
> annotated as const, I can't do this directly.
>
> There appear to be several options:
> * Add the field as an int& instead of an int. This requires it to be
> allocated in the constructor's initializer, which is rather ugly:
> NewField(*(new int)).
> * Remove the constness from the virtual function in the superclass and
> other subclasses (currently only X86). This is bad if it's const by
> design, but OK if it was just const by habit. It would probably be good
> to change the name of the function to indicate potential modification in
> that case.
> * Add another target hook that only PowerPC will use initially in order
> to set up the reserved spill slot. This basically would move almost all
> the PowerPC logic out of hasReservedSpillSlot() into the new hook in
> order to circumvent the const issue. This works but bothers me a little
> since it's a lot of hoop-jumping just to bypass const.
Well, it appears that only the first option is open to me. For reasons
I don't fully understand (still blowing the dust off my C++), I can't
have a non-const virtual function in the TargetRegisterInfo class. As
soon as I introduce one, I get a conversion error indicating that my
subclass has lost necessary constness:
/home/wschmidt/llvm/llvm-test4/lib/CodeGen/PrologEpilogInserter.cpp: In member function ‘void llvm::PEI::calculateCalleeSavedRegisters(llvm::MachineFunction&)’:
/home/wschmidt/llvm/llvm-test4/lib/CodeGen/PrologEpilogInserter.cpp:251:53: error: no matching function for call to ‘llvm::TargetRegisterInfo::createOptionalReservedSpillSlot(llvm::MachineFunction&, unsigned int&) const’
/home/wschmidt/llvm/llvm-test4/lib/CodeGen/PrologEpilogInserter.cpp:251:53: note: candidate is:
In file included from /home/wschmidt/llvm/llvm-test4/lib/CodeGen/PrologEpilogInserter.h:30:0,
from /home/wschmidt/llvm/llvm-test4/lib/CodeGen/PrologEpilogInserter.cpp:23:
/home/wschmidt/llvm/llvm-test4/include/llvm/Target/TargetRegisterInfo.h:659:16: note: virtual void llvm::TargetRegisterInfo::createOptionalReservedSpillSlot(llvm::MachineFunction&, unsigned int) <near match>
/home/wschmidt/llvm/llvm-test4/include/llvm/Target/TargetRegisterInfo.h:659:16: note: no known conversion for implicit ‘this’ parameter from ‘const llvm::TargetRegisterInfo*’ to ‘llvm::TargetRegisterInfo*’
So in the absence of any other suggestions, I suppose I will go with
using a reference field.
Bill
>
> Which of the above, or any other possibilities, would you consider to be
> the best approach?
>
> (While I'm on the topic of this function, it's a little bothersome that
> the MachineFunction &MF parameter is marked const also. It makes it
> impossible to call MF.getFrameInfo() without casting the constness away.
> In such cases, is it best to cast away const, or remove the qualifier
> from the parameter?)
>
> Thanks for any help!
> Bill
More information about the llvm-dev
mailing list