diff options
| -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 161dba3f8b0..9cc5d53db73 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. diff --git a/gcc/cse.c b/gcc/cse.c index bb898d0498c..e322ec7fbb8 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -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))  	  {  | 

