shrink-wrap: New spread_components
authorSegher Boessenkool <segher@kernel.crashing.org>
Tue, 29 Nov 2016 02:19:04 +0000 (03:19 +0100)
committerSegher Boessenkool <segher@gcc.gnu.org>
Tue, 29 Nov 2016 02:19:04 +0000 (03:19 +0100)
commit08dd2b683f98c6a721329f02f16a9a815a143f48
treeca3c425636e87de9510053dab45590b1ad003c86
parenta001d4f9b912362c78e38ba3ea6aeddaa97f8eb8
shrink-wrap: New spread_components

This patch changes spread_components to use a simpler algorithm that
puts prologue components as early as possible, and epilogue components
as late as possible.  This allows better scheduling, and also saves a
bit of code size.  The blocks that run with some specific component
enabled after this patch is a strict superset of those that had it
before the patch.

It does this by finding for every component the basic blocks where that
component is not needed on some path from the entry block (it reuses
head_components to store this), and similarly the blocks where the
component is not needed on some path to the exit block (or the exit can
not be reached from that block) (stored in tail_components).  Blocks
that then are not in both of those two sets get the component active.

* shrink-wrap.c (init_separate_shrink_wrap): Do not clear
head_components and tail_components.
(spread_components): New algorithm.
(emit_common_tails_for_components): Clear head_components and
tail_components.
(insert_prologue_epilogue_for_components): Write extra output to the
dump file for sibcalls and abnormal exits.

From-SVN: r242948
gcc/ChangeLog
gcc/shrink-wrap.c