aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@cygnus.co.uk>2000-03-16 17:13:49 +0000
committerBernd Schmidt <crux@gcc.gnu.org>2000-03-16 17:13:49 +0000
commit22eb7dfafe19196ec284b6b73362bddbf80467e8 (patch)
treecc33e0646cb85e4d0811aaee858a5418364477a0
parentd9f324226541553d4ac2852d1e467f9238304eba (diff)
downloadgcc-22eb7dfafe19196ec284b6b73362bddbf80467e8.zip
gcc-22eb7dfafe19196ec284b6b73362bddbf80467e8.tar.gz
gcc-22eb7dfafe19196ec284b6b73362bddbf80467e8.tar.bz2
Some cselib bug fixes
From-SVN: r32589
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/simplify-rtx.c16
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;
}