aboutsummaryrefslogtreecommitdiff
path: root/gcc/shrink-wrap.c
diff options
context:
space:
mode:
authorSegher Boessenkool <segher@kernel.crashing.org>2016-11-16 16:23:36 +0100
committerSegher Boessenkool <segher@gcc.gnu.org>2016-11-16 16:23:36 +0100
commit7157aa8583f7ca32d5bee783e83103da92e3a1f3 (patch)
tree21e2efc1ded38ef3fcce361644e9b761e392f183 /gcc/shrink-wrap.c
parent307ca54339bfce88e67f7e446ee4bbf5f1961eba (diff)
downloadgcc-7157aa8583f7ca32d5bee783e83103da92e3a1f3.zip
gcc-7157aa8583f7ca32d5bee783e83103da92e3a1f3.tar.gz
gcc-7157aa8583f7ca32d5bee783e83103da92e3a1f3.tar.bz2
df: Change defs in entry and uses in exit block during separate shrink-wrapping
So far all target implementations of the separate shrink-wrapping hooks use the DF LIVE info to figure out around which basic blocks the non- volatile registers need to be saved. This is done by looking at the IN+GEN+KILL sets of the basic blocks. However, that doesn't work for registers that DF says are defined in the entry block, or used in the exit block. This patch introduces a local flag DF_SCAN_EMPTY_ENTRY_EXIT that says no registers should be defined in the entry block, and none used in the exit block. It also makes try_shrink_wrapping_separate use it. The rs6000 port is changed to use IN+GEN+KILL for the LR component. * config/rs6000/rs6000.c (rs6000_components_for_bb): Mark the LR component as used also if LR_REGNO is a live input to the bb. * df-scan.c (df_get_entry_block_def_set): Return immediately after clearing the set if DF_SCAN_EMPTY_ENTRY_EXIT is set. (df_get_exit_block_use_set): Ditto. * df.h (df_scan_flags): New enum. * shrink-wrap.c (try_shrink_wrapping_separate): Set DF_SCAN_EMPTY_ENTRY_EXIT in df_scan->local_flags, and call df_update_entry_block_defs and df_update_exit_block_uses at the start; clear the flag and call those functions at the end. From-SVN: r242497
Diffstat (limited to 'gcc/shrink-wrap.c')
-rw-r--r--gcc/shrink-wrap.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/gcc/shrink-wrap.c b/gcc/shrink-wrap.c
index 4395d8a..6996d25 100644
--- a/gcc/shrink-wrap.c
+++ b/gcc/shrink-wrap.c
@@ -1682,7 +1682,13 @@ try_shrink_wrapping_separate (basic_block first_bb)
if (!components)
return;
- /* We need LIVE info. */
+ /* We need LIVE info, not defining anything in the entry block and not
+ using anything in the exit block. A block then needs a component if
+ the register for that component is in the IN or GEN or KILL set for
+ that block. */
+ df_scan->local_flags |= DF_SCAN_EMPTY_ENTRY_EXIT;
+ df_update_entry_block_defs ();
+ df_update_exit_block_uses ();
df_live_add_problem ();
df_live_set_all_dirty ();
df_analyze ();
@@ -1748,9 +1754,10 @@ try_shrink_wrapping_separate (basic_block first_bb)
free_dominance_info (CDI_DOMINATORS);
free_dominance_info (CDI_POST_DOMINATORS);
- if (crtl->shrink_wrapped_separate)
- {
- df_live_set_all_dirty ();
- df_analyze ();
- }
+ /* All done. */
+ df_scan->local_flags &= ~DF_SCAN_EMPTY_ENTRY_EXIT;
+ df_update_entry_block_defs ();
+ df_update_exit_block_uses ();
+ df_live_set_all_dirty ();
+ df_analyze ();
}