File nvl199137.patch of Package libgcj41

Fix #199137 caused by the fixes for #189571
2006-09-11  Alexandre Oliva  <aoliva@redhat.com>

        PR target/28672
        * var-tracking.c (dump_dataflow_set): Start dumping at
        register zero.
        (clobber_variable_part): Kill only the variable part in
        registers holding it, leaving other variables alone.

Index: gcc-4_1-branch/gcc/var-tracking.c
===================================================================
--- gcc-4_1-branch.orig/gcc/var-tracking.c
+++ gcc-4_1-branch/gcc/var-tracking.c
@@ -1960,7 +1960,7 @@ dump_dataflow_set (dataflow_set *set)
 
   fprintf (dump_file, "Stack adjustment: " HOST_WIDE_INT_PRINT_DEC "\n",
 	   set->stack_adjust);
-  for (i = 1; i < FIRST_PSEUDO_REGISTER; i++)
+  for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
     {
       if (set->regs[i])
 	{
@@ -2212,8 +2212,32 @@ clobber_variable_part (dataflow_set *set
 	  for (node = next; node; node = next)
 	    {
 	      next = node->next;
-	      if (REG_P (node->loc) && node->loc != loc)
-		var_reg_delete (set, node->loc, false);
+	      if (node->loc != loc)
+		{
+		  if (REG_P (node->loc))
+		    {
+		      attrs anode, anext;
+		      attrs *anextp;
+
+		      /* Remove the variable part from the register's
+			 list, but preserve any other variable parts
+			 that might be regarded as live in that same
+			 register.  */
+		      anextp = &set->regs[REGNO (node->loc)];
+		      for (anode = *anextp; anode; anode = anext)
+			{
+			  anext = anode->next;
+			  if (anode->decl == decl
+			      && anode->offset == offset)
+			    {
+			      pool_free (attrs_pool, anode);
+			      *anextp = anext;
+			    }
+			}
+		    }
+
+		  delete_variable_part (set, node->loc, decl, offset);
+		}
 	    }
 	}
     }
openSUSE Build Service is sponsored by