Richard Earnshaw <[email protected]> writes:
> On 07/07/11 15:34, Richard Sandiford wrote:
>> It seems a shame to have both (return) and (simple_return). You said
>> that we need the distinction in order to cope with targets like ARM,
>> whose (return) instruction actually performs some of the epilogue too.
>> It feels like the load of the saved registers should really be expressed
>> in rtl, in parallel with the return. I realise that'd prevent
>> conditional returns though. Maybe there's no elegant way out...
>
> You'd still need to deal with distinct returns for shrink-wrapped code
> when the full (return) expands to
>
> ldm sp, {regs..., pc}
>
> The shrink wrapped version would always be
> bx lr
Sure, I understand that returns does more than return on ARM.
What I meant was: we'd normally want that other stuff to be
expressed in rtl alongside the (return) rtx. E.g. something like:
(parallel
[(return)
(set (reg r4) (mem (plus (reg sp) (const_int ...))))
(set (reg r5) (mem (plus (reg sp) (const_int ...))))
(set (reg sp) (plus (reg sp) (const_int ...)))])
And what I meant was: the reason we can't do that is that it would make
conditional execution harder. But the downside is that (return) and
(simple_return) will appear to do the same thing to register r4
(i.e. nothing). I.e. we are to some extent going to be lying to
the rtl optimisers.
Richard