PR rtl-optimization/38711
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 28 Oct 2012 11:52:11 +0000 (11:52 +0000)
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 28 Oct 2012 11:52:11 +0000 (11:52 +0000)
* 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

gcc/ChangeLog
gcc/function.c
gcc/ira.c

index 1e6f1fd..3ed5d44 100644 (file)
@@ -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.
index 9efbc3a..e23ac91 100644 (file)
@@ -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))
            {
index 9a8b098..8dcdbf5 100644 (file)
--- 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 ();