+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
{
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:
e = cselib_lookup (x, GET_MODE (x), create);
if (! e)
return 0;
- return e->value;
+ hash += e->value;
+ return hash;
case CONST_INT:
{
}
i = GET_RTX_LENGTH (code) - 1;
- hash += (unsigned) code + (unsigned) GET_MODE (x);
fmt = GET_RTX_FORMAT (code);
for (; i >= 0; i--)
{
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;
}