On Fri, Nov 14, 2014 at 10:12 PM, <[email protected]> wrote:
> From: Trevor Saunders <[email protected]>
>
> Hi,
>
> $subject
>
> bootstrapped + regtested x86_64-unknown-linux-gnu, ok?
>
> Trev
>
> gcc/
>
> * ipa-utils.c, lto-section-in.c, lto-streamer.h,
> tree-scalar-evolution.c: Replace htab with hash_table.
>
> lto/
>
> * lto.c: Replace htab with hash_table.
Ok.
Thanks,
Richard.
>
> diff --git a/gcc/ipa-utils.c b/gcc/ipa-utils.c
> index 22900cc..7613205 100644
> --- a/gcc/ipa-utils.c
> +++ b/gcc/ipa-utils.c
> @@ -438,17 +438,17 @@ ipa_merge_profiles (struct cgraph_node *dst,
> temporarily inconsistent. */
> if (src->decl == dst->decl)
> {
> - void **slot;
> struct lto_in_decl_state temp;
> struct lto_in_decl_state *state;
>
> /* We are going to move the decl, we want to remove its file decl data.
> and link these with the new decl. */
> temp.fn_decl = src->decl;
> - slot = htab_find_slot (src->lto_file_data->function_decl_states,
> - &temp, NO_INSERT);
> - state = (lto_in_decl_state *)*slot;
> - htab_clear_slot (src->lto_file_data->function_decl_states, slot);
> + lto_in_decl_state **slot
> + = src->lto_file_data->function_decl_states->find_slot (&temp,
> + NO_INSERT);
> + state = *slot;
> + src->lto_file_data->function_decl_states->clear_slot (slot);
> gcc_assert (state);
>
> /* Duplicate the decl and be sure it does not link into body of DST.
> */
> @@ -461,8 +461,8 @@ ipa_merge_profiles (struct cgraph_node *dst,
> /* Associate the decl state with new declaration, so LTO streamer
> can look it up. */
> state->fn_decl = src->decl;
> - slot = htab_find_slot (src->lto_file_data->function_decl_states,
> - state, INSERT);
> + slot
> + = src->lto_file_data->function_decl_states->find_slot (state, INSERT);
> gcc_assert (!*slot);
> *slot = state;
> }
> diff --git a/gcc/lto-section-in.c b/gcc/lto-section-in.c
> index 75f394d..b9d742a 100644
> --- a/gcc/lto-section-in.c
> +++ b/gcc/lto-section-in.c
> @@ -383,29 +383,6 @@ lto_delete_in_decl_state (struct lto_in_decl_state
> *state)
> ggc_free (state);
> }
>
> -/* Hashtable helpers. lto_in_decl_states are hash by their function decls. */
> -
> -hashval_t
> -lto_hash_in_decl_state (const void *p)
> -{
> - const struct lto_in_decl_state *state = (const struct lto_in_decl_state *)
> p;
> - return htab_hash_pointer (state->fn_decl);
> -}
> -
> -/* Return true if the fn_decl field of the lto_in_decl_state pointed to by
> - P1 equals to the function decl P2. */
> -
> -int
> -lto_eq_in_decl_state (const void *p1, const void *p2)
> -{
> - const struct lto_in_decl_state *state1 =
> - (const struct lto_in_decl_state *) p1;
> - const struct lto_in_decl_state *state2 =
> - (const struct lto_in_decl_state *) p2;
> - return state1->fn_decl == state2->fn_decl;
> -}
> -
> -
> /* Search the in-decl state of a function FUNC contained in the file
> associated with FILE_DATA. Return NULL if not found. */
>
> @@ -414,11 +391,11 @@ lto_get_function_in_decl_state (struct
> lto_file_decl_data *file_data,
> tree func)
> {
> struct lto_in_decl_state temp;
> - void **slot;
> + lto_in_decl_state **slot;
>
> temp.fn_decl = func;
> - slot = htab_find_slot (file_data->function_decl_states, &temp, NO_INSERT);
> - return slot? ((struct lto_in_decl_state*) *slot) : NULL;
> + slot = file_data->function_decl_states->find_slot (&temp, NO_INSERT);
> + return slot? *slot : NULL;
> }
>
> /* Free decl_states. */
> @@ -439,19 +416,18 @@ void
> lto_free_function_in_decl_state_for_node (symtab_node *node)
> {
> struct lto_in_decl_state temp;
> - void **slot;
> + lto_in_decl_state **slot;
>
> if (!node->lto_file_data)
> return;
>
> temp.fn_decl = node->decl;
> - slot = htab_find_slot (node->lto_file_data->function_decl_states,
> - &temp, NO_INSERT);
> + slot
> + = node->lto_file_data->function_decl_states->find_slot (&temp,
> NO_INSERT);
> if (slot && *slot)
> {
> - lto_free_function_in_decl_state ((struct lto_in_decl_state*) *slot);
> - htab_clear_slot (node->lto_file_data->function_decl_states,
> - slot);
> + lto_free_function_in_decl_state (*slot);
> + node->lto_file_data->function_decl_states->clear_slot (slot);
> }
> node->lto_file_data = NULL;
> }
> diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h
> index 9d6d7a0..ee2c7e3 100644
> --- a/gcc/lto-streamer.h
> +++ b/gcc/lto-streamer.h
> @@ -429,7 +429,7 @@ struct lto_tree_ref_encoder
>
>
> /* Structure to hold states of input scope. */
> -struct GTY(()) lto_in_decl_state
> +struct GTY((for_user)) lto_in_decl_state
> {
> /* Array of lto_in_decl_buffers to store type and decls streams. */
> vec<tree, va_gc> *streams[LTO_N_DECL_STREAMS];
> @@ -441,6 +441,20 @@ struct GTY(()) lto_in_decl_state
>
> typedef struct lto_in_decl_state *lto_in_decl_state_ptr;
>
> +struct decl_state_hasher : ggc_hasher<lto_in_decl_state *>
> +{
> + static hashval_t
> + hash (lto_in_decl_state *s)
> + {
> + return htab_hash_pointer (s->fn_decl);
> + }
> +
> + static bool
> + equal (lto_in_decl_state *a, lto_in_decl_state *b)
> + {
> + return a->fn_decl == b->fn_decl;
> + }
> +};
>
> /* The structure that holds all of the vectors of global types,
> decls and cgraph nodes used in the serialization of this file. */
> @@ -487,7 +501,7 @@ struct GTY(()) lto_file_decl_data
> lto_symtab_encoder_t GTY((skip)) symtab_node_encoder;
>
> /* Hash table maps lto-related section names to location in file. */
> - htab_t GTY((param_is (struct lto_in_decl_state))) function_decl_states;
> + hash_table<decl_state_hasher> *function_decl_states;
>
> /* The .o file that these offsets relate to. */
> const char *GTY((skip)) file_name;
> @@ -686,8 +700,6 @@ extern const char *lto_get_decl_name_mapping (struct
> lto_file_decl_data *,
> const char *);
> extern struct lto_in_decl_state *lto_new_in_decl_state (void);
> extern void lto_delete_in_decl_state (struct lto_in_decl_state *);
> -extern hashval_t lto_hash_in_decl_state (const void *);
> -extern int lto_eq_in_decl_state (const void *, const void *);
> extern struct lto_in_decl_state *lto_get_function_in_decl_state (
> struct lto_file_decl_data *, tree);
> extern void lto_free_function_in_decl_state (struct lto_in_decl_state *);
> diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
> index cdd2331..b5dd28b 100644
> --- a/gcc/lto/lto.c
> +++ b/gcc/lto/lto.c
> @@ -1988,15 +1988,15 @@ lto_read_decls (struct lto_file_decl_data *decl_data,
> const void *data,
>
> /* Read in per-function decl states and enter them in hash table. */
> decl_data->function_decl_states =
> - htab_create_ggc (37, lto_hash_in_decl_state, lto_eq_in_decl_state, NULL);
> + hash_table<decl_state_hasher>::create_ggc (37);
>
> for (i = 1; i < num_decl_states; i++)
> {
> struct lto_in_decl_state *state = lto_new_in_decl_state ();
> - void **slot;
>
> data_ptr = lto_read_in_decl_state (data_in, data_ptr, state);
> - slot = htab_find_slot (decl_data->function_decl_states, state, INSERT);
> + lto_in_decl_state **slot
> + = decl_data->function_decl_states->find_slot (state, INSERT);
> gcc_assert (*slot == NULL);
> *slot = state;
> }
> @@ -2825,17 +2825,6 @@ lto_fixup_state (struct lto_in_decl_state *state)
> }
> }
>
> -/* A callback of htab_traverse. Just extracts a state from SLOT
> - and calls lto_fixup_state. */
> -
> -static int
> -lto_fixup_state_aux (void **slot, void *aux ATTRIBUTE_UNUSED)
> -{
> - struct lto_in_decl_state *state = (struct lto_in_decl_state *) *slot;
> - lto_fixup_state (state);
> - return 1;
> -}
> -
> /* Fix the decls from all FILES. Replaces each decl with the corresponding
> prevailing one. */
>
> @@ -2855,7 +2844,11 @@ lto_fixup_decls (struct lto_file_decl_data **files)
> struct lto_in_decl_state *state = file->global_decl_state;
> lto_fixup_state (state);
>
> - htab_traverse (file->function_decl_states, lto_fixup_state_aux, NULL);
> + hash_table<decl_state_hasher>::iterator iter;
> + lto_in_decl_state *elt;
> + FOR_EACH_HASH_TABLE_ELEMENT (*file->function_decl_states, elt,
> + lto_in_decl_state *, iter)
> + lto_fixup_state (elt);
> }
> }
>
> diff --git a/gcc/tree-scalar-evolution.c b/gcc/tree-scalar-evolution.c
> index 4d03896..b8bdaf5 100644
> --- a/gcc/tree-scalar-evolution.c
> +++ b/gcc/tree-scalar-evolution.c
> @@ -307,7 +307,7 @@ static tree analyze_scalar_evolution_for_address_of
> (struct loop *loop,
> claiming that below basic block with index INSTANTIATED_BELOW, the
> value of the SSA name can be expressed as CHREC. */
>
> -struct GTY(()) scev_info_str {
> +struct GTY((for_user)) scev_info_str {
> unsigned int name_version;
> int instantiated_below;
> tree chrec;
> @@ -332,7 +332,13 @@ tree chrec_dont_know;
> happen, then it qualifies it with chrec_known. */
> tree chrec_known;
>
> -static GTY ((param_is (struct scev_info_str))) htab_t scalar_evolution_info;
> +struct scev_info_hasher : ggc_hasher<scev_info_str *>
> +{
> + static hashval_t hash (scev_info_str *i);
> + static bool equal (const scev_info_str *a, const scev_info_str *b);
> +};
> +
> +static GTY (()) hash_table<scev_info_hasher> *scalar_evolution_info;
>
>
> /* Constructs a new SCEV_INFO_STR structure for VAR and INSTANTIATED_BELOW.
> */
> @@ -352,34 +358,21 @@ new_scev_info_str (basic_block instantiated_below, tree
> var)
>
> /* Computes a hash function for database element ELT. */
>
> -static inline hashval_t
> -hash_scev_info (const void *elt_)
> +hashval_t
> +scev_info_hasher::hash (scev_info_str *elt)
> {
> - const struct scev_info_str *elt = (const struct scev_info_str *) elt_;
> return elt->name_version ^ elt->instantiated_below;
> }
>
> /* Compares database elements E1 and E2. */
>
> -static inline int
> -eq_scev_info (const void *e1, const void *e2)
> +bool
> +scev_info_hasher::equal (const scev_info_str *elt1, const scev_info_str
> *elt2)
> {
> - const struct scev_info_str *elt1 = (const struct scev_info_str *) e1;
> - const struct scev_info_str *elt2 = (const struct scev_info_str *) e2;
> -
> return (elt1->name_version == elt2->name_version
> && elt1->instantiated_below == elt2->instantiated_below);
> }
>
> -/* Deletes database element E. */
> -
> -static void
> -del_scev_info (void *e)
> -{
> - ggc_free (e);
> -}
> -
> -
> /* Get the scalar evolution of VAR for INSTANTIATED_BELOW basic block.
> A first query on VAR returns chrec_not_analyzed_yet. */
>
> @@ -388,15 +381,14 @@ find_var_scev_info (basic_block instantiated_below,
> tree var)
> {
> struct scev_info_str *res;
> struct scev_info_str tmp;
> - PTR *slot;
>
> tmp.name_version = SSA_NAME_VERSION (var);
> tmp.instantiated_below = instantiated_below->index;
> - slot = htab_find_slot (scalar_evolution_info, &tmp, INSERT);
> + scev_info_str **slot = scalar_evolution_info->find_slot (&tmp, INSERT);
>
> if (!*slot)
> *slot = new_scev_info_str (instantiated_below, var);
> - res = (struct scev_info_str *) *slot;
> + res = *slot;
>
> return &res->chrec;
> }
> @@ -2201,7 +2193,7 @@ static inline hashval_t
> hash_idx_scev_info (const void *elt_)
> {
> unsigned idx = ((size_t) elt_) - 2;
> - return hash_scev_info (&global_cache->entries[idx]);
> + return scev_info_hasher::hash (&global_cache->entries[idx]);
> }
>
> /* Compares database elements E1 and E2. */
> @@ -2210,7 +2202,8 @@ static inline int
> eq_idx_scev_info (const void *e1, const void *e2)
> {
> unsigned idx1 = ((size_t) e1) - 2;
> - return eq_scev_info (&global_cache->entries[idx1], e2);
> + return scev_info_hasher::equal (&global_cache->entries[idx1],
> + (const scev_info_str *) e2);
> }
>
> /* Returns from CACHE the slot number of the cached chrec for NAME. */
> @@ -2229,7 +2222,7 @@ get_instantiated_value_entry (instantiate_cache_type
> &cache,
> e.name_version = SSA_NAME_VERSION (name);
> e.instantiated_below = instantiate_below->index;
> void **slot = htab_find_slot_with_hash (cache.map, &e,
> - hash_scev_info (&e), INSERT);
> + scev_info_hasher::hash (&e),
> INSERT);
> if (!*slot)
> {
> e.chrec = chrec_not_analyzed_yet;
> @@ -3044,7 +3037,7 @@ dump_chrecs_stats (FILE *file, struct chrec_stats
> *stats)
> stats->nb_undetermined);
> fprintf (file, "-----------------------------------------\n");
> fprintf (file, "%d\tchrecs in the scev database\n",
> - (int) htab_elements (scalar_evolution_info));
> + (int) scalar_evolution_info->elements ());
> fprintf (file, "%d\tsets in the scev database\n", nb_set_scev);
> fprintf (file, "%d\tgets in the scev database\n", nb_get_scev);
> fprintf (file, "-----------------------------------------\n");
> @@ -3110,19 +3103,6 @@ gather_chrec_stats (tree chrec, struct chrec_stats
> *stats)
> fprintf (dump_file, ")\n");
> }
>
> -/* Callback for htab_traverse, gathers information on chrecs in the
> - hashtable. */
> -
> -static int
> -gather_stats_on_scev_database_1 (void **slot, void *stats)
> -{
> - struct scev_info_str *entry = (struct scev_info_str *) *slot;
> -
> - gather_chrec_stats (entry->chrec, (struct chrec_stats *) stats);
> -
> - return 1;
> -}
> -
> /* Classify the chrecs of the whole database. */
>
> void
> @@ -3135,8 +3115,11 @@ gather_stats_on_scev_database (void)
>
> reset_chrecs_counters (&stats);
>
> - htab_traverse (scalar_evolution_info, gather_stats_on_scev_database_1,
> - &stats);
> + hash_table<scev_info_hasher>::iterator iter;
> + scev_info_str *elt;
> + FOR_EACH_HASH_TABLE_ELEMENT (*scalar_evolution_info, elt, scev_info_str *,
> + iter)
> + gather_chrec_stats (elt->chrec, &stats);
>
> dump_chrecs_stats (dump_file, &stats);
> }
> @@ -3166,8 +3149,7 @@ scev_initialize (void)
> {
> struct loop *loop;
>
> - scalar_evolution_info = htab_create_ggc (100, hash_scev_info, eq_scev_info,
> - del_scev_info);
> + scalar_evolution_info = hash_table<scev_info_hasher>::create_ggc (100);
>
> initialize_scalar_evolutions_analyzer ();
>
> @@ -3194,7 +3176,7 @@ scev_reset_htab (void)
> if (!scalar_evolution_info)
> return;
>
> - htab_empty (scalar_evolution_info);
> + scalar_evolution_info->empty ();
> }
>
> /* Cleans up the information cached by the scalar evolutions analysis
> @@ -3289,7 +3271,7 @@ scev_finalize (void)
> {
> if (!scalar_evolution_info)
> return;
> - htab_delete (scalar_evolution_info);
> + scalar_evolution_info->empty ();
> scalar_evolution_info = NULL;
> }
>
> --
> 2.1.3
>