var-tracking.c (vars_copy_1): Cleanup and speedup chain operations.
authorJosef Zlomek <zlomekj@suse.cz>
Thu, 11 Mar 2004 06:45:11 +0000 (07:45 +0100)
committerJosef Zlomek <zlomek@gcc.gnu.org>
Thu, 11 Mar 2004 06:45:11 +0000 (06:45 +0000)
* var-tracking.c (vars_copy_1): Cleanup and speedup chain operations.
(vars_copy): Likewise.
(variable_union): Likewise.
(set_variable_part): Likewise.
(delete_variable_part): Likewise.

From-SVN: r79304

gcc/ChangeLog
gcc/var-tracking.c

index 0eca03a925eb790050ade2fb121d311f6cce6399..c1df556d0324d5be171c24aeac003a3023a86613 100644 (file)
@@ -1,3 +1,11 @@
+2004-03-11  Josef Zlomek  <zlomekj@suse.cz>
+
+       * var-tracking.c (vars_copy_1): Cleanup and speedup chain operations.
+       (vars_copy): Likewise.
+       (variable_union): Likewise.
+       (set_variable_part): Likewise.
+       (delete_variable_part): Likewise.
+
 2004-03-11  Kazu Hirata  <kazu@cs.umass.edu>
 
        * c-typeck.c, combine.c, cse.c, dominance.c, et-forest.h,
index 2d2426272261f1a5ff403312b062310ab6460575..5b586bc55aa2fa7f813183e1ef365a9325e1ec3f 100644 (file)
@@ -752,10 +752,11 @@ vars_copy_1 (void **slot, void *data)
 
   for (i = 0; i < var->n_var_parts; i++)
     {
-      location_chain last, node;
+      location_chain node;
+      location_chain *nextp;
 
       var->var_part[i].offset = src->var_part[i].offset;
-      last = NULL;
+      nextp = &var->var_part[i].loc_chain;
       for (node = src->var_part[i].loc_chain; node; node = node->next)
        {
          location_chain new_lc;
@@ -764,11 +765,8 @@ vars_copy_1 (void **slot, void *data)
          new_lc->next = NULL;
          new_lc->loc = node->loc;
 
-         if (last)
-           last->next = new_lc;
-         else
-           var->var_part[i].loc_chain = new_lc;
-         last = new_lc;
+         *nextp = new_lc;
+         nextp = &new_lc->next;
        }
 
       /* We are at the basic block boundary when copying variable description
@@ -798,33 +796,29 @@ vars_copy (htab_t dst, htab_t src)
 static void
 var_reg_delete_and_set (dataflow_set *set, rtx loc)
 {
-  attrs *reg = &set->regs[REGNO (loc)];
   tree decl = REG_EXPR (loc);
   HOST_WIDE_INT offset = REG_OFFSET (loc);
-  attrs node, prev, next;
+  attrs node, next;
+  attrs *nextp;
 
-  prev = NULL;
-  for (node = *reg; node; node = next)
+  nextp = &set->regs[REGNO (loc)];
+  for (node = *nextp; node; node = next)
     {
       next = node->next;
       if (node->decl != decl || node->offset != offset)
        {
          delete_variable_part (set, node->loc, node->decl, node->offset);
-
-         if (prev)
-           prev->next = next;
-         else
-           *reg = next;
          pool_free (attrs_pool, node);
+         *nextp = next;
        }
       else
        {
          node->loc = loc;
-         prev = node;
+         nextp = &node->next;
        }
     }
-  if (*reg == NULL)
-    attrs_list_insert (reg, decl, offset, loc);
+  if (set->regs[REGNO (loc)] == NULL)
+    attrs_list_insert (&set->regs[REGNO (loc)], decl, offset, loc);
   set_variable_part (set, loc, decl, offset);
 }
 
@@ -1112,9 +1106,10 @@ variable_union (void **slot, void *data)
                && src->var_part[i].offset > dst->var_part[j].offset)
               || j < 0)
        {
-         location_chain last = NULL;
+         location_chain *nextp;
 
          /* Copy the chain from SRC.  */
+         nextp = &dst->var_part[k].loc_chain;
          for (node = src->var_part[i].loc_chain; node; node = node->next)
            {
              location_chain new_lc;
@@ -1123,11 +1118,8 @@ variable_union (void **slot, void *data)
              new_lc->next = NULL;
              new_lc->loc = node->loc;
 
-             if (last)
-               last->next = new_lc;
-             else
-               dst->var_part[k].loc_chain = new_lc;
-             last = new_lc;
+             *nextp = new_lc;
+             nextp = &new_lc->next;
            }
 
          dst->var_part[k].offset = src->var_part[i].offset;
@@ -1863,7 +1855,8 @@ static void
 set_variable_part (dataflow_set *set, rtx loc, tree decl, HOST_WIDE_INT offset)
 {
   int pos, low, high;
-  location_chain node, prev, next;
+  location_chain node, next;
+  location_chain *nextp;
   variable var;
   void **slot;
   
@@ -1922,7 +1915,7 @@ set_variable_part (dataflow_set *set, rtx loc, tree decl, HOST_WIDE_INT offset)
     }
 
   /* Delete the location from list.  */
-  prev = NULL;
+  nextp = &var->var_part[pos].loc_chain;
   for (node = var->var_part[pos].loc_chain; node; node = next)
     {
       next = node->next;
@@ -1930,15 +1923,12 @@ set_variable_part (dataflow_set *set, rtx loc, tree decl, HOST_WIDE_INT offset)
           && REGNO (node->loc) == REGNO (loc))
          || rtx_equal_p (node->loc, loc))
        {
-         if (prev)
-           prev->next = next;
-         else
-           var->var_part[pos].loc_chain = next;
          pool_free (loc_chain_pool, node);
+         *nextp = next;
          break;
        }
       else
-       prev = node;
+       nextp = &node->next;
     }
 
   /* Add the location to the beginning.  */
@@ -1987,27 +1977,25 @@ delete_variable_part (dataflow_set *set, rtx loc, tree decl,
 
       if (pos < var->n_var_parts && var->var_part[pos].offset == offset)
        {
-         location_chain node, prev, next;
+         location_chain node, next;
+         location_chain *nextp;
          bool changed;
 
          /* Delete the location part.  */
-         prev = NULL;
-         for (node = var->var_part[pos].loc_chain; node; node = next)
+         nextp = &var->var_part[pos].loc_chain;
+         for (node = *nextp; node; node = next)
            {
              next = node->next;
              if ((GET_CODE (node->loc) == REG && GET_CODE (loc) == REG
                   && REGNO (node->loc) == REGNO (loc))
                  || rtx_equal_p (node->loc, loc))
                {
-                 if (prev)
-                   prev->next = next;
-                 else
-                   var->var_part[pos].loc_chain = next;
                  pool_free (loc_chain_pool, node);
+                 *nextp = next;
                  break;
                }
              else
-               prev = node;
+               nextp = &node->next;
            }
 
          /* If we have deleted the location which was last emitted