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
This commit is contained in:
Alexandre Oliva 2006-09-11 21:30:07 +00:00 committed by H.J. Lu
parent b7886f1470
commit d306730315
2 changed files with 35 additions and 3 deletions

View File

@ -1,3 +1,11 @@
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.
2006-09-11 Josh Triplett <josh@freedesktop.org> 2006-09-11 Josh Triplett <josh@freedesktop.org>
* doc/extend.texi (Other Builtins): Actually use the macro * doc/extend.texi (Other Builtins): Actually use the macro

View File

@ -1960,7 +1960,7 @@ dump_dataflow_set (dataflow_set *set)
fprintf (dump_file, "Stack adjustment: " HOST_WIDE_INT_PRINT_DEC "\n", fprintf (dump_file, "Stack adjustment: " HOST_WIDE_INT_PRINT_DEC "\n",
set->stack_adjust); set->stack_adjust);
for (i = 1; i < FIRST_PSEUDO_REGISTER; i++) for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
{ {
if (set->regs[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) for (node = next; node; node = next)
{ {
next = node->next; next = node->next;
if (REG_P (node->loc) && node->loc != loc) if (node->loc != loc)
var_reg_delete (set, node->loc, false); {
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);
}
} }
} }
} }