[12/12] Simplify uses of hash_map

Richard Sandiford richard.sandiford@arm.com
Fri Jun 26 17:03:00 GMT 2015


Richard Sandiford <richard.sandiford@arm.com> writes:
> Richard Sandiford <richard.sandiford@arm.com> writes:
>> Rainer Orth <ro@cebitec.uni-bielefeld.de> writes:
>>> Richard Sandiford <richard.sandiford@arm.com> writes:
>>>
>>>> Rainer Orth <ro@cebitec.uni-bielefeld.de> writes:
>>>>> Jeff Law <law@redhat.com> writes:
>>>>>
>>>>>> On 06/23/2015 08:57 AM, Richard Sandiford wrote:
>>>>>>> At this point all hash_map traits know what kind of key they're
>>>>>>> dealing with, so we can make that a traits typedef, like it is for
>>>>>>> hash_table traits.  Then, if we make the default hash traits for
>>>>>>> T be T, we can use hash_table-style traits as the first template
>>>>>>> parameter to hash_map, without the need for a third.  That is, if
>>>>>>> foo_hash hashes elements of type foo_type:
>>>>>>>
>>>>>>>    typedef simple_hashmap_traits <foo_hash> foo_traits;
>>>>>>>    hash_map <foo_type, value_type, foo_traits> x;
>>>>>>>
>>>>>>> becomes just:
>>>>>>>
>>>>>>>    hash_map <foo_hash, value_type> x;
>>>>>>>
>>>>>>> just like a hash_table of foo_types would be:
>>>>>>>
>>>>>>>    hash_table <foo_hash> y;
>>>>>>>
>>>>>>> This patch makes that simplification.
>>>>>>>
>>>>>>>
>>>>>>> gcc/
>>>>>>> 	* hash-map-traits.h (simple_hashmap_traits::key_type): New typedef.
>>>>>>> 	(unbounded_int_hashmap_traits::key_type): Likewise.
>>>>>>> 	* hash-map.h (hash_map): Get the key type from the traits.
>>>>>>> 	* hash-traits.h (default_hash_traits): By default, inherit from the
>>>>>>> 	template parameter.
>>>>>>> 	* alias.c (alias_set_traits): Delete.
>>>>>>> 	(alias_set_entry_d::children): Use alias_set_hash as the first
>>>>>>> 	template parameter.
>>>>>>> 	(record_alias_subset): Update accordingly.
>>>>>>> 	* except.c (tree_hash_traits): Delete.
>>>>>>> 	(type_to_runtime_map): Use tree_hash as the first template parameter.
>>>>>>> 	(init_eh): Update accordingly.
>>>>>>> 	* genmatch.c (capture_id_map_hasher): Delete.
>>>>>>> 	(cid_map_t): Use nofree_string_hash as first template parameter.
>>>>>>> 	* ipa-icf.h (symbol_compare_hashmap_traits): Delete.
>>>>>>> 	* ipa-icf.c (sem_item_optimizer::subdivide_classes_by_sensitive_refs):
>>>>>>> 	Use symbol_compare_hash as the first template parameter in
>>>>>>> 	subdivide_hash_map.
>>>>>>> 	* mem-stats.h (mem_usage_pair::mem_alloc_hashmap_traits): Delete.
>>>>>>> 	(mem_usage_pair::mem_map_t): Use mem_location_hash as the first
>>>>>>> 	template parameter.
>>>>>>> 	* passes.c (pass_registry_hasher): Delete.
>>>>>>> 	(name_to_pass_map): Use nofree_string_hash as the first template
>>>>>>> 	parameter.
>>>>>>> 	(register_pass_name): Update accordingly.
>>>>>>> 	* sanopt.c (sanopt_tree_map_traits): Delete.
>>>>>>> 	(sanopt_tree_triplet_map_traits): Delete.
>>>>>>> 	(sanopt_ctx::asan_check_map): Use tree_operand_hash as the first
>>>>>>> 	template parameter.
>>>>>>> 	(sanopt_ctx::vptr_check_map): Use sanopt_tree_triplet_hash as
>>>>>>> 	the first template parameter.
>>>>>>> 	* sese.c (rename_map_hasher): Delete.
>>>>>>> 	(rename_map_type): Use tree_ssa_name_hash as the first template
>>>>>>> 	parameter.
>>>>>>> 	* symbol-summary.h (function_summary::summary_hashmap_traits): Delete.
>>>>>>> 	(function_summary::m_map): Use map_hash as the first template
>>>>>>> 	parameter.
>>>>>>> 	(function_summary::release): Update accordingly.
>>>>>>> 	* tree-if-conv.c (phi_args_hash_traits): Delete.
>>>>>>> 	(predicate_scalar_phi): Use tree_operand_hash as the first template
>>>>>>> 	parameter to phi_arg_map.
>>>>>>> 	* tree-inline.h (dependence_hasher): Delete.
>>>>>>> 	(copy_body_data::dependence_map): Use dependence_hash as the first
>>>>>>> 	template parameter.
>>>>>>> 	* tree-inline.c (remap_dependence_clique): Update accordingly.
>>>>>>> 	* tree-ssa-strlen.c (stridxlist_hash_traits): Delete.
>>>>>>> 	(decl_to_stridxlist_htab): Use tree_decl_hash as the first template
>>>>>>> 	parameter.
>>>>>>> 	(addr_stridxptr): Update accordingly.
>>>>>>> 	* value-prof.c (profile_id_traits): Delete.
>>>>>>> 	(cgraph_node_map): Use profile_id_hash as the first template
>>>>>>> 	parameter.
>>>>>>> 	(init_node_map): Update accordingly.
>>>>>>> 	* config/alpha/alpha.c (string_traits): Delete.
>>>>>>> 	(machine_function::links): Use nofree_string_hash as the first
>>>>>>> 	template parameter.
>>>>>>> 	(alpha_use_linkage, alpha_write_linkage): Update accordingly.
>>>>>>> 	* config/m32c/m32c.c (pragma_traits): Delete.
>>>>>>> 	(pragma_htab): Use nofree_string_hash as the first template parameter.
>>>>>>> 	(m32c_note_pragma_address): Update accordingly.
>>>>>>> 	* config/mep/mep.c (pragma_traits): Delete.
>>>>>>> 	(pragma_htab): Use nofree_string_hash as the first template parameter.
>>>>>>> 	(mep_note_pragma_flag): Update accordingly.
>>>>>>> 	* config/mips/mips.c (mips16_flip_traits): Delete.
>>>>>>> 	(mflip_mips16_htab): Use nofree_string_hash as the first template
>>>>>>> 	parameter.
>>>>>>> 	(mflip_mips16_use_mips16_p): Update accordingly.
>>>>>>> 	(local_alias_traits): Delete.
>>>>>>> 	(mips16_local_aliases): Use nofree_string_hash as the first template
>>>>>>> 	parameter.
>>>>>>> 	(mips16_local_alias): Update accordingly.
>>>>>> Phew.  OK.
>>>>>
>>>>> According to a reghunt, this patch broke bootstrap (at least with g++
>>>>> 4.7 as bootstrap compiler):
>>>>
>>>> Which target are you using?  I just tried with a gcc 4.7 host compiler
>>>> on x86_64-linux-gnu and it seemed to work.
>>>
>>> I see it on i386-pc-solaris2.1[01] and sparc-sun-solaris2.1[01].
>>>
>>> gcc 4.9 works there, though.
>>
>> OK, I can reproduce it with 4.7.2 but it seems to be fixed in 4.7.4.
>> Trying to find out what changed as well as find a workaround.
>
> This seems to work for me.

