------- 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