[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