rs6000: Separate shrink-wrapping for the TOC register
authorSegher Boessenkool <segher@kernel.crashing.org>
Thu, 9 Nov 2017 15:53:41 +0000 (16:53 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Thu, 9 Nov 2017 15:53:41 +0000 (16:53 +0100)
commitd7871114286c18b184f5fca2ff1506927f6cc3cf
treea7d8e9fe00b298f4cc5b16784f33744a0092ef95
parent4d99a8487287e94b9bd42807cbe864991a0d1d3b
rs6000: Separate shrink-wrapping for the TOC register

This makes the TOC register save a component.  If -msave-toc-indirect
is not explicitly disabled, it enables it, and then moves the prologue
code generated for that to a better place.  So far this only matters
for indirect calls (for direct calls the save is done in the PLT stub).
The restore is always done directly after the bl insn (the compiler
generates a nop there, the linker replaces it with a load).

* config/rs6000/rs6000.c (machine_function): Add a bool,
"toc_is_wrapped_separately".
(rs6000_option_override_internal): Enable OPTION_MASK_SAVE_TOC_INDIRECT
if it wasn't explicitly set or unset, we are optimizing for speed, and
doing separate shrink-wrapping.
(rs6000_get_separate_components): Enable the TOC component if
saving the TOC register in the prologue.
(rs6000_components_for_bb): Handle the TOC component.
(rs6000_emit_prologue_components): Store the TOC register where needed.
(rs6000_set_handled_components): Mark TOC as handled, if handled.
(rs6000_emit_prologue): Don't save the TOC if that is already done.

From-SVN: r254599
gcc/ChangeLog
gcc/config/rs6000/rs6000.c