<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<html><body style='font-family: Verdana,Geneva,sans-serif'>
<p>Hi,</p>
<p>I am confused about the call to isPhyRegUsed in calculateCalleeSavedRegisters:</p>
<p>if (Fn.getRegInfo().isPhysRegUsed(Reg)) {<br />      // If the reg is modified, save it!<br />      CSI.push_back(CalleeSavedInfo(Reg));<br />    }</p>
<p>It seems that isPhyRegUsed returns true if the register is read or written in the function. </p>
<p>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".</p>
<p>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...</p>
<p>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...</p>
<p><br />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... </p>
<p> </p>
<p>best regards,</p>
<p>Sebastien</p>
</body></html>