diff -u gcc/var-tracking.c gcc/var-tracking.c --- gcc/var-tracking.c 2009-06-19 13:08:20.000000000 +0200 +++ gcc/var-tracking.c 2009-06-19 21:49:25.000000000 +0200 @@ -761,18 +761,24 @@ /* Shared hashtable support. */ +/* Return true if VARS is shared. */ + static inline bool shared_hash_shared (shared_hash vars) { return vars->refcount > 1; } +/* Return the hash table for VARS. */ + static inline htab_t shared_hash_htab (shared_hash vars) { return vars->htab; } +/* Copy variables into a new hash table. */ + static shared_hash shared_hash_unshare (shared_hash vars) { @@ -787,6 +793,8 @@ return new_vars; } +/* Increment reference counter on VARS and return it. */ + static inline shared_hash shared_hash_copy (shared_hash vars) { @@ -794,6 +802,9 @@ return vars; } +/* Decrement reference counter and destroy hash table if not shared + anymore. */ + static void shared_hash_destroy (shared_hash vars) { @@ -807,2 +818,47 @@ +/* Unshare *PVARS if shared and return slot for DECL, inserting it + if not already present. */ + +static inline void ** +shared_hash_find_slot_unshare (shared_hash *pvars, tree decl) +{ + if (shared_hash_shared (*pvars)) + *pvars = shared_hash_unshare (*pvars); + return htab_find_slot_with_hash (shared_hash_htab (*pvars), decl, + VARIABLE_HASH_VAL (decl), INSERT); +} + +/* Return slot for DECL, if it is already present in the hash table. + If it is not present, insert it only VARS is not shared, otherwise + return NULL. */ + +static inline void ** +shared_hash_find_slot (shared_hash vars, tree decl) +{ + return htab_find_slot_with_hash (shared_hash_htab (vars), decl, + VARIABLE_HASH_VAL (decl), + shared_hash_shared (vars) + ? NO_INSERT : INSERT); +} + +/* Return slot for DECL only if it is already present in the hash table. */ + +static inline void ** +shared_hash_find_slot_noinsert (shared_hash vars, tree decl) +{ + return htab_find_slot_with_hash (shared_hash_htab (vars), decl, + VARIABLE_HASH_VAL (decl), NO_INSERT); +} + +/* Return variable for DECL or NULL if not already present in the hash + table. */ + +static inline variable +shared_hash_find (shared_hash vars, tree decl) +{ + return (variable) + htab_find_with_hash (shared_hash_htab (vars), decl, + VARIABLE_HASH_VAL (decl)); +} + /* Return a copy of a variable VAR and insert it to dataflow set SET. */ @@ -856,11 +912,7 @@ new_var->var_part[i].cur_loc = NULL; } - if (shared_hash_shared (set->vars)) - set->vars = shared_hash_unshare (set->vars); - slot = htab_find_slot_with_hash (shared_hash_htab (set->vars), new_var->decl, - VARIABLE_HASH_VAL (new_var->decl), - INSERT); + slot = shared_hash_find_slot_unshare (&set->vars, new_var->decl); *slot = new_var; return new_var; } @@ -930,7 +982,6 @@ static enum var_init_status get_init_value (dataflow_set *set, rtx loc, tree decl) { - void **slot; variable var; int i; enum var_init_status ret_val = VAR_INIT_STATUS_UNKNOWN; @@ -938,11 +989,9 @@ if (! flag_var_tracking_uninit) return VAR_INIT_STATUS_INITIALIZED; - slot = htab_find_slot_with_hash (shared_hash_htab (set->vars), decl, - VARIABLE_HASH_VAL (decl), NO_INSERT); - if (slot) + var = shared_hash_find (set->vars, decl); + if (var) { - var = * (variable *) slot; for (i = 0; i < var->n_var_parts && ret_val == VAR_INIT_STATUS_UNKNOWN; i++) { location_chain nextp; @@ -1186,16 +1235,13 @@ static int variable_union (void **slot, void *data) { - variable src, dst, *dstp; + variable src, dst; + void **dstp; dataflow_set *set = (dataflow_set *) data; int i, j, k; src = *(variable *) slot; - dstp = (variable *) htab_find_slot_with_hash (shared_hash_htab (set->vars), - src->decl, - VARIABLE_HASH_VAL (src->decl), - shared_hash_shared (set->vars) - ? NO_INSERT : INSERT); + dstp = shared_hash_find_slot (set->vars, src->decl); if (!dstp || !*dstp) { src->refcount++; @@ -1222,29 +1268,21 @@ status = VAR_INIT_STATUS_INITIALIZED; if (dstp) - *dstp = src; + *dstp = (void *) src; unshare_variable (set, src, status); } else { if (!dstp) - { - if (shared_hash_shared (set->vars)) - set->vars = shared_hash_unshare (set->vars); - dstp = (variable *) - htab_find_slot_with_hash (shared_hash_htab (set->vars), - src->decl, - VARIABLE_HASH_VAL (src->decl), - INSERT); - } - *dstp = src; + dstp = shared_hash_find_slot_unshare (&set->vars, src->decl); + *dstp = (void *) src; } /* Continue traversing the hash table. */ return 1; } else - dst = *dstp; + dst = (variable) *dstp; gcc_assert (src->n_var_parts); @@ -2115,7 +2153,6 @@ { tree decl = NULL_TREE; /* The variable being copied around. */ rtx set_src = NULL_RTX; /* The value for "decl" stored in "src". */ - void **slot; variable var; location_chain nextp; int i; @@ -2128,12 +2165,9 @@ if (src && decl) { - slot = htab_find_slot_with_hash (shared_hash_htab (set->vars), decl, - VARIABLE_HASH_VAL (decl), NO_INSERT); - - if (slot) + var = shared_hash_find (set->vars, decl); + if (var) { - var = *(variable *) slot; found = false; for (i = 0; i < var->n_var_parts && !found; i++) for (nextp = var->var_part[i].loc_chain; nextp && !found; @@ -2514,16 +2548,13 @@ void **slot; drop_var: - slot = htab_find_slot_with_hash (shared_hash_htab (set->vars), - var->decl, hash, NO_INSERT); + slot = shared_hash_find_slot_noinsert (set->vars, var->decl); if (slot) { if (shared_hash_shared (set->vars)) { set->vars = shared_hash_unshare (set->vars); - slot - = htab_find_slot_with_hash (shared_hash_htab (set->vars), - var->decl, hash, NO_INSERT); + slot = shared_hash_find_slot_noinsert (set->vars, var->decl); } htab_clear_slot (shared_hash_htab (set->vars), slot); } @@ -2576,21 +2607,12 @@ location_chain node, next; location_chain *nextp; variable var; - void **slot; - - slot = htab_find_slot_with_hash (shared_hash_htab (set->vars), decl, - VARIABLE_HASH_VAL (decl), - shared_hash_shared (set->vars) - ? NO_INSERT : INSERT); + void **slot = shared_hash_find_slot (set->vars, decl); + if (!slot || !*slot) { if (!slot) - { - set->vars = shared_hash_unshare (set->vars); - slot = htab_find_slot_with_hash (shared_hash_htab (set->vars), - decl, VARIABLE_HASH_VAL (decl), - INSERT); - } + slot = shared_hash_find_slot_unshare (&set->vars, decl); /* Create new variable information. */ var = (variable) pool_alloc (var_pool); var->decl = decl; @@ -2707,16 +2729,14 @@ clobber_variable_part (dataflow_set *set, rtx loc, tree decl, HOST_WIDE_INT offset, rtx set_src) { - void **slot; + variable var; if (! decl || ! DECL_P (decl)) return; - slot = htab_find_slot_with_hash (shared_hash_htab (set->vars), decl, - VARIABLE_HASH_VAL (decl), NO_INSERT); - if (slot) + var = shared_hash_find (set->vars, decl); + if (var) { - variable var = (variable) *slot; int pos = find_variable_location_part (var, offset, NULL); if (pos >= 0) @@ -2773,13 +2793,9 @@ delete_variable_part (dataflow_set *set, rtx loc, tree decl, HOST_WIDE_INT offset) { - void **slot; - - slot = htab_find_slot_with_hash (shared_hash_htab (set->vars), decl, - VARIABLE_HASH_VAL (decl), NO_INSERT); - if (slot) + variable var = shared_hash_find (set->vars, decl);; + if (var) { - variable var = (variable) *slot; int pos = find_variable_location_part (var, offset, NULL); if (pos >= 0)