rs6000: Don't emit a use of LR in returns and sibcalls
authorSegher Boessenkool <segher@kernel.crashing.org>
Tue, 30 Aug 2016 16:30:01 +0000 (18:30 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Tue, 30 Aug 2016 16:30:01 +0000 (18:30 +0200)
commitdd9fe1b95bd57d1f69816b546cfea2b507b15a72
tree1ac5bdadede8518c52f7f5869ecbb43eaa1564ac
parentac45b2ba8c75573b9630656ccf3a20e6da333913
rs6000: Don't emit a use of LR in returns and sibcalls

The exit block (to which every return artificially jumps) already has
a use of LR.  The LR use in all returns and sibcalls is an anachronism,
probably made unnecessary by the dataflow merge.  The simple_returns
that shrink-wrapping generates also do not have such a use.  Newer
backends do not do this either it seems.

With this use removed, a normal return is no longer a parallel but just
a return insn, and cfgcleanup then can transform conditional jumps to
those into conditional returns.

This splits the return emission code with restoring_FPRs_inline from
that without it; this is simpler code, fewer lines, and less indentation.

The return_internal_<mode> pattern can now be deleted since nothing uses
it anymore.

* config/rs6000/rs6000.c (rs6000_emit_epilogue): Do not emit
USEs of LR_REGNO in returns and sibcalls.
(rs6000_output_mi_thunk): Similar.
(rs6000_sibcall_aix): Similar.
* config/rs6000/rs6000.md (sibcall, sibcall_value, sibcall_local32,
sibcall_local64, sibcall_value_local32, sibcall_value_local64,
sibcall_nonlocal_sysv<mode>, sibcall_value_nonlocal_sysv<mode>):
Remove the USE of LR_REGNO from the patterns as well.  Delete an
obsolete comment.
(return_internal_<mode>): Delete.

From-SVN: r239866
gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md