diff options
author | Bernd Schmidt <bernds@cygnus.co.uk> | 2000-03-16 17:13:49 +0000 |
---|---|---|
committer | Bernd Schmidt <crux@gcc.gnu.org> | 2000-03-16 17:13:49 +0000 |
commit | 22eb7dfafe19196ec284b6b73362bddbf80467e8 (patch) | |
tree | cc33e0646cb85e4d0811aaee858a5418364477a0 | |
parent | d9f324226541553d4ac2852d1e467f9238304eba (diff) | |
download | gcc-22eb7dfafe19196ec284b6b73362bddbf80467e8.zip gcc-22eb7dfafe19196ec284b6b73362bddbf80467e8.tar.gz gcc-22eb7dfafe19196ec284b6b73362bddbf80467e8.tar.bz2 |
Some cselib bug fixes
From-SVN: r32589
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/simplify-rtx.c | 16 |
2 files changed, 18 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 37dc67e..1650a80 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2000-03-16 Bernd Schmidt <bernds@cygnus.co.uk> + + * simplify-rtx.c (hash_rtx, case MEM/REG): Take into account that + HASH may already be nonzero. Add code/mode into hash value + immediately after repeat label. + (cselib_lookup): Don't leave the hash table in an inconsistent + state before a hash lookup operation. + Thu Mar 16 17:03:10 MET 2000 Jan Hubicka <jh@suse.cz> * i386.md (all HI and QI mode non-move patterns): Conditionize diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index f9ed931..08abf69 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -2435,14 +2435,15 @@ hash_rtx (x, mode, create) { cselib_val *e; int i, j; + enum rtx_code code; + const char *fmt; unsigned int hash = 0; - enum rtx_code code = GET_CODE (x); - const char *fmt = GET_RTX_FORMAT (code); /* repeat is used to turn tail-recursion into iteration. */ repeat: - code = GET_CODE (x); + hash += (unsigned) code + (unsigned) GET_MODE (x); + switch (code) { case MEM: @@ -2450,7 +2451,8 @@ hash_rtx (x, mode, create) e = cselib_lookup (x, GET_MODE (x), create); if (! e) return 0; - return e->value; + hash += e->value; + return hash; case CONST_INT: { @@ -2506,7 +2508,6 @@ hash_rtx (x, mode, create) } i = GET_RTX_LENGTH (code) - 1; - hash += (unsigned) code + (unsigned) GET_MODE (x); fmt = GET_RTX_FORMAT (code); for (; i >= 0; i--) { @@ -2765,8 +2766,11 @@ cselib_lookup (x, mode, create) return e; e = new_cselib_val (hashval, mode); - e->locs = new_elt_loc_list (e->locs, cselib_subst_to_values (x)); + /* We have to fill the slot before calling cselib_subst_to_values: + the hash table is inconsistent until we do so, and + cselib_subst_to_values will need to do lookups. */ *slot = (void *) e; + e->locs = new_elt_loc_list (e->locs, cselib_subst_to_values (x)); return e; } |