shrink-wrap: New spread_components
commit89012c8bc5edbede026c625da65488517f9b91eb
authorsegher <segher@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Nov 2016 02:19:04 +0000 (29 02:19 +0000)
committersegher <segher@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 29 Nov 2016 02:19:04 +0000 (29 02:19 +0000)
treeca3c425636e87de9510053dab45590b1ad003c86
parent1938afa6d531eb59e1646504d49a1550598fe89e
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@242948 138bc75d-0d04-0410-961f-82ee72b054a4
gcc/ChangeLog
gcc/shrink-wrap.c