diff options
author | Richard Henderson <rth@redhat.com> | 2004-06-21 16:39:26 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2004-06-21 16:39:26 -0700 |
commit | a90fc8e0f36a0d855d46085d48b3f8c4c9a5698e (patch) | |
tree | 49088fd6a9e8184dc04437a6c07f6a9e4adb6534 | |
parent | 5088b05874bc5a93099751efb19abe213ce2d0d1 (diff) | |
download | gcc-a90fc8e0f36a0d855d46085d48b3f8c4c9a5698e.zip gcc-a90fc8e0f36a0d855d46085d48b3f8c4c9a5698e.tar.gz gcc-a90fc8e0f36a0d855d46085d48b3f8c4c9a5698e.tar.bz2 |
re PR rtl-optimization/16114 (Hang in cse.c (flush_hash_table))
PR rtl-opt/16114
* cse.c (merge_equiv_classes): Also rehash in response to
delete_reg_equiv changes.
(rehash_using_reg): Don't exclude REGs from rehashing.
From-SVN: r83463
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cse.c | 14 |
2 files changed, 16 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 161dba3..9cc5d53 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2004-06-21 Richard Henderson <rth@redhat.com> + PR rtl-opt/16114 + * cse.c (merge_equiv_classes): Also rehash in response to + delete_reg_equiv changes. + (rehash_using_reg): Don't exclude REGs from rehashing. + +2004-06-21 Richard Henderson <rth@redhat.com> + * c-common.def (RETURN_STMT): Remove. * c-common.h (RETURN_STMT_EXPR): Remove. (c_expand_return, build_return_stmt): Remove. @@ -1633,15 +1633,20 @@ merge_equiv_classes (struct table_elt *class1, struct table_elt *class2) hash code (it also isn't necessary). */ if (REG_P (exp) || exp_equiv_p (exp, exp, 1, 0)) { + bool need_rehash = false; + hash_arg_in_memory = 0; hash = HASH (exp, mode); if (REG_P (exp)) - delete_reg_equiv (REGNO (exp)); + { + need_rehash = (unsigned) REG_QTY (REGNO (exp)) != REGNO (exp); + delete_reg_equiv (REGNO (exp)); + } remove_from_table (elt, hash); - if (insert_regs (exp, class1, 0)) + if (insert_regs (exp, class1, 0) || need_rehash) { rehash_using_reg (exp); hash = HASH (exp, mode); @@ -1914,14 +1919,13 @@ rehash_using_reg (rtx x) return; /* Scan all hash chains looking for valid entries that mention X. - If we find one and it is in the wrong hash chain, move it. We can skip - objects that are registers, since they are handled specially. */ + If we find one and it is in the wrong hash chain, move it. */ for (i = 0; i < HASH_SIZE; i++) for (p = table[i]; p; p = next) { next = p->next_same_hash; - if (!REG_P (p->exp) && reg_mentioned_p (x, p->exp) + if (reg_mentioned_p (x, p->exp) && exp_equiv_p (p->exp, p->exp, 1, 0) && i != (hash = safe_hash (p->exp, p->mode) & HASH_MASK)) { |