OSDN Git Service

* regrename.c (kill_value_regno): Simplify chain removal.
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 14 Dec 2001 06:47:56 +0000 (06:47 +0000)
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 14 Dec 2001 06:47:56 +0000 (06:47 +0000)
        (kill_value): Kill all of HARD_REGNO_NREGS.
        (kill_set_value): Use kill_value not kill_value_regno.
        (kill_autoinc_value): Likewise.
        (copyprop_hardreg_forward): Don't collect refresh_blocks.
        Call delete_noop_moves.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47992 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/regrename.c

index f02961d..c91c357 100644 (file)
@@ -1,3 +1,12 @@
+2001-12-13  Richard Henderson  <rth@redhat.com>
+
+       * regrename.c (kill_value_regno): Simplify chain removal.
+       (kill_value): Kill all of HARD_REGNO_NREGS.
+       (kill_set_value): Use kill_value not kill_value_regno.
+       (kill_autoinc_value): Likewise.
+       (copyprop_hardreg_forward): Don't collect refresh_blocks.
+       Call delete_noop_moves.
+
 2001-12-13  Aldy Hernandez  <aldyh@redhat.com>
 
         * attribs.c (c_common_attribute_table): Swap decl_req and type_req
index 69e267c..e6aa8c8 100644 (file)
@@ -1025,16 +1025,7 @@ kill_value_regno (regno, vd)
           vd->e[i].next_regno != regno;
           i = vd->e[i].next_regno)
        continue;
-
-      next = vd->e[regno].next_regno;
-      while (1)
-       {
-         vd->e[i].next_regno = next;
-         if (next == INVALID_REGNUM)
-           break;
-         i = next;
-         next = vd->e[next].next_regno;
-       }
+      vd->e[i].next_regno = vd->e[regno].next_regno;
     }
   else if ((next = vd->e[regno].next_regno) != INVALID_REGNUM)
     {
@@ -1052,7 +1043,7 @@ kill_value_regno (regno, vd)
 }
 
 /* Kill X.  This is a convenience function for kill_value_regno
-   so that we don't have to check that X is a register first.  */
+   so that we mind the mode the register is in.  */
 
 static void
 kill_value (x, vd)
@@ -1060,7 +1051,14 @@ kill_value (x, vd)
      struct value_data *vd;
 {
   if (REG_P (x))
-    kill_value_regno (REGNO (x), vd);
+    {
+      unsigned int regno = REGNO (x);
+      unsigned int n = HARD_REGNO_NREGS (regno, GET_MODE (x));
+      unsigned int i;
+
+      for (i = 0; i < n; ++i)
+       kill_value_regno (regno + i, vd);
+    }
 }
 
 /* Initialize VD such that there are no known relationships between regs.  */
@@ -1103,9 +1101,8 @@ kill_set_value (x, set, data)
   struct value_data *vd = data;
   if (GET_CODE (set) != CLOBBER && REG_P (x))
     {
-      unsigned int regno = REGNO (x);
-      kill_value_regno (regno, vd);
-      vd->e[regno].mode = GET_MODE (x);
+      kill_value (x, vd);
+      vd->e[REGNO (x)].mode = GET_MODE (x);
     }
 }
 
@@ -1123,9 +1120,9 @@ kill_autoinc_value (px, data)
 
   if (GET_RTX_CLASS (GET_CODE (x)) == 'a')
     {
-      unsigned int regno = REGNO (XEXP (x, 0));
-      kill_value_regno (regno, vd);
-      vd->e[regno].mode = Pmode;
+      x = XEXP (x, 0);
+      kill_value (x, vd);
+      vd->e[REGNO (x)].mode = Pmode;
       return -1;
     }
 
@@ -1547,13 +1544,11 @@ copyprop_hardreg_forward_1 (bb, vd)
 void
 copyprop_hardreg_forward ()
 {
-  int b, need_refresh;
-  sbitmap refresh_blocks;
   struct value_data *all_vd;
+  bool need_refresh;
+  int b;
 
-  refresh_blocks = sbitmap_alloc (n_basic_blocks);
-  sbitmap_zero (refresh_blocks);
-  need_refresh = 0;
+  need_refresh = false;
 
   all_vd = xmalloc (sizeof (struct value_data) * n_basic_blocks);
 
@@ -1574,10 +1569,7 @@ copyprop_hardreg_forward ()
         init_value_data (all_vd + b);
 
       if (copyprop_hardreg_forward_1 (bb, all_vd + b))
-       {
-         SET_BIT (refresh_blocks, b);
-         need_refresh = 1;
-       }
+       need_refresh = true;
     }
 
   if (need_refresh)
@@ -1585,13 +1577,16 @@ copyprop_hardreg_forward ()
       if (rtl_dump_file)
        fputs ("\n\n", rtl_dump_file);
 
-      update_life_info (refresh_blocks, UPDATE_LIFE_GLOBAL_RM_NOTES,
+      /* ??? Irritatingly, delete_noop_moves does not take a set of blocks
+        to scan, so we have to do a life update with no initial set of
+        blocks Just In Case.  */
+      delete_noop_moves (get_insns ());
+      update_life_info (NULL, UPDATE_LIFE_GLOBAL_RM_NOTES,
                        PROP_DEATH_NOTES
                        | PROP_SCAN_DEAD_CODE
                        | PROP_KILL_DEAD_CODE);
     }
 
-  sbitmap_free (refresh_blocks);
   free (all_vd);
 }