Applied as obvious after bootstrap succeeded.

Thanks,
Richard

> gcc/
> 	* hash-map.h (hash_map::traverse): Use the definition of the
> 	Key typedef rather than the typedef itself.
>
> Index: gcc/hash-map.h
> ===================================================================
> --- gcc/hash-map.h	2015-06-25 18:17:12.360905717 +0100
> +++ gcc/hash-map.h	2015-06-26 17:36:36.187837149 +0100
> @@ -169,7 +169,8 @@ class GTY((user)) hash_map
>    /* Call the call back on each pair of key and value with the passed in
>       arg.  */
>  
> -  template<typename Arg, bool (*f)(const Key &, const Value &, Arg)>
> +  template<typename Arg, bool (*f)(const typename Traits::key_type &,
> +				   const Value &, Arg)>
>    void traverse (Arg a) const
>      {
>        for (typename hash_table<hash_entry>::iterator iter = m_table.begin ();
> @@ -177,7 +178,8 @@ class GTY((user)) hash_map
>  	f ((*iter).m_key, (*iter).m_value, a);
>      }
>  
> -  template<typename Arg, bool (*f)(const Key &, Value *, Arg)>
> +  template<typename Arg, bool (*f)(const typename Traits::key_type &,
> +				   Value *, Arg)>
>    void traverse (Arg a) const
>      {
>        for (typename hash_table<hash_entry>::iterator iter = m_table.begin ();



More information about the Gcc-patches mailing list