diff options
author | steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-10-28 11:52:11 +0000 |
---|---|---|
committer | steven <steven@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-10-28 11:52:11 +0000 |
commit | 1d0c11b81e44e87b391857fc4ea9af0d01a98047 (patch) | |
tree | 33dd73f7055ebe2827ac8d5bbc019cafd1b54a0e | |
parent | 884d4e9ce36d47c3ca9eef1792cb7bbe68a364c2 (diff) | |
download | ppe42-gcc-1d0c11b81e44e87b391857fc4ea9af0d01a98047.tar.gz ppe42-gcc-1d0c11b81e44e87b391857fc4ea9af0d01a98047.zip |
PR rtl-optimization/38711
* ira.c (ira): Remove DF_LIVE if the problem is in the stack.
(do_reload): Add it back at the end for -O2 and higher.
* function.c (thread_prologue_and_epilogue_insns): Use
REG_SET_TO_HARD_REG_SET instead of CLEAR_HARD_REG_SET and
reg_set_to_hard_reg_set.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192890 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/function.c | 3 | ||||
-rw-r--r-- | gcc/ira.c | 16 |
3 files changed, 27 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1e6f1fd8d98..3ed5d44aca4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2012-10-28 Steven Bosscher <steven@gcc.gnu.org> + + PR rtl-optimization/38711 + * ira.c (ira): Remove DF_LIVE if the problem is in the stack. + (do_reload): Add it back at the end for -O2 and higher. + + * function.c (thread_prologue_and_epilogue_insns): Use + REG_SET_TO_HARD_REG_SET instead of CLEAR_HARD_REG_SET and + reg_set_to_hard_reg_set. + 2012-10-28 Jan Hubicka <jh@suse.cz> * ipa-inline.c (edge_badness): Reduce precision; use scc hints. diff --git a/gcc/function.c b/gcc/function.c index 9efbc3ad270..e23ac91daf3 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -6176,8 +6176,7 @@ thread_prologue_and_epilogue_insns (void) CLEAR_HARD_REG_BIT (prologue_clobbered, STACK_POINTER_REGNUM); if (frame_pointer_needed) CLEAR_HARD_REG_BIT (prologue_clobbered, HARD_FRAME_POINTER_REGNUM); - CLEAR_HARD_REG_SET (live_on_edge); - reg_set_to_hard_reg_set (&live_on_edge, + REG_SET_TO_HARD_REG_SET (live_on_edge, df_get_live_in (entry_edge->dest)); if (hard_reg_set_intersect_p (live_on_edge, prologue_clobbered)) { diff --git a/gcc/ira.c b/gcc/ira.c index 9a8b098cf48..8dcdbf57549 100644 --- a/gcc/ira.c +++ b/gcc/ira.c @@ -4399,6 +4399,16 @@ ira (FILE *f) setup_prohibited_mode_move_regs (); df_note_add_problem (); + + /* DF_LIVE can't be used in the register allocator, too many other + parts of the compiler depend on using the "classic" liveness + interpretation of the DF_LR problem. See PR38711. + Remove the problem, so that we don't spend time updating it in + any of the df_analyze() calls during IRA/LRA. */ + if (optimize > 1) + df_remove_problem (df_live); + gcc_checking_assert (df_live == NULL); + #ifdef ENABLE_CHECKING df->changeable_flags |= DF_VERIFY_SCHEDULED; #endif @@ -4678,6 +4688,12 @@ do_reload (void) df_scan_alloc (NULL); df_scan_blocks (); + if (optimize > 1) + { + df_live_add_problem (); + df_live_set_all_dirty (); + } + if (optimize) df_analyze (); |