aboutsummaryrefslogtreecommitdiff
path: root/gcc/var-tracking.c
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2006-09-11 21:30:07 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2006-09-11 14:30:07 -0700
commitd30673031579bf894eb1dc702ea892e0a32c0741 (patch)
tree69d583e945cfa0140121097b07485cc8d04a1563 /gcc/var-tracking.c
parentb7886f1470bf8748ad22464177463f19f6376a19 (diff)
downloadgcc-d30673031579bf894eb1dc702ea892e0a32c0741.zip
gcc-d30673031579bf894eb1dc702ea892e0a32c0741.tar.gz
gcc-d30673031579bf894eb1dc702ea892e0a32c0741.tar.bz2
re PR target/28672 (Gcc went into infinite loop when building libstdc++)
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. From-SVN: r116859
Diffstat (limited to 'gcc/var-tracking.c')
-rw-r--r--gcc/var-tracking.c30
1 files changed, 27 insertions, 3 deletions
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index e33950e..815faca 100644
--- a/gcc/var-tracking.c
+++ b/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, rtx loc, tree decl,
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);
+ }
}
}
}