This means that the return address register has to be saved somewhere, e.g., on the stack.
If neither of these conditions is satisfied, squeeze tries to determine whether the return address register can be safely saved on the stack at entry to p, and restored at the end.
For example, the standard calling convention for the Compaq Alpha AXP architecture under Tru64 Unix(6) treats register r26 as the return address register (ra) and registers r9 through r15 as callee-saved registers.
We then choose a register r with maximum savings (which must exceed 0), and generate a family of functions [MATHEMATICAL EXPRESSION NOT REPRODUCIBLE IN ASCII] that save the callee-saved registers and the return address register, and then return via register r.
Assume that register r0 is free at entry to both these functions and is chosen as the return address register. The code resulting from the transformation described above is shown in Figure 5.
For example, in Figure 5, suppose that none of the functions using return address register r0 save register r15.
A particular choice of return address register, as described above, may not account for all of the functions in a program.
The reason for this, it turns out, is that very often there is a large number of return blocks that restore all the callee-saved registers and the return address register from memory, deallocate the stack frame, and then return from the function.
(7) In practice not all functions can be guaranteed to follow the standard calling convention, so it is necessary to verify that register ra is, in fact, being used as the return address register by f.