[LLVMdev] Clarification about callee saved regs and MachineRegisterInfo::isPhyRegUsed

matic at nimp.co.uk matic at nimp.co.uk
Sun Jan 27 06:50:44 PST 2013


 

Hi, 

I am confused about the call to isPhyRegUsed in
calculateCalleeSavedRegisters: 

if (Fn.getRegInfo().isPhysRegUsed(Reg))
{
 // If the reg is modified, save it!

CSI.push_back(CalleeSavedInfo(Reg));
 } 

It seems that isPhyRegUsed
returns true if the register is read or written in the function. 

If
this is right, why do we save a register if it is only read in the
function ?? I would have expected that calculateCalleeSavedRegisters use
another function which would return true only when the register is
written, something like "isPhyRegWritten". 

You may ask why a function
would only read a callee saved register ?? The case I have in mind is
the link register, like LR in ARM: a typical return instruction is BX
LR. BX instruction only reads LR, no need to push/pop LR just because a
function ends by BX LR... 

The ARM backend don't have this problem
because it use a BX_RET instruction, which is just a BX which implicitly
use LR as operand. Seems like a workaround solution... 

Context of this
question: I am trying to learn how backends work, for doing so I started
to write a backend for ARM Cortex M0, starting from the mblaze as base.
I am aware that the ARM backend already support Cortex M0, this is just
a learning exercise, I may turn it into a tutorial if I am confident
enough with the result. I am trying to do it in the most straightforward
way and avoid quick and dirty workarounds... 

best regards, 

Sebastien
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20130127/5227d370/attachment.html>


More information about the llvm-dev mailing list