* 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
+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.
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))
{
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
df_scan_alloc (NULL);
df_scan_blocks ();
+ if (optimize > 1)
+ {
+ df_live_add_problem ();
+ df_live_set_all_dirty ();
+ }
+
if (optimize)
df_analyze ();