df-problems.c (df_kill_notes): Split up in two functions.
authorSteven Bosscher <steven@gcc.gnu.org>
Wed, 17 Oct 2012 06:15:38 +0000 (06:15 +0000)
committerSteven Bosscher <steven@gcc.gnu.org>
Wed, 17 Oct 2012 06:15:38 +0000 (06:15 +0000)
* df-problems.c (df_kill_notes): Split up in two functions.
(df_remove_dead_and_unused_notes): New function, first half of
df_kill notes to remove all REG_DEAD and REG_UNUSED notes.
(df_remove_dead_eq_notes): New function, second half of df_kill_notes
to remove REG_EQUAL and REG_EQUIV notes referring to dead registers.
(df_note_bb_compute): Call df_remove_dead_and_unused_notes instead
of df_kill_notes.  Call df_remove_dead_eq_notes after processing insn.

* web.c (web): Re-add DF_RD_PRUNE_DEAD_DEFS;

From-SVN: r192526

gcc/ChangeLog
gcc/df-problems.c
gcc/web.c

index 5bef03d..72b9e14 100644 (file)
@@ -1,3 +1,15 @@
+2012-10-16  Steven Bosscher  <steven@gcc.gnu.org>
+
+       * df-problems.c (df_kill_notes): Split up in two functions.
+       (df_remove_dead_and_unused_notes): New function, first half of
+       df_kill notes to remove all REG_DEAD and REG_UNUSED notes.
+       (df_remove_dead_eq_notes): New function, second half of df_kill_notes
+       to remove REG_EQUAL and REG_EQUIV notes referring to dead registers.
+       (df_note_bb_compute): Call df_remove_dead_and_unused_notes instead
+       of df_kill_notes.  Call df_remove_dead_eq_notes after processing insn.
+
+       * web.c (web): Re-add DF_RD_PRUNE_DEAD_DEFS;
+
 2012-10-16  Ian Lance Taylor  <iant@google.com>
 
        * doc/extend.texi (Return Address): Change
index b4df2ba..3f9228d 100644 (file)
@@ -2822,13 +2822,10 @@ df_ignore_stack_reg (int regno ATTRIBUTE_UNUSED)
 #endif
 
 
-/* Remove all of the REG_DEAD or REG_UNUSED notes from INSN and add
-   them to OLD_DEAD_NOTES and OLD_UNUSED_NOTES.  Remove also
-   REG_EQUAL/REG_EQUIV notes referring to dead pseudos using LIVE
-   as the bitmap of currently live registers.  */
+/* Remove all of the REG_DEAD or REG_UNUSED notes from INSN.  */
 
 static void
-df_kill_notes (rtx insn, bitmap live)
+df_remove_dead_and_unused_notes (rtx insn)
 {
   rtx *pprev = &REG_NOTES (insn);
   rtx link = *pprev;
@@ -2873,6 +2870,27 @@ df_kill_notes (rtx insn, bitmap live)
            }
          break;
 
+       default:
+         pprev = &XEXP (link, 1);
+         link = *pprev;
+         break;
+       }
+    }
+}
+
+/* Remove REG_EQUAL/REG_EQUIV notes referring to dead pseudos using LIVE
+   as the bitmap of currently live registers.  */
+
+static void
+df_remove_dead_eq_notes (rtx insn, bitmap live)
+{
+  rtx *pprev = &REG_NOTES (insn);
+  rtx link = *pprev;
+
+  while (link)
+    {
+      switch (REG_NOTE_KIND (link))
+       {
        case REG_EQUAL:
        case REG_EQUIV:
          {
@@ -2913,6 +2931,7 @@ df_kill_notes (rtx insn, bitmap live)
              }
            break;
          }
+
        default:
          pprev = &XEXP (link, 1);
          link = *pprev;
@@ -2921,7 +2940,6 @@ df_kill_notes (rtx insn, bitmap live)
     }
 }
 
-
 /* Set a NOTE_TYPE note for REG in INSN.  */
 
 static inline void
@@ -3195,7 +3213,7 @@ df_note_bb_compute (unsigned int bb_index,
       debug_insn = DEBUG_INSN_P (insn);
 
       bitmap_clear (do_not_gen);
-      df_kill_notes (insn, live);
+      df_remove_dead_and_unused_notes (insn);
 
       /* Process the defs.  */
       if (CALL_P (insn))
@@ -3336,6 +3354,8 @@ df_note_bb_compute (unsigned int bb_index,
            }
        }
 
+      df_remove_dead_eq_notes (insn, live);
+
       if (debug_insn == -1)
        {
          /* ??? We could probably do better here, replacing dead
index 2816681..d565634 100644 (file)
--- a/gcc/web.c
+++ b/gcc/web.c
@@ -336,8 +336,7 @@ web_main (void)
   rtx insn;
 
   df_set_flags (DF_NO_HARD_REGS + DF_EQ_NOTES);
-  /* We can not RD_PRUNE_DEAD_DEFS, because we care about REG_EQUAL
-     notes.  */
+  df_set_flags (DF_RD_PRUNE_DEAD_DEFS);
   df_chain_add_problem (DF_UD_CHAIN);
   df_analyze ();
   df_set_flags (DF_DEFER_INSN_RESCAN);