Richard Earnshaw <rearn...@arm.com> 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

Reply via email to