[Bug rtl-optimization/31944] Endless loop while building a 64-bit 2.6.20 kernel
danglin at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Sun May 20 18:02:00 GMT 2007
------- Comment #5 from danglin at gcc dot gnu dot org 2007-05-20 19:02 -------
In order to prevent flush_hash_table from looping forever, the call to
invalidate (p->exp, VOIDmode) has to remove the element p. However, this
doesn't happen. It only removes the entry if lookup_for_remove finds the
pseudo:
/* Because a register can be referenced in more than one mode,
we might have to remove more than one table entry. */
struct table_elt *elt;
while ((elt = lookup_for_remove (x, hash, GET_MODE (x))))
remove_from_table (elt, hash);
For some reason, reg:DI 66 isn't found:
(gdb) p lookup_for_remove (0x800003fffec89d00, 29, DImode)
$20 = (struct table_elt *) 0x0
I'm thinking that flush_hash_table should check p after calling invalidate
and call remove_from_table if it's nonzero.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31944
More information about the Gcc-bugs
mailing list