This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/31944] Endless loop while building a 64-bit 2.6.20 kernel
- From: "danglin at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 20 May 2007 18:02:26 -0000
- Subject: [Bug rtl-optimization/31944] Endless loop while building a 64-bit 2.6.20 kernel
- References: <bug-31944-8932@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- 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