]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
var-tracking.c (var_reg_delete): Don't delete the association between REGs and values...
authorAlexandre Oliva <aoliva@redhat.com>
Thu, 14 Jan 2010 22:39:25 +0000 (22:39 +0000)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 14 Jan 2010 22:39:25 +0000 (23:39 +0100)
* var-tracking.c (var_reg_delete): Don't delete the association
between REGs and values or one-part variables if the register
isn't clobbered.

From-SVN: r155918

gcc/ChangeLog
gcc/var-tracking.c

index 85841837fc5ac1a82770d7d4e4ffc48d91c0c942..ce49f3683a6bda62eb36b7abc78f37f0d0032da9 100644 (file)
@@ -1,3 +1,9 @@
+2010-01-14  Alexandre Oliva  <aoliva@redhat.com>
+
+       * var-tracking.c (var_reg_delete): Don't delete the association
+       between REGs and values or one-part variables if the register
+       isn't clobbered.
+
 2010-01-14  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/42657
index 0822fecab34af2e2ee7765362fba1439d71c722a..e5f95d97fcfbe0e39ed7e0768a51986648c7c554 100644 (file)
@@ -1401,14 +1401,15 @@ var_reg_delete_and_set (dataflow_set *set, rtx loc, bool modify,
   var_reg_set (set, loc, initialized, set_src);
 }
 
-/* Delete current content of register LOC in dataflow set SET.  If
-   CLOBBER is true, also delete any other live copies of the same
-   variable part.  */
+/* Delete the association of register LOC in dataflow set SET with any
+   variables that aren't onepart.  If CLOBBER is true, also delete any
+   other live copies of the same variable part, and delete the
+   association with onepart dvs too.  */
 
 static void
 var_reg_delete (dataflow_set *set, rtx loc, bool clobber)
 {
-  attrs *reg = &set->regs[REGNO (loc)];
+  attrs *nextp = &set->regs[REGNO (loc)];
   attrs node, next;
 
   if (clobber)
@@ -1421,13 +1422,18 @@ var_reg_delete (dataflow_set *set, rtx loc, bool clobber)
       clobber_variable_part (set, NULL, dv_from_decl (decl), offset, NULL);
     }
 
-  for (node = *reg; node; node = next)
+  for (node = *nextp; node; node = next)
     {
       next = node->next;
-      delete_variable_part (set, node->loc, node->dv, node->offset);
-      pool_free (attrs_pool, node);
+      if (clobber || !dv_onepart_p (node->dv))
+       {
+         delete_variable_part (set, node->loc, node->dv, node->offset);
+         pool_free (attrs_pool, node);
+         *nextp = next;
+       }
+      else
+       nextp = &node->next;
     }
-  *reg = NULL;
 }
 
 /* Delete content of register with number REGNO in dataflow set SET.  */