* [PATCH] convert many pointer_map to hash_map
@ 2014-08-01 10:37 tsaunders
2014-08-01 10:52 ` Richard Biener
0 siblings, 1 reply; 6+ messages in thread
From: tsaunders @ 2014-08-01 10:37 UTC (permalink / raw)
To: gcc-patches; +Cc: Trevor Saunders
From: Trevor Saunders <tsaunders@mozilla.com>
Hi,
This patch replaces a bunch of usage of pointer_map with hash_map. It also
adds an overload to hash_map::traverse that allows modifying the value, and a
remove method.
bootstrapped + regtested on x86_64-unknown-linux-gnu, ok?
Trev
c-family/
* cilk.c: Use hash_map instead of pointer_map.
c/
* c-typeck.c: Use hash_map instead of pointer_map.
cp/
* optimize.c, semantics.c: Use hash_map instead of pointer_map.
gcc/
* hash-map.h (default_hashmap_traits::mark_key_deleted):
Fix cast.
(hash_map::remove): New method.
(hash_map::traverse): New method.
* cgraph.h, except.c, except.h, gimple-ssa-strength-reduction.c,
ipa-utils.c, lto-cgraph.c, lto-streamer.h, omp-low.c, predict.c,
tree-cfg.c, tree-cfgcleanup.c, tree-eh.c, tree-eh.h, tree-inline.c,
tree-inline.h, tree-nested.c, tree-sra.c, tree-ssa-loop-im.c,
tree-ssa-loop-ivopts.c, tree-ssa-reassoc.c, tree-ssa-structalias.c,
tree-ssa.c, tree-ssa.h, var-tracking.c: Use hash_map instead of
pointer_map.
diff --git a/gcc/c-family/cilk.c b/gcc/c-family/cilk.c
index b864bb1..e0d1141 100644
--- a/gcc/c-family/cilk.c
+++ b/gcc/c-family/cilk.c
@@ -64,7 +64,7 @@ struct wrapper_data
/* Containing function. */
tree context;
/* Disposition of all variables in the inner statement. */
- struct pointer_map_t *decl_map;
+ hash_map<tree, tree> *decl_map;
/* True if this function needs a static chain. */
bool nested;
/* Arguments to be passed to wrapper function, currently a list. */
@@ -335,12 +335,11 @@ create_cilk_helper_decl (struct wrapper_data *wd)
/* A function used by walk tree to find wrapper parms. */
-static bool
-wrapper_parm_cb (const void *key0, void **val0, void *data)
+bool
+wrapper_parm_cb (tree const &key0, tree *val0, wrapper_data *wd)
{
- struct wrapper_data *wd = (struct wrapper_data *) data;
- tree arg = * (tree *)&key0;
- tree val = (tree)*val0;
+ tree arg = key0;
+ tree val = *val0;
tree parm;
if (val == error_mark_node || val == arg)
@@ -387,7 +386,7 @@ build_wrapper_type (struct wrapper_data *wd)
wd->parms = NULL_TREE;
wd->argtypes = void_list_node;
- pointer_map_traverse (wd->decl_map, wrapper_parm_cb, wd);
+ wd->decl_map->traverse<wrapper_data *, wrapper_parm_cb> (wd);
gcc_assert (wd->type != CILK_BLOCK_FOR);
/* Now build a function.
@@ -452,25 +451,22 @@ copy_decl_for_cilk (tree decl, copy_body_data *id)
/* Copy all local variables. */
-static bool
-for_local_cb (const void *k_v, void **vp, void *p)
+bool
+for_local_cb (tree const &k, tree *vp, copy_body_data *id)
{
- tree k = *(tree *) &k_v;
- tree v = (tree) *vp;
+ tree v = *vp;
if (v == error_mark_node)
- *vp = copy_decl_no_change (k, (copy_body_data *) p);
+ *vp = copy_decl_no_change (k, id);
return true;
}
/* Copy all local declarations from a _Cilk_spawned function's body. */
-static bool
-wrapper_local_cb (const void *k_v, void **vp, void *data)
+bool
+wrapper_local_cb (tree const &key, tree *vp, copy_body_data *id)
{
- copy_body_data *id = (copy_body_data *) data;
- tree key = *(tree *) &k_v;
- tree val = (tree) *vp;
+ tree val = *vp;
if (val == error_mark_node)
*vp = copy_decl_for_cilk (key, id);
@@ -514,8 +510,11 @@ cilk_outline (tree inner_fn, tree *stmt_p, void *w)
insert_decl_map (&id, wd->block, DECL_INITIAL (inner_fn));
/* We don't want the private variables any more. */
- pointer_map_traverse (wd->decl_map, nested ? for_local_cb : wrapper_local_cb,
- &id);
+ if (nested)
+ wd->decl_map->traverse<copy_body_data *, for_local_cb> (&id);
+ else
+ wd->decl_map->traverse<copy_body_data *, wrapper_local_cb> (&id);
+
walk_tree (stmt_p, copy_tree_body_r, (void *) &id, NULL);
/* See if this function can throw or calls something that should
@@ -576,7 +575,7 @@ init_wd (struct wrapper_data *wd, enum cilk_block_type type)
wd->type = type;
wd->fntype = NULL_TREE;
wd->context = current_function_decl;
- wd->decl_map = pointer_map_create ();
+ wd->decl_map = new hash_map<tree, tree>;
/* _Cilk_for bodies are always nested. Others start off as
normal functions. */
wd->nested = (type == CILK_BLOCK_FOR);
@@ -590,7 +589,7 @@ init_wd (struct wrapper_data *wd, enum cilk_block_type type)
static void
free_wd (struct wrapper_data *wd)
{
- pointer_map_destroy (wd->decl_map);
+ delete wd->decl_map;
wd->nested = false;
wd->arglist = NULL_TREE;
wd->argtypes = NULL_TREE;
@@ -618,12 +617,11 @@ free_wd (struct wrapper_data *wd)
(var, ???) -- Pure output argument, handled similarly to above.
*/
-static bool
-declare_one_free_variable (const void *var0, void **map0,
- void *data ATTRIBUTE_UNUSED)
+bool
+declare_one_free_variable (tree const &var0, tree *map0, wrapper_data &)
{
- const_tree var = (const_tree) var0;
- tree map = (tree)*map0;
+ const_tree var = var0;
+ tree map = *map0;
tree var_type = TREE_TYPE (var), arg_type;
bool by_reference;
tree parm;
@@ -713,7 +711,7 @@ create_cilk_wrapper (tree exp, tree *args_out)
}
else
extract_free_variables (exp, &wd, ADD_READ);
- pointer_map_traverse (wd.decl_map, declare_one_free_variable, &wd);
+ wd.decl_map->traverse<wrapper_data &, declare_one_free_variable> (wd);
wd.block = TREE_BLOCK (exp);
if (!wd.block)
wd.block = DECL_INITIAL (current_function_decl);
@@ -884,9 +882,7 @@ cilk_install_body_pedigree_operations (tree frame_ptr)
static void
add_variable (struct wrapper_data *wd, tree var, enum add_variable_type how)
{
- void **valp;
-
- valp = pointer_map_contains (wd->decl_map, (void *) var);
+ tree *valp = wd->decl_map->get (var);
if (valp)
{
tree val = (tree) *valp;
@@ -907,7 +903,7 @@ add_variable (struct wrapper_data *wd, tree var, enum add_variable_type how)
if (how != ADD_WRITE)
return;
/* This variable might have been entered as read but is now written. */
- *valp = (void *) var;
+ *valp = var;
wd->nested = true;
return;
}
@@ -971,7 +967,7 @@ add_variable (struct wrapper_data *wd, tree var, enum add_variable_type how)
break;
}
}
- *pointer_map_insert (wd->decl_map, (void *) var) = val;
+ wd->decl_map->put (var, val);
}
}
diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
index 06fd565..bedb63e 100644
--- a/gcc/c/c-typeck.c
+++ b/gcc/c/c-typeck.c
@@ -11783,15 +11783,15 @@ c_clone_omp_udr (tree stmt, tree omp_decl1, tree omp_decl2,
tree decl, tree placeholder)
{
copy_body_data id;
- struct pointer_map_t *decl_map = pointer_map_create ();
+ hash_map<tree, tree> decl_map;
- *pointer_map_insert (decl_map, omp_decl1) = placeholder;
- *pointer_map_insert (decl_map, omp_decl2) = decl;
+ decl_map.put (omp_decl1, placeholder);
+ decl_map.put (omp_decl2, decl);
memset (&id, 0, sizeof (id));
id.src_fn = DECL_CONTEXT (omp_decl1);
id.dst_fn = current_function_decl;
id.src_cfun = DECL_STRUCT_FUNCTION (id.src_fn);
- id.decl_map = decl_map;
+ id.decl_map = &decl_map;
id.copy_decl = copy_decl_no_change;
id.transform_call_graph_edges = CB_CGE_DUPLICATE;
@@ -11800,7 +11800,6 @@ c_clone_omp_udr (tree stmt, tree omp_decl1, tree omp_decl2,
id.transform_lang_insert_block = NULL;
id.eh_lp_nr = 0;
walk_tree (&stmt, copy_tree_body_r, &id, NULL);
- pointer_map_destroy (decl_map);
return stmt;
}
diff --git a/gcc/cgraph.h b/gcc/cgraph.h
index f8f76c4..0fa8635 100644
--- a/gcc/cgraph.h
+++ b/gcc/cgraph.h
@@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_CGRAPH_H
#define GCC_CGRAPH_H
+#include "hash-map.h"
#include "is-a.h"
#include "plugin-api.h"
#include "vec.h"
@@ -1204,7 +1205,7 @@ public:
can appear in multiple sets. */
struct cgraph_node_set_def
{
- struct pointer_map_t *map;
+ hash_map<cgraph_node *, size_t> *map;
vec<cgraph_node *> nodes;
};
@@ -1217,7 +1218,7 @@ class varpool_node;
can appear in multiple sets. */
struct varpool_node_set_def
{
- struct pointer_map_t * map;
+ hash_map<varpool_node *, size_t> * map;
vec<varpool_node *> nodes;
};
diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c
index 3cd8047..6eeca4d 100644
--- a/gcc/cp/optimize.c
+++ b/gcc/cp/optimize.c
@@ -86,7 +86,7 @@ clone_body (tree clone, tree fn, void *arg_map)
id.src_fn = fn;
id.dst_fn = clone;
id.src_cfun = DECL_STRUCT_FUNCTION (fn);
- id.decl_map = (struct pointer_map_t *) arg_map;
+ id.decl_map = static_cast<hash_map<tree, tree> *> (arg_map);
id.copy_decl = copy_decl_no_change;
id.transform_call_graph_edges = CB_CGE_DUPLICATE;
@@ -527,7 +527,7 @@ maybe_clone_body (tree fn)
tree parm;
tree clone_parm;
int parmno;
- struct pointer_map_t *decl_map;
+ hash_map<tree, tree> *decl_map;
bool alias = false;
clone = fns[idx];
@@ -587,7 +587,7 @@ maybe_clone_body (tree fn)
}
/* Remap the parameters. */
- decl_map = pointer_map_create ();
+ decl_map = new hash_map<tree, tree>;
for (parmno = 0,
parm = DECL_ARGUMENTS (fn),
clone_parm = DECL_ARGUMENTS (clone);
@@ -600,7 +600,7 @@ maybe_clone_body (tree fn)
{
tree in_charge;
in_charge = in_charge_arg_for_name (DECL_NAME (clone));
- *pointer_map_insert (decl_map, parm) = in_charge;
+ decl_map->put (parm, in_charge);
}
else if (DECL_ARTIFICIAL (parm)
&& DECL_NAME (parm) == vtt_parm_identifier)
@@ -611,19 +611,22 @@ maybe_clone_body (tree fn)
if (DECL_HAS_VTT_PARM_P (clone))
{
DECL_ABSTRACT_ORIGIN (clone_parm) = parm;
- *pointer_map_insert (decl_map, parm) = clone_parm;
+ decl_map->put (parm, clone_parm);
clone_parm = DECL_CHAIN (clone_parm);
}
/* Otherwise, map the VTT parameter to `NULL'. */
else
- *pointer_map_insert (decl_map, parm)
- = fold_convert (TREE_TYPE (parm), null_pointer_node);
+ {
+ tree t
+ = fold_convert (TREE_TYPE (parm), null_pointer_node);
+ decl_map->put (parm, t);
+ }
}
/* Map other parameters to their equivalents in the cloned
function. */
else
{
- *pointer_map_insert (decl_map, parm) = clone_parm;
+ decl_map->put (parm, clone_parm);
clone_parm = DECL_CHAIN (clone_parm);
}
}
@@ -632,14 +635,14 @@ maybe_clone_body (tree fn)
{
parm = DECL_RESULT (fn);
clone_parm = DECL_RESULT (clone);
- *pointer_map_insert (decl_map, parm) = clone_parm;
+ decl_map->put (parm, clone_parm);
}
/* Clone the body. */
clone_body (clone, fn, decl_map);
/* Clean up. */
- pointer_map_destroy (decl_map);
+ delete decl_map;
}
/* The clone can throw iff the original function can throw. */
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 735284e..4868d69 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -4977,15 +4977,15 @@ clone_omp_udr (tree stmt, tree omp_decl1, tree omp_decl2,
tree decl, tree placeholder)
{
copy_body_data id;
- struct pointer_map_t *decl_map = pointer_map_create ();
+ hash_map<tree, tree> decl_map;
- *pointer_map_insert (decl_map, omp_decl1) = placeholder;
- *pointer_map_insert (decl_map, omp_decl2) = decl;
+ decl_map.put (omp_decl1, placeholder);
+ decl_map.put (omp_decl2, decl);
memset (&id, 0, sizeof (id));
id.src_fn = DECL_CONTEXT (omp_decl1);
id.dst_fn = current_function_decl;
id.src_cfun = DECL_STRUCT_FUNCTION (id.src_fn);
- id.decl_map = decl_map;
+ id.decl_map = &decl_map;
id.copy_decl = copy_decl_no_change;
id.transform_call_graph_edges = CB_CGE_DUPLICATE;
@@ -4994,7 +4994,6 @@ clone_omp_udr (tree stmt, tree omp_decl1, tree omp_decl2,
id.transform_lang_insert_block = NULL;
id.eh_lp_nr = 0;
walk_tree (&stmt, copy_tree_body_r, &id, NULL);
- pointer_map_destroy (decl_map);
return stmt;
}
diff --git a/gcc/except.c b/gcc/except.c
index c8dbc50..ec08e91 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -527,7 +527,7 @@ struct duplicate_eh_regions_data
{
duplicate_eh_regions_map label_map;
void *label_map_data;
- struct pointer_map_t *eh_map;
+ hash_map<void *, void *> *eh_map;
};
static void
@@ -536,12 +536,9 @@ duplicate_eh_regions_1 (struct duplicate_eh_regions_data *data,
{
eh_landing_pad old_lp, new_lp;
eh_region new_r;
- void **slot;
new_r = gen_eh_region (old_r->type, outer);
- slot = pointer_map_insert (data->eh_map, (void *)old_r);
- gcc_assert (*slot == NULL);
- *slot = (void *)new_r;
+ gcc_assert (!data->eh_map->put (old_r, new_r));
switch (old_r->type)
{
@@ -586,9 +583,7 @@ duplicate_eh_regions_1 (struct duplicate_eh_regions_data *data,
continue;
new_lp = gen_eh_landing_pad (new_r);
- slot = pointer_map_insert (data->eh_map, (void *)old_lp);
- gcc_assert (*slot == NULL);
- *slot = (void *)new_lp;
+ gcc_assert (!data->eh_map->put (old_lp, new_lp));
new_lp->post_landing_pad
= data->label_map (old_lp->post_landing_pad, data->label_map_data);
@@ -609,7 +604,7 @@ duplicate_eh_regions_1 (struct duplicate_eh_regions_data *data,
that allows the caller to remap uses of both EH regions and
EH landing pads. */
-struct pointer_map_t *
+hash_map<void *, void *> *
duplicate_eh_regions (struct function *ifun,
eh_region copy_region, int outer_lp,
duplicate_eh_regions_map map, void *map_data)
@@ -623,7 +618,7 @@ duplicate_eh_regions (struct function *ifun,
data.label_map = map;
data.label_map_data = map_data;
- data.eh_map = pointer_map_create ();
+ data.eh_map = new hash_map<void *, void *>;
outer_region = get_eh_region_from_lp_number (outer_lp);
diff --git a/gcc/except.h b/gcc/except.h
index bab13e1..5c2aa3d 100644
--- a/gcc/except.h
+++ b/gcc/except.h
@@ -25,6 +25,7 @@ along with GCC; see the file COPYING3. If not see
# define GCC_EXCEPT_H
#endif
+#include "hash-map.h"
#include "hashtab.h"
struct function;
@@ -249,7 +250,7 @@ extern rtx expand_builtin_extend_pointer (tree);
extern void expand_dw2_landing_pad_for_region (eh_region);
typedef tree (*duplicate_eh_regions_map) (tree, void *);
-extern struct pointer_map_t *duplicate_eh_regions
+extern hash_map<void *, void *> *duplicate_eh_regions
(struct function *, eh_region, int, duplicate_eh_regions_map, void *);
extern void sjlj_emit_function_exit_after (rtx);
diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c
index d7c5db5..b13b7f7 100644
--- a/gcc/gimple-ssa-strength-reduction.c
+++ b/gcc/gimple-ssa-strength-reduction.c
@@ -38,6 +38,7 @@ along with GCC; see the file COPYING3. If not see
#include "coretypes.h"
#include "tree.h"
#include "pointer-set.h"
+#include "hash-map.h"
#include "hash-table.h"
#include "basic-block.h"
#include "tree-ssa-alias.h"
@@ -373,7 +374,7 @@ enum count_phis_status
};
/* Pointer map embodying a mapping from statements to candidates. */
-static struct pointer_map_t *stmt_cand_map;
+static hash_map<gimple, slsr_cand_t> *stmt_cand_map;
/* Obstack for candidates. */
static struct obstack cand_obstack;
@@ -435,7 +436,7 @@ static hash_table<cand_chain_hasher> *base_cand_map;
/* Pointer map used by tree_to_aff_combination_expand. */
static struct pointer_map_t *name_expansions;
/* Pointer map embodying a mapping from bases to alternative bases. */
-static struct pointer_map_t *alt_base_map;
+static hash_map<tree, tree> *alt_base_map;
/* Given BASE, use the tree affine combiniation facilities to
find the underlying tree expression for BASE, with any
@@ -447,7 +448,7 @@ static struct pointer_map_t *alt_base_map;
static tree
get_alternative_base (tree base)
{
- tree *result = (tree *) pointer_map_contains (alt_base_map, base);
+ tree *result = alt_base_map->get (base);
if (result == NULL)
{
@@ -459,13 +460,9 @@ get_alternative_base (tree base)
aff.offset = 0;
expr = aff_combination_to_tree (&aff);
- result = (tree *) pointer_map_insert (alt_base_map, base);
- gcc_assert (!*result);
+ gcc_assert (!alt_base_map->put (base, base == expr ? NULL : expr));
- if (expr == base)
- *result = NULL;
- else
- *result = expr;
+ return expr == base ? NULL : expr;
}
return *result;
@@ -724,7 +721,7 @@ base_cand_from_table (tree base_in)
if (!def)
return (slsr_cand_t) NULL;
- result = (slsr_cand_t *) pointer_map_contains (stmt_cand_map, def);
+ result = stmt_cand_map->get (def);
if (result && (*result)->kind != CAND_REF)
return *result;
@@ -737,9 +734,7 @@ base_cand_from_table (tree base_in)
static void
add_cand_for_stmt (gimple gs, slsr_cand_t c)
{
- void **slot = pointer_map_insert (stmt_cand_map, gs);
- gcc_assert (!*slot);
- *slot = c;
+ gcc_assert (!stmt_cand_map->put (gs, c));
}
\f
/* Given PHI which contains a phi statement, determine whether it
@@ -3628,7 +3623,7 @@ pass_strength_reduction::execute (function *fun)
cand_vec.create (128);
/* Allocate the mapping from statements to candidate indices. */
- stmt_cand_map = pointer_map_create ();
+ stmt_cand_map = new hash_map<gimple, slsr_cand_t>;
/* Create the obstack where candidate chains will reside. */
gcc_obstack_init (&chain_obstack);
@@ -3637,7 +3632,7 @@ pass_strength_reduction::execute (function *fun)
base_cand_map = new hash_table<cand_chain_hasher> (500);
/* Allocate the mapping from bases to alternative bases. */
- alt_base_map = pointer_map_create ();
+ alt_base_map = new hash_map<tree, tree>;
/* Initialize the loop optimizer. We need to detect flow across
back edges, and this gives us dominator information as well. */
@@ -3654,7 +3649,7 @@ pass_strength_reduction::execute (function *fun)
dump_cand_chains ();
}
- pointer_map_destroy (alt_base_map);
+ delete alt_base_map;
free_affine_expand_cache (&name_expansions);
/* Analyze costs and make appropriate replacements. */
@@ -3664,7 +3659,7 @@ pass_strength_reduction::execute (function *fun)
delete base_cand_map;
base_cand_map = NULL;
obstack_free (&chain_obstack, NULL);
- pointer_map_destroy (stmt_cand_map);
+ delete stmt_cand_map;
cand_vec.release ();
obstack_free (&cand_obstack, NULL);
diff --git a/gcc/hash-map.h b/gcc/hash-map.h
index 0b50f72..ec48844 100644
--- a/gcc/hash-map.h
+++ b/gcc/hash-map.h
@@ -93,7 +93,7 @@ private:
static void
mark_key_deleted (T *&k)
{
- k = static_cast<T *> (1);
+ k = reinterpret_cast<T *> (1);
}
template<typename T>
@@ -185,6 +185,11 @@ public:
return e->m_value;
}
+ void remove (const Key &k)
+ {
+ m_table.remove_elt_with_hash (k, Traits::hash (k));
+ }
+
/* Call the call back on each pair of key and value with the passed in
arg. */
@@ -196,6 +201,15 @@ public:
f ((*iter).m_key, (*iter).m_value, a);
}
+ template<typename Arg, bool (*f)(const Key &, Value *, Arg)>
+ void traverse (Arg a) const
+ {
+ for (typename hash_table<hash_entry>::iterator iter = m_table.begin ();
+ iter != m_table.end (); ++iter)
+ if (!f ((*iter).m_key, &(*iter).m_value, a))
+ break;
+ }
+
private:
hash_table<hash_entry> m_table;
};
diff --git a/gcc/ipa-utils.c b/gcc/ipa-utils.c
index 7810e55..a391b5d 100644
--- a/gcc/ipa-utils.c
+++ b/gcc/ipa-utils.c
@@ -389,7 +389,7 @@ cgraph_node_set_new (void)
cgraph_node_set new_node_set;
new_node_set = XCNEW (struct cgraph_node_set_def);
- new_node_set->map = pointer_map_create ();
+ new_node_set->map = new hash_map<cgraph_node *, size_t>;
new_node_set->nodes.create (0);
return new_node_set;
}
@@ -400,19 +400,17 @@ cgraph_node_set_new (void)
void
cgraph_node_set_add (cgraph_node_set set, struct cgraph_node *node)
{
- void **slot;
+ bool existed_p;
+ size_t &index = set->map->get_or_insert (node, &existed_p);
- slot = pointer_map_insert (set->map, node);
-
- if (*slot)
+ if (existed_p)
{
- int index = (size_t) *slot - 1;
gcc_checking_assert ((set->nodes[index]
== node));
return;
}
- *slot = (void *)(size_t) (set->nodes.length () + 1);
+ index = set->nodes.length () + 1;
/* Insert into node vector. */
set->nodes.safe_push (node);
@@ -424,15 +422,14 @@ cgraph_node_set_add (cgraph_node_set set, struct cgraph_node *node)
void
cgraph_node_set_remove (cgraph_node_set set, struct cgraph_node *node)
{
- void **slot, **last_slot;
int index;
struct cgraph_node *last_node;
- slot = pointer_map_contains (set->map, node);
+ size_t *slot = set->map->get (node);
if (slot == NULL || !*slot)
return;
- index = (size_t) *slot - 1;
+ index = *slot - 1;
gcc_checking_assert (set->nodes[index]
== node);
@@ -441,16 +438,16 @@ cgraph_node_set_remove (cgraph_node_set set, struct cgraph_node *node)
last_node = set->nodes.pop ();
if (last_node != node)
{
- last_slot = pointer_map_contains (set->map, last_node);
+ size_t *last_slot = set->map->get (last_node);
gcc_checking_assert (last_slot && *last_slot);
- *last_slot = (void *)(size_t) (index + 1);
+ *last_slot = index + 1;
/* Move the last element to the original spot of NODE. */
set->nodes[index] = last_node;
}
/* Remove element from hash table. */
- *slot = NULL;
+ set->map->remove (node);
}
@@ -460,14 +457,14 @@ cgraph_node_set_remove (cgraph_node_set set, struct cgraph_node *node)
cgraph_node_set_iterator
cgraph_node_set_find (cgraph_node_set set, struct cgraph_node *node)
{
- void **slot;
+ size_t *slot;
cgraph_node_set_iterator csi;
- slot = pointer_map_contains (set->map, node);
+ slot = set->map->get (node);
if (slot == NULL || !*slot)
csi.index = (unsigned) ~0;
else
- csi.index = (size_t)*slot - 1;
+ csi.index = *slot - 1;
csi.set = set;
return csi;
@@ -505,7 +502,7 @@ void
free_cgraph_node_set (cgraph_node_set set)
{
set->nodes.release ();
- pointer_map_destroy (set->map);
+ delete set->map;
free (set);
}
@@ -518,7 +515,7 @@ varpool_node_set_new (void)
varpool_node_set new_node_set;
new_node_set = XCNEW (struct varpool_node_set_def);
- new_node_set->map = pointer_map_create ();
+ new_node_set->map = new hash_map<varpool_node *, size_t>;
new_node_set->nodes.create (0);
return new_node_set;
}
@@ -529,19 +526,18 @@ varpool_node_set_new (void)
void
varpool_node_set_add (varpool_node_set set, varpool_node *node)
{
- void **slot;
-
- slot = pointer_map_insert (set->map, node);
+ bool existed;
+ size_t &slot = set->map->get_or_insert (node, &existed);
- if (*slot)
+ if (existed)
{
- int index = (size_t) *slot - 1;
+ int index = slot - 1;
gcc_checking_assert ((set->nodes[index]
== node));
return;
}
- *slot = (void *)(size_t) (set->nodes.length () + 1);
+ slot = set->nodes.length () + 1;
/* Insert into node vector. */
set->nodes.safe_push (node);
@@ -553,15 +549,14 @@ varpool_node_set_add (varpool_node_set set, varpool_node *node)
void
varpool_node_set_remove (varpool_node_set set, varpool_node *node)
{
- void **slot, **last_slot;
int index;
varpool_node *last_node;
- slot = pointer_map_contains (set->map, node);
+ size_t *slot = set->map->get (node);
if (slot == NULL || !*slot)
return;
- index = (size_t) *slot - 1;
+ index = *slot - 1;
gcc_checking_assert (set->nodes[index]
== node);
@@ -570,16 +565,16 @@ varpool_node_set_remove (varpool_node_set set, varpool_node *node)
last_node = set->nodes.pop ();
if (last_node != node)
{
- last_slot = pointer_map_contains (set->map, last_node);
+ size_t *last_slot = set->map->get (last_node);
gcc_checking_assert (last_slot && *last_slot);
- *last_slot = (void *)(size_t) (index + 1);
+ *last_slot = index + 1;
/* Move the last element to the original spot of NODE. */
set->nodes[index] = last_node;
}
/* Remove element from hash table. */
- *slot = NULL;
+ set->map->remove (node);
}
@@ -589,14 +584,13 @@ varpool_node_set_remove (varpool_node_set set, varpool_node *node)
varpool_node_set_iterator
varpool_node_set_find (varpool_node_set set, varpool_node *node)
{
- void **slot;
varpool_node_set_iterator vsi;
- slot = pointer_map_contains (set->map, node);
+ size_t *slot = set->map->get (node);
if (slot == NULL || !*slot)
vsi.index = (unsigned) ~0;
else
- vsi.index = (size_t)*slot - 1;
+ vsi.index = *slot - 1;
vsi.set = set;
return vsi;
@@ -625,7 +619,7 @@ void
free_varpool_node_set (varpool_node_set set)
{
set->nodes.release ();
- pointer_map_destroy (set->map);
+ delete set->map;
free (set);
}
diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
index 42b0790..28a30ad 100644
--- a/gcc/lto-cgraph.c
+++ b/gcc/lto-cgraph.c
@@ -93,7 +93,7 @@ lto_symtab_encoder_new (bool for_input)
lto_symtab_encoder_t encoder = XCNEW (struct lto_symtab_encoder_d);
if (!for_input)
- encoder->map = pointer_map_create ();
+ encoder->map = new hash_map<symtab_node *, size_t>;
encoder->nodes.create (0);
return encoder;
}
@@ -106,7 +106,7 @@ lto_symtab_encoder_delete (lto_symtab_encoder_t encoder)
{
encoder->nodes.release ();
if (encoder->map)
- pointer_map_destroy (encoder->map);
+ delete encoder->map;
free (encoder);
}
@@ -120,7 +120,6 @@ lto_symtab_encoder_encode (lto_symtab_encoder_t encoder,
symtab_node *node)
{
int ref;
- void **slot;
if (!encoder->map)
{
@@ -131,18 +130,17 @@ lto_symtab_encoder_encode (lto_symtab_encoder_t encoder,
return ref;
}
- slot = pointer_map_contains (encoder->map, node);
+ size_t *slot = encoder->map->get (node);
if (!slot || !*slot)
{
lto_encoder_entry entry = {node, false, false, false};
ref = encoder->nodes.length ();
if (!slot)
- slot = pointer_map_insert (encoder->map, node);
- *slot = (void *) (intptr_t) (ref + 1);
+ encoder->map->put (node, ref + 1);
encoder->nodes.safe_push (entry);
}
else
- ref = (size_t) *slot - 1;
+ ref = *slot - 1;
return ref;
}
@@ -153,15 +151,14 @@ bool
lto_symtab_encoder_delete_node (lto_symtab_encoder_t encoder,
symtab_node *node)
{
- void **slot, **last_slot;
int index;
lto_encoder_entry last_node;
- slot = pointer_map_contains (encoder->map, node);
+ size_t *slot = encoder->map->get (node);
if (slot == NULL || !*slot)
return false;
- index = (size_t) *slot - 1;
+ index = *slot - 1;
gcc_checking_assert (encoder->nodes[index].node == node);
/* Remove from vector. We do this by swapping node with the last element
@@ -169,16 +166,14 @@ lto_symtab_encoder_delete_node (lto_symtab_encoder_t encoder,
last_node = encoder->nodes.pop ();
if (last_node.node != node)
{
- last_slot = pointer_map_contains (encoder->map, last_node.node);
- gcc_checking_assert (last_slot && *last_slot);
- *last_slot = (void *)(size_t) (index + 1);
+ gcc_assert (encoder->map->put (last_node.node, index + 1));
/* Move the last element to the original spot of NODE. */
encoder->nodes[index] = last_node;
}
/* Remove element from hash table. */
- *slot = NULL;
+ encoder->map->remove (node);
return true;
}
diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h
index d350ad9..b2486dd 100644
--- a/gcc/lto-streamer.h
+++ b/gcc/lto-streamer.h
@@ -443,7 +443,7 @@ struct lto_encoder_entry
struct lto_symtab_encoder_d
{
vec<lto_encoder_entry> nodes;
- pointer_map_t *map;
+ hash_map<symtab_node *, size_t> *map;
};
typedef struct lto_symtab_encoder_d *lto_symtab_encoder_t;
@@ -1046,8 +1046,8 @@ static inline int
lto_symtab_encoder_lookup (lto_symtab_encoder_t encoder,
symtab_node *node)
{
- void **slot = pointer_map_contains (encoder->map, node);
- return (slot && *slot ? (size_t) *(slot) - 1 : LCC_NOT_FOUND);
+ size_t *slot = encoder->map->get (node);
+ return (slot && *slot ? *(slot) - 1 : LCC_NOT_FOUND);
}
/* Return true if iterator LSE points to nothing. */
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index b46693b..0fe2a40 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -812,16 +812,14 @@ is_reference (tree decl)
static inline tree
lookup_decl (tree var, omp_context *ctx)
{
- tree *n;
- n = (tree *) pointer_map_contains (ctx->cb.decl_map, var);
+ tree *n = ctx->cb.decl_map->get (var);
return *n;
}
static inline tree
maybe_lookup_decl (const_tree var, omp_context *ctx)
{
- tree *n;
- n = (tree *) pointer_map_contains (ctx->cb.decl_map, var);
+ tree *n = ctx->cb.decl_map->get (const_cast<tree> (var));
return n ? *n : NULL_TREE;
}
@@ -1359,7 +1357,7 @@ new_omp_context (gimple stmt, omp_context *outer_ctx)
ctx->depth = 1;
}
- ctx->cb.decl_map = pointer_map_create ();
+ ctx->cb.decl_map = new hash_map<tree, tree>;
return ctx;
}
@@ -1408,7 +1406,7 @@ delete_omp_context (splay_tree_value value)
{
omp_context *ctx = (omp_context *) value;
- pointer_map_destroy (ctx->cb.decl_map);
+ delete ctx->cb.decl_map;
if (ctx->field_map)
splay_tree_delete (ctx->field_map);
@@ -6541,7 +6539,6 @@ expand_omp_for_static_chunk (struct omp_region *region,
gimple_stmt_iterator psi;
gimple phi;
edge re, ene;
- edge_var_map_vector *head;
edge_var_map *vm;
size_t i;
@@ -6552,7 +6549,7 @@ expand_omp_for_static_chunk (struct omp_region *region,
appropriate phi nodes in iter_part_bb instead. */
se = single_pred_edge (fin_bb);
re = single_succ_edge (trip_update_bb);
- head = redirect_edge_var_map_vector (re);
+ vec<edge_var_map> *head = redirect_edge_var_map_vector (re);
ene = single_succ_edge (entry_bb);
psi = gsi_start_phis (fin_bb);
@@ -9219,7 +9216,7 @@ task_copyfn_remap_type (struct omp_taskcopy_context *tcctx, tree orig_type)
walk_tree (&DECL_FIELD_OFFSET (new_f), copy_tree_body_r,
&tcctx->cb, NULL);
new_fields = new_f;
- *pointer_map_insert (tcctx->cb.decl_map, f) = new_f;
+ tcctx->cb.decl_map->put (f, new_f);
}
TYPE_FIELDS (type) = nreverse (new_fields);
layout_type (type);
@@ -9286,7 +9283,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
tcctx.cb.copy_decl = task_copyfn_copy_decl;
tcctx.cb.eh_lp_nr = 0;
tcctx.cb.transform_call_graph_edges = CB_CGE_MOVE;
- tcctx.cb.decl_map = pointer_map_create ();
+ tcctx.cb.decl_map = new hash_map<tree, tree>;
tcctx.ctx = ctx;
if (record_needs_remap)
@@ -9311,12 +9308,12 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
tree *p;
decl = OMP_CLAUSE_DECL (c);
- p = (tree *) pointer_map_contains (tcctx.cb.decl_map, decl);
+ p = tcctx.cb.decl_map->get (decl);
if (p == NULL)
continue;
n = splay_tree_lookup (ctx->sfield_map, (splay_tree_key) decl);
sf = (tree) n->value;
- sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
+ sf = *tcctx.cb.decl_map->get (sf);
src = build_simple_mem_ref_loc (loc, sarg);
src = omp_build_component_ref (src, sf);
t = build2 (MODIFY_EXPR, TREE_TYPE (*p), *p, src);
@@ -9335,11 +9332,11 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
break;
f = (tree) n->value;
if (tcctx.cb.decl_map)
- f = *(tree *) pointer_map_contains (tcctx.cb.decl_map, f);
+ f = *tcctx.cb.decl_map->get (f);
n = splay_tree_lookup (ctx->sfield_map, (splay_tree_key) decl);
sf = (tree) n->value;
if (tcctx.cb.decl_map)
- sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
+ sf = *tcctx.cb.decl_map->get (sf);
src = build_simple_mem_ref_loc (loc, sarg);
src = omp_build_component_ref (src, sf);
dst = build_simple_mem_ref_loc (loc, arg);
@@ -9356,13 +9353,13 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
break;
f = (tree) n->value;
if (tcctx.cb.decl_map)
- f = *(tree *) pointer_map_contains (tcctx.cb.decl_map, f);
+ f = *tcctx.cb.decl_map->get (f);
n = splay_tree_lookup (ctx->sfield_map, (splay_tree_key) decl);
if (n != NULL)
{
sf = (tree) n->value;
if (tcctx.cb.decl_map)
- sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
+ sf = *tcctx.cb.decl_map->get (sf);
src = build_simple_mem_ref_loc (loc, sarg);
src = omp_build_component_ref (src, sf);
if (use_pointer_for_field (decl, NULL) || is_reference (decl))
@@ -9382,13 +9379,13 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
n = splay_tree_lookup (ctx->field_map, (splay_tree_key) decl);
f = (tree) n->value;
if (tcctx.cb.decl_map)
- f = *(tree *) pointer_map_contains (tcctx.cb.decl_map, f);
+ f = *tcctx.cb.decl_map->get (f);
n = splay_tree_lookup (ctx->sfield_map, (splay_tree_key) decl);
if (n != NULL)
{
sf = (tree) n->value;
if (tcctx.cb.decl_map)
- sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
+ sf = *tcctx.cb.decl_map->get (sf);
src = build_simple_mem_ref_loc (loc, sarg);
src = omp_build_component_ref (src, sf);
if (use_pointer_for_field (decl, NULL))
@@ -9419,7 +9416,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
if (n == NULL)
continue;
f = (tree) n->value;
- f = *(tree *) pointer_map_contains (tcctx.cb.decl_map, f);
+ f = *tcctx.cb.decl_map->get (f);
gcc_assert (DECL_HAS_VALUE_EXPR_P (decl));
ind = DECL_VALUE_EXPR (decl);
gcc_assert (TREE_CODE (ind) == INDIRECT_REF);
@@ -9427,7 +9424,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
n = splay_tree_lookup (ctx->sfield_map,
(splay_tree_key) TREE_OPERAND (ind, 0));
sf = (tree) n->value;
- sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
+ sf = *tcctx.cb.decl_map->get (sf);
src = build_simple_mem_ref_loc (loc, sarg);
src = omp_build_component_ref (src, sf);
src = build_simple_mem_ref_loc (loc, src);
@@ -9438,7 +9435,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
n = splay_tree_lookup (ctx->field_map,
(splay_tree_key) TREE_OPERAND (ind, 0));
df = (tree) n->value;
- df = *(tree *) pointer_map_contains (tcctx.cb.decl_map, df);
+ df = *tcctx.cb.decl_map->get (df);
ptr = build_simple_mem_ref_loc (loc, arg);
ptr = omp_build_component_ref (ptr, df);
t = build2 (MODIFY_EXPR, TREE_TYPE (ptr), ptr,
@@ -9450,7 +9447,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
append_to_statement_list (t, &list);
if (tcctx.cb.decl_map)
- pointer_map_destroy (tcctx.cb.decl_map);
+ delete tcctx.cb.decl_map;
pop_gimplify_context (NULL);
BIND_EXPR_BODY (bind) = list;
pop_cfun ();
diff --git a/gcc/predict.c b/gcc/predict.c
index 72a3b53..34ebdc3 100644
--- a/gcc/predict.c
+++ b/gcc/predict.c
@@ -52,6 +52,7 @@ along with GCC; see the file COPYING3. If not see
#include "target.h"
#include "cfgloop.h"
#include "pointer-set.h"
+#include "hash-map.h"
#include "tree-ssa-alias.h"
#include "internal-fn.h"
#include "gimple-expr.h"
@@ -490,11 +491,6 @@ rtl_predicted_by_p (const_basic_block bb, enum br_predictor predictor)
return false;
}
-/* This map contains for a basic block the list of predictions for the
- outgoing edges. */
-
-static struct pointer_map_t *bb_predictions;
-
/* Structure representing predictions in tree level. */
struct edge_prediction {
@@ -504,6 +500,11 @@ struct edge_prediction {
int ep_probability;
};
+/* This map contains for a basic block the list of predictions for the
+ outgoing edges. */
+
+static hash_map<const_basic_block, edge_prediction *> *bb_predictions;
+
/* Return true if the one of outgoing edges is already predicted by
PREDICTOR. */
@@ -511,12 +512,12 @@ bool
gimple_predicted_by_p (const_basic_block bb, enum br_predictor predictor)
{
struct edge_prediction *i;
- void **preds = pointer_map_contains (bb_predictions, bb);
+ edge_prediction **preds = bb_predictions->get (bb);
if (!preds)
return false;
- for (i = (struct edge_prediction *) *preds; i; i = i->ep_next)
+ for (i = *preds; i; i = i->ep_next)
if (i->ep_predictor == predictor)
return true;
return false;
@@ -618,10 +619,10 @@ gimple_predict_edge (edge e, enum br_predictor predictor, int probability)
&& flag_guess_branch_prob && optimize)
{
struct edge_prediction *i = XNEW (struct edge_prediction);
- void **preds = pointer_map_insert (bb_predictions, e->src);
+ edge_prediction *&preds = bb_predictions->get_or_insert (e->src);
- i->ep_next = (struct edge_prediction *) *preds;
- *preds = i;
+ i->ep_next = preds;
+ preds = i;
i->ep_probability = probability;
i->ep_predictor = predictor;
i->ep_edge = e;
@@ -633,16 +634,14 @@ gimple_predict_edge (edge e, enum br_predictor predictor, int probability)
void
remove_predictions_associated_with_edge (edge e)
{
- void **preds;
-
if (!bb_predictions)
return;
- preds = pointer_map_contains (bb_predictions, e->src);
+ edge_prediction **preds = bb_predictions->get (e->src);
if (preds)
{
- struct edge_prediction **prediction = (struct edge_prediction **) preds;
+ struct edge_prediction **prediction = preds;
struct edge_prediction *next;
while (*prediction)
@@ -664,13 +663,13 @@ remove_predictions_associated_with_edge (edge e)
static void
clear_bb_predictions (basic_block bb)
{
- void **preds = pointer_map_contains (bb_predictions, bb);
+ edge_prediction **preds = bb_predictions->get (bb);
struct edge_prediction *pred, *next;
if (!preds)
return;
- for (pred = (struct edge_prediction *) *preds; pred; pred = next)
+ for (pred = *preds; pred; pred = next)
{
next = pred->ep_next;
free (pred);
@@ -903,7 +902,6 @@ combine_predictions_for_bb (basic_block bb)
int nedges = 0;
edge e, first = NULL, second = NULL;
edge_iterator ei;
- void **preds;
FOR_EACH_EDGE (e, ei, bb->succs)
if (!(e->flags & (EDGE_EH | EDGE_FAKE)))
@@ -935,12 +933,12 @@ combine_predictions_for_bb (basic_block bb)
if (dump_file)
fprintf (dump_file, "Predictions for bb %i\n", bb->index);
- preds = pointer_map_contains (bb_predictions, bb);
+ edge_prediction **preds = bb_predictions->get (bb);
if (preds)
{
/* We implement "first match" heuristics and use probability guessed
by predictor with smallest index. */
- for (pred = (struct edge_prediction *) *preds; pred; pred = pred->ep_next)
+ for (pred = *preds; pred; pred = pred->ep_next)
{
enum br_predictor predictor = pred->ep_predictor;
int probability = pred->ep_probability;
@@ -2243,14 +2241,14 @@ tree_bb_level_predictions (void)
#ifdef ENABLE_CHECKING
-/* Callback for pointer_map_traverse, asserts that the pointer map is
+/* Callback for hash_map::traverse, asserts that the pointer map is
empty. */
-static bool
-assert_is_empty (const void *key ATTRIBUTE_UNUSED, void **value,
- void *data ATTRIBUTE_UNUSED)
+bool
+assert_is_empty (const_basic_block const &, edge_prediction *const &value,
+ void *)
{
- gcc_assert (!*value);
+ gcc_assert (!value);
return false;
}
#endif
@@ -2375,7 +2373,7 @@ tree_estimate_probability (void)
create_preheaders (CP_SIMPLE_PREHEADERS);
calculate_dominance_info (CDI_POST_DOMINATORS);
- bb_predictions = pointer_map_create ();
+ bb_predictions = new hash_map<const_basic_block, edge_prediction *>;
tree_bb_level_predictions ();
record_loop_exits ();
@@ -2389,9 +2387,9 @@ tree_estimate_probability (void)
combine_predictions_for_bb (bb);
#ifdef ENABLE_CHECKING
- pointer_map_traverse (bb_predictions, assert_is_empty, NULL);
+ bb_predictions->traverse<void *, assert_is_empty> (NULL);
#endif
- pointer_map_destroy (bb_predictions);
+ delete bb_predictions;
bb_predictions = NULL;
estimate_bb_frequencies (false);
diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
index e034762..cfa6527 100644
--- a/gcc/tree-cfg.c
+++ b/gcc/tree-cfg.c
@@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see
#include "system.h"
#include "coretypes.h"
#include "hash-table.h"
+#include "hash-map.h"
#include "tm.h"
#include "tree.h"
#include "trans-mem.h"
@@ -92,7 +93,7 @@ static const int initial_cfg_capacity = 20;
more persistent. The key is getting notification of changes to
the CFG (particularly edge removal, creation and redirection). */
-static struct pointer_map_t *edge_to_cases;
+static hash_map<edge, tree> *edge_to_cases;
/* If we record edge_to_cases, this bitmap will hold indexes
of basic blocks that end in a GIMPLE_SWITCH which we touched
@@ -1048,19 +1049,17 @@ make_cond_expr_edges (basic_block bb)
SWITCH_EXPRs and structure sharing rules, then free the hash table
element. */
-static bool
-edge_to_cases_cleanup (const void *key ATTRIBUTE_UNUSED, void **value,
- void *data ATTRIBUTE_UNUSED)
+bool
+edge_to_cases_cleanup (edge const &, tree const &value, void *)
{
tree t, next;
- for (t = (tree) *value; t; t = next)
+ for (t = value; t; t = next)
{
next = CASE_CHAIN (t);
CASE_CHAIN (t) = NULL;
}
- *value = NULL;
return true;
}
@@ -1070,7 +1069,7 @@ void
start_recording_case_labels (void)
{
gcc_assert (edge_to_cases == NULL);
- edge_to_cases = pointer_map_create ();
+ edge_to_cases = new hash_map<edge, tree>;
touched_switch_bbs = BITMAP_ALLOC (NULL);
}
@@ -1089,8 +1088,8 @@ end_recording_case_labels (void)
{
bitmap_iterator bi;
unsigned i;
- pointer_map_traverse (edge_to_cases, edge_to_cases_cleanup, NULL);
- pointer_map_destroy (edge_to_cases);
+ edge_to_cases->traverse<void *, edge_to_cases_cleanup> (NULL);
+ delete edge_to_cases;
edge_to_cases = NULL;
EXECUTE_IF_SET_IN_BITMAP (touched_switch_bbs, 0, i, bi)
{
@@ -1113,7 +1112,7 @@ end_recording_case_labels (void)
static tree
get_cases_for_edge (edge e, gimple t)
{
- void **slot;
+ tree *slot;
size_t i, n;
/* If we are not recording cases, then we do not have CASE_LABEL_EXPR
@@ -1121,9 +1120,9 @@ get_cases_for_edge (edge e, gimple t)
if (!recording_case_labels_p ())
return NULL;
- slot = pointer_map_contains (edge_to_cases, e);
+ slot = edge_to_cases->get (e);
if (slot)
- return (tree) *slot;
+ return *slot;
/* If we did not find E in the hash table, then this must be the first
time we have been queried for information about E & T. Add all the
@@ -1139,12 +1138,12 @@ get_cases_for_edge (edge e, gimple t)
/* Add it to the chain of CASE_LABEL_EXPRs referencing E, or create
a new chain. */
- slot = pointer_map_insert (edge_to_cases, this_edge);
- CASE_CHAIN (elt) = (tree) *slot;
- *slot = elt;
+ tree &s = edge_to_cases->get_or_insert (this_edge);
+ CASE_CHAIN (elt) = s;
+ s = elt;
}
- return (tree) *pointer_map_contains (edge_to_cases, e);
+ return *edge_to_cases->get (e);
}
/* Create the edges for a GIMPLE_SWITCH starting at block BB. */
@@ -2577,12 +2576,11 @@ last_and_only_stmt (basic_block bb)
static void
reinstall_phi_args (edge new_edge, edge old_edge)
{
- edge_var_map_vector *v;
edge_var_map *vm;
int i;
gimple_stmt_iterator phis;
- v = redirect_edge_var_map_vector (old_edge);
+ vec<edge_var_map> *v = redirect_edge_var_map_vector (old_edge);
if (!v)
return;
@@ -6268,22 +6266,20 @@ gather_blocks_in_sese_region (basic_block entry, basic_block exit,
The duplicates are recorded in VARS_MAP. */
static void
-replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
+replace_by_duplicate_decl (tree *tp, hash_map<tree, tree> *vars_map,
tree to_context)
{
tree t = *tp, new_t;
struct function *f = DECL_STRUCT_FUNCTION (to_context);
- void **loc;
if (DECL_CONTEXT (t) == to_context)
return;
- loc = pointer_map_contains (vars_map, t);
+ bool existed;
+ tree &loc = vars_map->get_or_insert (t, &existed);
- if (!loc)
+ if (!existed)
{
- loc = pointer_map_insert (vars_map, t);
-
if (SSA_VAR_P (t))
{
new_t = copy_var_decl (t, DECL_NAME (t), TREE_TYPE (t));
@@ -6296,10 +6292,10 @@ replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
}
DECL_CONTEXT (new_t) = to_context;
- *loc = new_t;
+ loc = new_t;
}
else
- new_t = (tree) *loc;
+ new_t = loc;
*tp = new_t;
}
@@ -6309,15 +6305,14 @@ replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
VARS_MAP maps old ssa names and var_decls to the new ones. */
static tree
-replace_ssa_name (tree name, struct pointer_map_t *vars_map,
+replace_ssa_name (tree name, hash_map<tree, tree> *vars_map,
tree to_context)
{
- void **loc;
tree new_name;
gcc_assert (!virtual_operand_p (name));
- loc = pointer_map_contains (vars_map, name);
+ tree *loc = vars_map->get (name);
if (!loc)
{
@@ -6335,11 +6330,10 @@ replace_ssa_name (tree name, struct pointer_map_t *vars_map,
new_name = copy_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context),
name, SSA_NAME_DEF_STMT (name));
- loc = pointer_map_insert (vars_map, name);
- *loc = new_name;
+ vars_map->put (name, new_name);
}
else
- new_name = (tree) *loc;
+ new_name = *loc;
return new_name;
}
@@ -6350,9 +6344,9 @@ struct move_stmt_d
tree new_block;
tree from_context;
tree to_context;
- struct pointer_map_t *vars_map;
+ hash_map<tree, tree> *vars_map;
htab_t new_label_map;
- struct pointer_map_t *eh_map;
+ hash_map<void *, void *> *eh_map;
bool remap_decls_p;
};
@@ -6429,11 +6423,9 @@ static int
move_stmt_eh_region_nr (int old_nr, struct move_stmt_d *p)
{
eh_region old_r, new_r;
- void **slot;
old_r = get_eh_region_from_number (old_nr);
- slot = pointer_map_contains (p->eh_map, old_r);
- new_r = (eh_region) *slot;
+ new_r = static_cast<eh_region> (*p->eh_map->get (old_r));
return new_r->index;
}
@@ -6767,7 +6759,7 @@ new_label_mapper (tree decl, void *data)
subblocks. */
static void
-replace_block_vars_by_duplicates (tree block, struct pointer_map_t *vars_map,
+replace_block_vars_by_duplicates (tree block, hash_map<tree, tree> *vars_map,
tree to_context)
{
tree *tp, t;
@@ -6845,7 +6837,7 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
edge e;
edge_iterator ei;
htab_t new_label_map;
- struct pointer_map_t *vars_map, *eh_map;
+ hash_map<void *, void *> *eh_map;
struct loop *loop = entry_bb->loop_father;
struct loop *loop0 = get_loop (saved_cfun, 0);
struct move_stmt_d d;
@@ -6989,14 +6981,14 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
/* Move blocks from BBS into DEST_CFUN. */
gcc_assert (bbs.length () >= 2);
after = dest_cfun->cfg->x_entry_block_ptr;
- vars_map = pointer_map_create ();
+ hash_map<tree, tree> vars_map;
memset (&d, 0, sizeof (d));
d.orig_block = orig_block;
d.new_block = DECL_INITIAL (dest_cfun->decl);
d.from_context = cfun->decl;
d.to_context = dest_cfun->decl;
- d.vars_map = vars_map;
+ d.vars_map = &vars_map;
d.new_label_map = new_label_map;
d.eh_map = eh_map;
d.remap_decls_p = true;
@@ -7051,13 +7043,12 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
}
replace_block_vars_by_duplicates (DECL_INITIAL (dest_cfun->decl),
- vars_map, dest_cfun->decl);
+ &vars_map, dest_cfun->decl);
if (new_label_map)
htab_delete (new_label_map);
if (eh_map)
- pointer_map_destroy (eh_map);
- pointer_map_destroy (vars_map);
+ delete eh_map;
/* Rewire the entry and exit blocks. The successor to the entry
block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in
diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c
index bc4d83e..2b6927e 100644
--- a/gcc/tree-cfgcleanup.c
+++ b/gcc/tree-cfgcleanup.c
@@ -865,16 +865,14 @@ remove_forwarder_block_with_phi (basic_block bb)
if (TREE_CODE (def) == SSA_NAME)
{
- edge_var_map_vector *head;
- edge_var_map *vm;
- size_t i;
-
/* If DEF is one of the results of PHI nodes removed during
redirection, replace it with the PHI argument that used
to be on E. */
- head = redirect_edge_var_map_vector (e);
- FOR_EACH_VEC_SAFE_ELT (head, i, vm)
+ vec<edge_var_map> *head = redirect_edge_var_map_vector (e);
+ size_t length = head ? head->length () : 0;
+ for (size_t i = 0; i < length; i++)
{
+ edge_var_map *vm = &(*head)[i];
tree old_arg = redirect_edge_var_map_result (vm);
tree new_arg = redirect_edge_var_map_def (vm);
diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
index 38842e8..db28184 100644
--- a/gcc/tree-eh.c
+++ b/gcc/tree-eh.c
@@ -406,7 +406,7 @@ struct leh_tf_state
size_t goto_queue_active;
/* Pointer map to help in searching goto_queue when it is large. */
- struct pointer_map_t *goto_queue_map;
+ hash_map<gimple, goto_queue_node *> *goto_queue_map;
/* The set of unique labels seen as entries in the goto queue. */
vec<tree> dest_array;
@@ -441,7 +441,6 @@ static gimple_seq
find_goto_replacement (struct leh_tf_state *tf, treemple stmt)
{
unsigned int i;
- void **slot;
if (tf->goto_queue_active < LARGE_GOTO_QUEUE)
{
@@ -456,19 +455,18 @@ find_goto_replacement (struct leh_tf_state *tf, treemple stmt)
if (!tf->goto_queue_map)
{
- tf->goto_queue_map = pointer_map_create ();
+ tf->goto_queue_map = new hash_map<gimple, goto_queue_node *>;
for (i = 0; i < tf->goto_queue_active; i++)
{
- slot = pointer_map_insert (tf->goto_queue_map,
- tf->goto_queue[i].stmt.g);
- gcc_assert (*slot == NULL);
- *slot = &tf->goto_queue[i];
+ bool existed = tf->goto_queue_map->put (tf->goto_queue[i].stmt.g,
+ &tf->goto_queue[i]);
+ gcc_assert (!existed);
}
}
- slot = pointer_map_contains (tf->goto_queue_map, stmt.g);
+ goto_queue_node **slot = tf->goto_queue_map->get (stmt.g);
if (slot != NULL)
- return (((struct goto_queue_node *) *slot)->repl_stmt);
+ return ((*slot)->repl_stmt);
return NULL;
}
@@ -1372,7 +1370,7 @@ lower_try_finally_switch (struct leh_state *state, struct leh_tf_state *tf)
tree tmp;
gimple switch_stmt;
gimple_seq finally;
- struct pointer_map_t *cont_map = NULL;
+ hash_map<tree, gimple> *cont_map = NULL;
/* The location of the TRY_FINALLY stmt. */
location_t tf_loc = gimple_location (tf->try_finally_expr);
/* The location of the finally block. */
@@ -1511,32 +1509,27 @@ lower_try_finally_switch (struct leh_state *state, struct leh_tf_state *tf)
if (case_label_vec.length () <= case_index || !case_label_vec[case_index])
{
tree case_lab;
- void **slot;
tmp = build_int_cst (integer_type_node, switch_id);
case_lab = build_case_label (tmp, NULL,
create_artificial_label (tf_loc));
/* We store the cont_stmt in the pointer map, so that we can recover
it in the loop below. */
if (!cont_map)
- cont_map = pointer_map_create ();
- slot = pointer_map_insert (cont_map, case_lab);
- *slot = q->cont_stmt;
+ cont_map = new hash_map<tree, gimple>;
+ cont_map->put (case_lab, q->cont_stmt);
case_label_vec.quick_push (case_lab);
}
}
for (j = last_case_index; j < last_case_index + nlabels; j++)
{
gimple cont_stmt;
- void **slot;
last_case = case_label_vec[j];
gcc_assert (last_case);
gcc_assert (cont_map);
- slot = pointer_map_contains (cont_map, last_case);
- gcc_assert (slot);
- cont_stmt = *(gimple *) slot;
+ cont_stmt = *cont_map->get (last_case);
x = gimple_build_label (CASE_LABEL (last_case));
gimple_seq_add_stmt (&switch_body, x);
@@ -1544,7 +1537,7 @@ lower_try_finally_switch (struct leh_state *state, struct leh_tf_state *tf)
maybe_record_in_goto_queue (state, cont_stmt);
}
if (cont_map)
- pointer_map_destroy (cont_map);
+ delete cont_map;
replace_goto_queue (tf);
@@ -1734,7 +1727,7 @@ lower_try_finally (struct leh_state *state, gimple tp)
this_tf.dest_array.release ();
free (this_tf.goto_queue);
if (this_tf.goto_queue_map)
- pointer_map_destroy (this_tf.goto_queue_map);
+ delete this_tf.goto_queue_map;
/* If there was an old (aka outer) eh_seq, append the current eh_seq.
If there was no old eh_seq, then the append is trivially already done. */
@@ -2921,10 +2914,10 @@ maybe_clean_or_replace_eh_stmt (gimple old_stmt, gimple new_stmt)
bool
maybe_duplicate_eh_stmt_fn (struct function *new_fun, gimple new_stmt,
struct function *old_fun, gimple old_stmt,
- struct pointer_map_t *map, int default_lp_nr)
+ hash_map<void *, void *> *map,
+ int default_lp_nr)
{
int old_lp_nr, new_lp_nr;
- void **slot;
if (!stmt_could_throw_p (new_stmt))
return false;
@@ -2941,8 +2934,7 @@ maybe_duplicate_eh_stmt_fn (struct function *new_fun, gimple new_stmt,
eh_landing_pad old_lp, new_lp;
old_lp = (*old_fun->eh->lp_array)[old_lp_nr];
- slot = pointer_map_contains (map, old_lp);
- new_lp = (eh_landing_pad) *slot;
+ new_lp = static_cast<eh_landing_pad> (*map->get (old_lp));
new_lp_nr = new_lp->index;
}
else
@@ -2950,8 +2942,7 @@ maybe_duplicate_eh_stmt_fn (struct function *new_fun, gimple new_stmt,
eh_region old_r, new_r;
old_r = (*old_fun->eh->region_array)[-old_lp_nr];
- slot = pointer_map_contains (map, old_r);
- new_r = (eh_region) *slot;
+ new_r = static_cast<eh_region> (*map->get (old_r));
new_lp_nr = -new_r->index;
}
@@ -3154,7 +3145,7 @@ make_pass_refactor_eh (gcc::context *ctxt)
/* At the end of gimple optimization, we can lower RESX. */
static bool
-lower_resx (basic_block bb, gimple stmt, struct pointer_map_t *mnt_map)
+lower_resx (basic_block bb, gimple stmt, hash_map<eh_region, tree> *mnt_map)
{
int lp_nr;
eh_region src_r, dst_r;
@@ -3199,14 +3190,13 @@ lower_resx (basic_block bb, gimple stmt, struct pointer_map_t *mnt_map)
if (lp_nr < 0)
{
basic_block new_bb;
- void **slot;
tree lab;
/* We are resuming into a MUST_NOT_CALL region. Expand a call to
the failure decl into a new block, if needed. */
gcc_assert (dst_r->type == ERT_MUST_NOT_THROW);
- slot = pointer_map_contains (mnt_map, dst_r);
+ tree *slot = mnt_map->get (dst_r);
if (slot == NULL)
{
gimple_stmt_iterator gsi2;
@@ -3221,12 +3211,11 @@ lower_resx (basic_block bb, gimple stmt, struct pointer_map_t *mnt_map)
gimple_set_location (x, dst_r->u.must_not_throw.failure_loc);
gsi_insert_after (&gsi2, x, GSI_CONTINUE_LINKING);
- slot = pointer_map_insert (mnt_map, dst_r);
- *slot = lab;
+ mnt_map->put (dst_r, lab);
}
else
{
- lab = (tree) *slot;
+ lab = *slot;
new_bb = label_to_block (lab);
}
@@ -3334,24 +3323,21 @@ unsigned
pass_lower_resx::execute (function *fun)
{
basic_block bb;
- struct pointer_map_t *mnt_map;
bool dominance_invalidated = false;
bool any_rewritten = false;
- mnt_map = pointer_map_create ();
+ hash_map<eh_region, tree> mnt_map;
FOR_EACH_BB_FN (bb, fun)
{
gimple last = last_stmt (bb);
if (last && is_gimple_resx (last))
{
- dominance_invalidated |= lower_resx (bb, last, mnt_map);
+ dominance_invalidated |= lower_resx (bb, last, &mnt_map);
any_rewritten = true;
}
}
- pointer_map_destroy (mnt_map);
-
if (dominance_invalidated)
{
free_dominance_info (CDI_DOMINATORS);
diff --git a/gcc/tree-eh.h b/gcc/tree-eh.h
index cd9b40d..51c2adc 100644
--- a/gcc/tree-eh.h
+++ b/gcc/tree-eh.h
@@ -20,6 +20,10 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_TREE_EH_H
#define GCC_TREE_EH_H
+#include "hash-map.h"
+
+typedef struct eh_region_d *eh_region;
+
extern void using_eh_for_cleanups (void);
extern void add_stmt_to_eh_lp (gimple, int);
extern bool remove_stmt_from_eh_lp_fn (struct function *, gimple);
@@ -43,7 +47,7 @@ extern bool maybe_clean_eh_stmt (gimple);
extern bool maybe_clean_or_replace_eh_stmt (gimple, gimple);
extern bool maybe_duplicate_eh_stmt_fn (struct function *, gimple,
struct function *, gimple,
- struct pointer_map_t *, int);
+ hash_map<void *, void *> *, int);
extern bool maybe_duplicate_eh_stmt (gimple, gimple);
extern void maybe_remove_unreachable_handlers (void);
extern bool verify_eh_edges (gimple);
diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 6af4912..e2b7990 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -135,7 +135,7 @@ static tree declare_return_variable (copy_body_data *, tree, tree, basic_block);
static void remap_block (tree *, copy_body_data *);
static void copy_bind_expr (tree *, int *, copy_body_data *);
static void declare_inline_vars (tree, tree);
-static void remap_save_expr (tree *, void *, int *);
+static void remap_save_expr (tree *, hash_map<tree, tree> *, int *);
static void prepend_lexical_block (tree current_block, tree new_block);
static tree copy_decl_to_var (tree, copy_body_data *);
static tree copy_result_decl_to_var (tree, copy_body_data *);
@@ -149,12 +149,12 @@ static bool delete_unreachable_blocks_update_callgraph (copy_body_data *id);
void
insert_decl_map (copy_body_data *id, tree key, tree value)
{
- *pointer_map_insert (id->decl_map, key) = value;
+ id->decl_map->put (key, value);
/* Always insert an identity map as well. If we see this same new
node again, we won't want to duplicate it a second time. */
if (key != value)
- *pointer_map_insert (id->decl_map, value) = value;
+ id->decl_map->put (value, value);
}
/* Insert a tree->tree mapping for ID. This is only used for
@@ -176,9 +176,9 @@ insert_debug_decl_map (copy_body_data *id, tree key, tree value)
gcc_assert (TREE_CODE (value) == VAR_DECL);
if (!id->debug_map)
- id->debug_map = pointer_map_create ();
+ id->debug_map = new hash_map<tree, tree>;
- *pointer_map_insert (id->debug_map, key) = value;
+ id->debug_map->put (key, value);
}
/* If nonzero, we're remapping the contents of inlined debug
@@ -197,7 +197,7 @@ remap_ssa_name (tree name, copy_body_data *id)
gcc_assert (TREE_CODE (name) == SSA_NAME);
- n = (tree *) pointer_map_contains (id->decl_map, name);
+ n = id->decl_map->get (name);
if (n)
return unshare_expr (*n);
@@ -213,7 +213,7 @@ remap_ssa_name (tree name, copy_body_data *id)
gimple_stmt_iterator gsi;
tree val = SSA_NAME_VAR (name);
- n = (tree *) pointer_map_contains (id->decl_map, val);
+ n = id->decl_map->get (val);
if (n != NULL)
val = *n;
if (TREE_CODE (val) != PARM_DECL)
@@ -342,7 +342,7 @@ remap_decl (tree decl, copy_body_data *id)
/* See if we have remapped this declaration. */
- n = (tree *) pointer_map_contains (id->decl_map, decl);
+ n = id->decl_map->get (decl);
if (!n && processing_debug_stmt)
{
@@ -562,7 +562,7 @@ remap_type (tree type, copy_body_data *id)
return type;
/* See if we have remapped this type. */
- node = (tree *) pointer_map_contains (id->decl_map, type);
+ node = id->decl_map->get (type);
if (node)
return *node;
@@ -887,7 +887,7 @@ remap_gimple_op_r (tree *tp, int *walk_subtrees, void *data)
{
/* If the enclosing record type is variably_modified_type_p, the field
has already been remapped. Otherwise, it need not be. */
- tree *n = (tree *) pointer_map_contains (id->decl_map, *tp);
+ tree *n = id->decl_map->get (*tp);
if (n)
*tp = *n;
*walk_subtrees = 0;
@@ -981,8 +981,7 @@ remap_gimple_op_r (tree *tp, int *walk_subtrees, void *data)
if (old_block)
{
tree *n;
- n = (tree *) pointer_map_contains (id->decl_map,
- TREE_BLOCK (*tp));
+ n = id->decl_map->get (TREE_BLOCK (*tp));
if (n)
new_block = *n;
}
@@ -1108,7 +1107,7 @@ copy_tree_body_r (tree *tp, int *walk_subtrees, void *data)
tree decl = TREE_OPERAND (*tp, 0), value;
tree *n;
- n = (tree *) pointer_map_contains (id->decl_map, decl);
+ n = id->decl_map->get (decl);
if (n)
{
value = *n;
@@ -1125,7 +1124,7 @@ copy_tree_body_r (tree *tp, int *walk_subtrees, void *data)
/* Get rid of *& from inline substitutions that can happen when a
pointer argument is an ADDR_EXPR. */
tree decl = TREE_OPERAND (*tp, 0);
- tree *n = (tree *) pointer_map_contains (id->decl_map, decl);
+ tree *n = id->decl_map->get (decl);
if (n)
{
/* If we happen to get an ADDR_EXPR in n->value, strip
@@ -1206,8 +1205,7 @@ copy_tree_body_r (tree *tp, int *walk_subtrees, void *data)
if (TREE_BLOCK (*tp))
{
tree *n;
- n = (tree *) pointer_map_contains (id->decl_map,
- TREE_BLOCK (*tp));
+ n = id->decl_map->get (TREE_BLOCK (*tp));
if (n)
new_block = *n;
}
@@ -1261,11 +1259,9 @@ static int
remap_eh_region_nr (int old_nr, copy_body_data *id)
{
eh_region old_r, new_r;
- void **slot;
old_r = get_eh_region_from_number_fn (id->src_cfun, old_nr);
- slot = pointer_map_contains (id->eh_map, old_r);
- new_r = (eh_region) *slot;
+ new_r = static_cast<eh_region> (*id->eh_map->get (old_r));
return new_r->index;
}
@@ -1483,7 +1479,7 @@ remap_gimple_stmt (gimple stmt, copy_body_data *id)
tree decl = gimple_assign_lhs (stmt), value;
tree *n;
- n = (tree *) pointer_map_contains (id->decl_map, decl);
+ n = id->decl_map->get (decl);
if (n)
{
value = *n;
@@ -1597,7 +1593,7 @@ remap_gimple_stmt (gimple stmt, copy_body_data *id)
if (gimple_block (copy))
{
tree *n;
- n = (tree *) pointer_map_contains (id->decl_map, gimple_block (copy));
+ n = id->decl_map->get (gimple_block (copy));
gcc_assert (n);
gimple_set_block (copy, *n);
}
@@ -2191,8 +2187,7 @@ copy_phis_for_bb (basic_block bb, copy_body_data *id)
if (LOCATION_BLOCK (locus))
{
tree *n;
- n = (tree *) pointer_map_contains (id->decl_map,
- LOCATION_BLOCK (locus));
+ n = id->decl_map->get (LOCATION_BLOCK (locus));
gcc_assert (n);
if (*n)
locus = COMBINE_LOCATION_DATA (line_table, locus, *n);
@@ -2638,7 +2633,7 @@ copy_cfg_body (copy_body_data * id, gcov_type count, int frequency_scale,
if (id->eh_map)
{
- pointer_map_destroy (id->eh_map);
+ delete id->eh_map;
id->eh_map = NULL;
}
@@ -2659,7 +2654,7 @@ copy_debug_stmt (gimple stmt, copy_body_data *id)
if (gimple_block (stmt))
{
- n = (tree *) pointer_map_contains (id->decl_map, gimple_block (stmt));
+ n = id->decl_map->get (gimple_block (stmt));
gimple_set_block (stmt, n ? *n : id->block);
}
@@ -2675,14 +2670,14 @@ copy_debug_stmt (gimple stmt, copy_body_data *id)
t = gimple_debug_bind_get_var (stmt);
if (TREE_CODE (t) == PARM_DECL && id->debug_map
- && (n = (tree *) pointer_map_contains (id->debug_map, t)))
+ && (n = id->debug_map->get (t)))
{
gcc_assert (TREE_CODE (*n) == VAR_DECL);
t = *n;
}
else if (TREE_CODE (t) == VAR_DECL
&& !is_global_var (t)
- && !pointer_map_contains (id->decl_map, t))
+ && !id->decl_map->get (t))
/* T is a non-localized variable. */;
else
walk_tree (&t, remap_gimple_op_r, &wi, NULL);
@@ -3076,7 +3071,7 @@ initialize_inlined_parameters (copy_body_data *id, gimple stmt,
parameter following the array. */
for (p = parms, i = 0; p; p = DECL_CHAIN (p), i++)
{
- tree *varp = (tree *) pointer_map_contains (id->decl_map, p);
+ tree *varp = id->decl_map->get (p);
if (varp
&& TREE_CODE (*varp) == VAR_DECL)
{
@@ -3089,7 +3084,7 @@ initialize_inlined_parameters (copy_body_data *id, gimple stmt,
by the parameter setup. */
if (def)
{
- tree *defp = (tree *) pointer_map_contains (id->decl_map, def);
+ tree *defp = id->decl_map->get (def);
if (defp
&& TREE_CODE (*defp) == SSA_NAME
&& SSA_NAME_VAR (*defp) == var)
@@ -4135,7 +4130,8 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
{
tree use_retvar;
tree fn;
- struct pointer_map_t *st, *dst;
+ hash_map<tree, tree> *dst;
+ hash_map<tree, tree> *st = NULL;
tree return_slot;
tree modify_dest;
location_t saved_location;
@@ -4291,7 +4287,7 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
/* Local declarations will be replaced by their equivalents in this
map. */
st = id->decl_map;
- id->decl_map = pointer_map_create ();
+ id->decl_map = new hash_map<tree, tree>;
dst = id->debug_map;
id->debug_map = NULL;
@@ -4415,10 +4411,10 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
/* Clean up. */
if (id->debug_map)
{
- pointer_map_destroy (id->debug_map);
+ delete id->debug_map;
id->debug_map = dst;
}
- pointer_map_destroy (id->decl_map);
+ delete id->decl_map;
id->decl_map = st;
/* Unlink the calls virtual operands before replacing it. */
@@ -4772,14 +4768,13 @@ copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
the function into which the copy will be placed. */
static void
-remap_save_expr (tree *tp, void *st_, int *walk_subtrees)
+remap_save_expr (tree *tp, hash_map<tree, tree> *st, int *walk_subtrees)
{
- struct pointer_map_t *st = (struct pointer_map_t *) st_;
tree *n;
tree t;
/* See if we already encountered this SAVE_EXPR. */
- n = (tree *) pointer_map_contains (st, *tp);
+ n = st->get (*tp);
/* If we didn't already remap this SAVE_EXPR, do so now. */
if (!n)
@@ -4787,9 +4782,9 @@ remap_save_expr (tree *tp, void *st_, int *walk_subtrees)
t = copy_node (*tp);
/* Remember this SAVE_EXPR. */
- *pointer_map_insert (st, *tp) = t;
+ st->put (*tp, t);
/* Make sure we don't remap an already-remapped SAVE_EXPR. */
- *pointer_map_insert (st, t) = t;
+ st->put (t, t);
}
else
{
@@ -4836,7 +4831,7 @@ replace_locals_op (tree *tp, int *walk_subtrees, void *data)
{
struct walk_stmt_info *wi = (struct walk_stmt_info*) data;
copy_body_data *id = (copy_body_data *) wi->info;
- struct pointer_map_t *st = id->decl_map;
+ hash_map<tree, tree> *st = id->decl_map;
tree *n;
tree expr = *tp;
@@ -4846,7 +4841,7 @@ replace_locals_op (tree *tp, int *walk_subtrees, void *data)
|| TREE_CODE (expr) == LABEL_DECL)
{
/* Lookup the declaration. */
- n = (tree *) pointer_map_contains (st, expr);
+ n = st->get (expr);
/* If it's there, remap it. */
if (n)
@@ -4928,7 +4923,7 @@ copy_gimple_seq_and_replace_locals (gimple_seq seq)
memset (&id, 0, sizeof (id));
id.src_fn = current_function_decl;
id.dst_fn = current_function_decl;
- id.decl_map = pointer_map_create ();
+ id.decl_map = new hash_map<tree, tree>;
id.debug_map = NULL;
id.copy_decl = copy_decl_no_change;
@@ -4953,9 +4948,9 @@ copy_gimple_seq_and_replace_locals (gimple_seq seq)
walk_gimple_seq (copy, replace_locals_stmt, replace_locals_op, &wi);
/* Clean up. */
- pointer_map_destroy (id.decl_map);
+ delete id.decl_map;
if (id.debug_map)
- pointer_map_destroy (id.debug_map);
+ delete id.debug_map;
return copy;
}
@@ -5145,7 +5140,7 @@ copy_arguments_for_versioning (tree orig_parm, copy_body_data * id,
*parg = new_tree;
parg = &DECL_CHAIN (new_tree);
}
- else if (!pointer_map_contains (id->decl_map, arg))
+ else if (!id->decl_map->get (arg))
{
/* Make an equivalent VAR_DECL. If the argument was used
as temporary variable later in function, the uses will be
@@ -5368,7 +5363,7 @@ tree_function_versioning (tree old_decl, tree new_decl,
/* Generate a new name for the new version. */
id.statements_to_fold = new hash_set<gimple>;
- id.decl_map = pointer_map_create ();
+ id.decl_map = new hash_map<tree, tree>;
id.debug_map = NULL;
id.src_fn = old_decl;
id.dst_fn = new_decl;
@@ -5530,9 +5525,9 @@ tree_function_versioning (tree old_decl, tree new_decl,
}
/* Clean up. */
- pointer_map_destroy (id.decl_map);
+ delete id.decl_map;
if (id.debug_map)
- pointer_map_destroy (id.debug_map);
+ delete id.debug_map;
free_dominance_info (CDI_DOMINATORS);
free_dominance_info (CDI_POST_DOMINATORS);
@@ -5587,22 +5582,22 @@ maybe_inline_call_in_expr (tree exp)
/* We can only try to inline "const" functions. */
if (fn && TREE_READONLY (fn) && DECL_SAVED_TREE (fn))
{
- struct pointer_map_t *decl_map = pointer_map_create ();
call_expr_arg_iterator iter;
copy_body_data id;
tree param, arg, t;
+ hash_map<tree, tree> decl_map;
/* Remap the parameters. */
for (param = DECL_ARGUMENTS (fn), arg = first_call_expr_arg (exp, &iter);
param;
param = DECL_CHAIN (param), arg = next_call_expr_arg (&iter))
- *pointer_map_insert (decl_map, param) = arg;
+ decl_map.put (param, arg);
memset (&id, 0, sizeof (id));
id.src_fn = fn;
id.dst_fn = current_function_decl;
id.src_cfun = DECL_STRUCT_FUNCTION (fn);
- id.decl_map = decl_map;
+ id.decl_map = &decl_map;
id.copy_decl = copy_decl_no_change;
id.transform_call_graph_edges = CB_CGE_DUPLICATE;
@@ -5620,7 +5615,6 @@ maybe_inline_call_in_expr (tree exp)
id.eh_lp_nr = 0;
t = copy_tree_body (&id);
- pointer_map_destroy (decl_map);
/* We can only return something suitable for use in a GENERIC
expression tree. */
@@ -5642,15 +5636,15 @@ build_duplicate_type (tree type)
id.src_fn = current_function_decl;
id.dst_fn = current_function_decl;
id.src_cfun = cfun;
- id.decl_map = pointer_map_create ();
+ id.decl_map = new hash_map<tree, tree>;
id.debug_map = NULL;
id.copy_decl = copy_decl_no_change;
type = remap_type_1 (type, &id);
- pointer_map_destroy (id.decl_map);
+ delete id.decl_map;
if (id.debug_map)
- pointer_map_destroy (id.debug_map);
+ delete id.debug_map;
TYPE_CANONICAL (type) = type;
diff --git a/gcc/tree-inline.h b/gcc/tree-inline.h
index c13e6c7..53059da 100644
--- a/gcc/tree-inline.h
+++ b/gcc/tree-inline.h
@@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_TREE_INLINE_H
#define GCC_TREE_INLINE_H
+#include "hash-map.h"
#include "hash-set.h"
struct cgraph_edge;
@@ -64,7 +65,7 @@ struct copy_body_data
/* The map from local declarations in the inlined function to
equivalents in the function into which it is being inlined. */
- struct pointer_map_t *decl_map;
+ hash_map<tree, tree> *decl_map;
/* Create a new decl to replace DECL in the destination function. */
tree (*copy_decl) (tree, struct copy_body_data *);
@@ -81,7 +82,7 @@ struct copy_body_data
/* Maps region and landing pad structures from the function being copied
to duplicates created within the function we inline into. */
- struct pointer_map_t *eh_map;
+ hash_map<void *, void *> *eh_map;
/* We use the same mechanism do all sorts of different things. Rather
than enumerating the different cases, we categorize the behavior
@@ -132,7 +133,7 @@ struct copy_body_data
equivalents in the function into which it is being inlined, where
the originals have been mapped to a value rather than to a
variable. */
- struct pointer_map_t *debug_map;
+ hash_map<tree, tree> *debug_map;
/* Cilk keywords currently need to replace some variables that
ordinary nested functions do not. */
diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c
index 45c5cf7..7d5c039 100644
--- a/gcc/tree-nested.c
+++ b/gcc/tree-nested.c
@@ -93,8 +93,8 @@ struct nesting_info
struct nesting_info *inner;
struct nesting_info *next;
- struct pointer_map_t *field_map;
- struct pointer_map_t *var_map;
+ hash_map<tree, tree> *field_map;
+ hash_map<tree, tree> *var_map;
hash_set<tree *> *mem_refs;
bitmap suppress_expansion;
@@ -286,15 +286,13 @@ static tree
lookup_field_for_decl (struct nesting_info *info, tree decl,
enum insert_option insert)
{
- void **slot;
-
if (insert == NO_INSERT)
{
- slot = pointer_map_contains (info->field_map, decl);
- return slot ? (tree) *slot : NULL_TREE;
+ tree *slot = info->field_map->get (decl);
+ return slot ? *slot : NULL_TREE;
}
- slot = pointer_map_insert (info->field_map, decl);
+ tree *slot = &info->field_map->get_or_insert (decl);
if (!*slot)
{
tree field = make_node (FIELD_DECL);
@@ -324,7 +322,7 @@ lookup_field_for_decl (struct nesting_info *info, tree decl,
info->any_parm_remapped = true;
}
- return (tree) *slot;
+ return *slot;
}
/* Build or return the variable that holds the static chain within
@@ -521,15 +519,13 @@ static tree
lookup_tramp_for_decl (struct nesting_info *info, tree decl,
enum insert_option insert)
{
- void **slot;
-
if (insert == NO_INSERT)
{
- slot = pointer_map_contains (info->var_map, decl);
- return slot ? (tree) *slot : NULL_TREE;
+ tree *slot = info->var_map->get (decl);
+ return slot ? *slot : NULL_TREE;
}
- slot = pointer_map_insert (info->var_map, decl);
+ tree *slot = &info->var_map->get_or_insert (decl);
if (!*slot)
{
tree field = make_node (FIELD_DECL);
@@ -543,7 +539,7 @@ lookup_tramp_for_decl (struct nesting_info *info, tree decl,
info->any_tramp_created = true;
}
- return (tree) *slot;
+ return *slot;
}
/* Build or return the field within the non-local frame state that holds
@@ -730,8 +726,8 @@ static struct nesting_info *
create_nesting_tree (struct cgraph_node *cgn)
{
struct nesting_info *info = XCNEW (struct nesting_info);
- info->field_map = pointer_map_create ();
- info->var_map = pointer_map_create ();
+ info->field_map = new hash_map<tree, tree>;
+ info->var_map = new hash_map<tree, tree>;
info->mem_refs = new hash_set<tree *>;
info->suppress_expansion = BITMAP_ALLOC (&nesting_info_bitmap_obstack);
info->context = cgn->decl;
@@ -834,12 +830,11 @@ get_nonlocal_debug_decl (struct nesting_info *info, tree decl)
tree target_context;
struct nesting_info *i;
tree x, field, new_decl;
- void **slot;
- slot = pointer_map_insert (info->var_map, decl);
+ tree *slot = &info->var_map->get_or_insert (decl);
if (*slot)
- return (tree) *slot;
+ return *slot;
target_context = decl_function_context (decl);
@@ -1483,11 +1478,10 @@ static tree
get_local_debug_decl (struct nesting_info *info, tree decl, tree field)
{
tree x, new_decl;
- void **slot;
- slot = pointer_map_insert (info->var_map, decl);
+ tree *slot = &info->var_map->get_or_insert (decl);
if (*slot)
- return (tree) *slot;
+ return *slot;
/* Make sure frame_decl gets created. */
(void) get_frame_type (info);
@@ -2064,7 +2058,6 @@ convert_nl_goto_reference (gimple_stmt_iterator *gsi, bool *handled_ops_p,
{
struct nesting_info *const info = (struct nesting_info *) wi->info, *i;
tree label, new_label, target_context, x, field;
- void **slot;
gimple call;
gimple stmt = gsi_stmt (*gsi);
@@ -2098,7 +2091,7 @@ convert_nl_goto_reference (gimple_stmt_iterator *gsi, bool *handled_ops_p,
(hairy target-specific) non-local goto receiver code to be generated
when we expand rtl. Enter this association into var_map so that we
can insert the new label into the IL during a second pass. */
- slot = pointer_map_insert (i->var_map, label);
+ tree *slot = &i->var_map->get_or_insert (label);
if (*slot == NULL)
{
new_label = create_artificial_label (UNKNOWN_LOCATION);
@@ -2106,7 +2099,7 @@ convert_nl_goto_reference (gimple_stmt_iterator *gsi, bool *handled_ops_p,
*slot = new_label;
}
else
- new_label = (tree) *slot;
+ new_label = *slot;
/* Build: __builtin_nl_goto(new_label, &chain->nl_goto_field). */
field = get_nl_goto_field (i);
@@ -2136,7 +2129,6 @@ convert_nl_goto_receiver (gimple_stmt_iterator *gsi, bool *handled_ops_p,
struct nesting_info *const info = (struct nesting_info *) wi->info;
tree label, new_label;
gimple_stmt_iterator tmp_gsi;
- void **slot;
gimple stmt = gsi_stmt (*gsi);
if (gimple_code (stmt) != GIMPLE_LABEL)
@@ -2147,7 +2139,7 @@ convert_nl_goto_receiver (gimple_stmt_iterator *gsi, bool *handled_ops_p,
label = gimple_label_label (stmt);
- slot = pointer_map_contains (info->var_map, label);
+ tree *slot = info->var_map->get (label);
if (!slot)
{
*handled_ops_p = false;
@@ -2513,7 +2505,7 @@ static tree
nesting_copy_decl (tree decl, copy_body_data *id)
{
struct nesting_copy_body_data *nid = (struct nesting_copy_body_data *) id;
- void **slot = pointer_map_contains (nid->root->var_map, decl);
+ tree *slot = nid->root->var_map->get (decl);
if (slot)
return (tree) *slot;
@@ -2542,15 +2534,14 @@ contains_remapped_vars (tree *tp, int *walk_subtrees, void *data)
{
struct nesting_info *root = (struct nesting_info *) data;
tree t = *tp;
- void **slot;
if (DECL_P (t))
{
*walk_subtrees = 0;
- slot = pointer_map_contains (root->var_map, t);
+ tree *slot = root->var_map->get (t);
if (slot)
- return (tree) *slot;
+ return *slot;
}
return NULL;
}
@@ -2580,7 +2571,7 @@ remap_vla_decls (tree block, struct nesting_info *root)
&& variably_modified_type_p (type, NULL)))
continue;
- if (pointer_map_contains (root->var_map, TREE_OPERAND (val, 0))
+ if (root->var_map->get (TREE_OPERAND (val, 0))
|| walk_tree (&type, contains_remapped_vars, root, NULL))
break;
}
@@ -2590,7 +2581,7 @@ remap_vla_decls (tree block, struct nesting_info *root)
memset (&id, 0, sizeof (id));
id.cb.copy_decl = nesting_copy_decl;
- id.cb.decl_map = pointer_map_create ();
+ id.cb.decl_map = new hash_map<tree, tree>;
id.root = root;
for (; var; var = DECL_CHAIN (var))
@@ -2598,7 +2589,6 @@ remap_vla_decls (tree block, struct nesting_info *root)
{
struct nesting_info *i;
tree newt, context;
- void **slot;
val = DECL_VALUE_EXPR (var);
type = TREE_TYPE (var);
@@ -2608,7 +2598,7 @@ remap_vla_decls (tree block, struct nesting_info *root)
&& variably_modified_type_p (type, NULL)))
continue;
- slot = pointer_map_contains (root->var_map, TREE_OPERAND (val, 0));
+ tree *slot = root->var_map->get (TREE_OPERAND (val, 0));
if (!slot && !walk_tree (&type, contains_remapped_vars, root, NULL))
continue;
@@ -2651,7 +2641,7 @@ remap_vla_decls (tree block, struct nesting_info *root)
SET_DECL_VALUE_EXPR (var, val);
}
- pointer_map_destroy (id.cb.decl_map);
+ delete id.cb.decl_map;
}
/* Fold the MEM_REF *E. */
@@ -2830,7 +2820,7 @@ finalize_nesting_tree_1 (struct nesting_info *root)
memset (&id, 0, sizeof (id));
id.cb.copy_decl = nesting_copy_decl;
- id.cb.decl_map = pointer_map_create ();
+ id.cb.decl_map = new hash_map<tree, tree>;
id.root = root;
for (; debug_var; debug_var = DECL_CHAIN (debug_var))
@@ -2865,7 +2855,7 @@ finalize_nesting_tree_1 (struct nesting_info *root)
TYPE_NAME (newt) = remap_decl (TYPE_NAME (newt), &id.cb);
}
- pointer_map_destroy (id.cb.decl_map);
+ delete id.cb.decl_map;
}
scope = gimple_seq_first_stmt (gimple_body (root->context));
@@ -2931,8 +2921,8 @@ free_nesting_tree (struct nesting_info *root)
do
{
next = iter_nestinfo_next (node);
- pointer_map_destroy (node->var_map);
- pointer_map_destroy (node->field_map);
+ delete node->var_map;
+ delete node->field_map;
delete node->mem_refs;
free (node);
node = next;
diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
index f9d39ac..2231314 100644
--- a/gcc/tree-sra.c
+++ b/gcc/tree-sra.c
@@ -74,11 +74,11 @@ along with GCC; see the file COPYING3. If not see
#include "config.h"
#include "system.h"
#include "coretypes.h"
+#include "hash-map.h"
#include "hash-table.h"
#include "alloc-pool.h"
#include "tm.h"
#include "tree.h"
-#include "pointer-set.h"
#include "basic-block.h"
#include "tree-ssa-alias.h"
#include "internal-fn.h"
@@ -290,7 +290,7 @@ struct assign_link
static alloc_pool link_pool;
/* Base (tree) -> Vector (vec<access_p> *) map. */
-static struct pointer_map_t *base_access_vec;
+static hash_map<tree, auto_vec<access_p> > *base_access_vec;
/* Candidate hash table helpers. */
@@ -518,13 +518,7 @@ access_has_replacements_p (struct access *acc)
static vec<access_p> *
get_base_access_vector (tree base)
{
- void **slot;
-
- slot = pointer_map_contains (base_access_vec, base);
- if (!slot)
- return NULL;
- else
- return *(vec<access_p> **) slot;
+ return base_access_vec->get (base);
}
/* Find an access with required OFFSET and SIZE in a subtree of accesses rooted
@@ -667,24 +661,13 @@ sra_initialize (void)
gcc_obstack_init (&name_obstack);
access_pool = create_alloc_pool ("SRA accesses", sizeof (struct access), 16);
link_pool = create_alloc_pool ("SRA links", sizeof (struct assign_link), 16);
- base_access_vec = pointer_map_create ();
+ base_access_vec = new hash_map<tree, auto_vec<access_p> >;
memset (&sra_stats, 0, sizeof (sra_stats));
encountered_apply_args = false;
encountered_recursive_call = false;
encountered_unchangable_recursive_call = false;
}
-/* Hook fed to pointer_map_traverse, deallocate stored vectors. */
-
-static bool
-delete_base_accesses (const void *key ATTRIBUTE_UNUSED, void **value,
- void *data ATTRIBUTE_UNUSED)
-{
- vec<access_p> *access_vec = (vec<access_p> *) *value;
- vec_free (access_vec);
- return true;
-}
-
/* Deallocate all general structures. */
static void
@@ -699,8 +682,7 @@ sra_deinitialize (void)
free_alloc_pool (link_pool);
obstack_free (&name_obstack, NULL);
- pointer_map_traverse (base_access_vec, delete_base_accesses, NULL);
- pointer_map_destroy (base_access_vec);
+ delete base_access_vec;
}
/* Remove DECL from candidates for SRA and write REASON to the dump file if
@@ -849,9 +831,7 @@ mark_parm_dereference (tree base, HOST_WIDE_INT dist, gimple stmt)
static struct access *
create_access_1 (tree base, HOST_WIDE_INT offset, HOST_WIDE_INT size)
{
- vec<access_p> *v;
struct access *access;
- void **slot;
access = (struct access *) pool_alloc (access_pool);
memset (access, 0, sizeof (struct access));
@@ -859,16 +839,7 @@ create_access_1 (tree base, HOST_WIDE_INT offset, HOST_WIDE_INT size)
access->offset = offset;
access->size = size;
- slot = pointer_map_contains (base_access_vec, base);
- if (slot)
- v = (vec<access_p> *) *slot;
- else
- vec_alloc (v, 32);
-
- v->safe_push (access);
-
- *((vec<access_p> **)
- pointer_map_insert (base_access_vec, base)) = v;
+ base_access_vec->get_or_insert (base).safe_push (access);
return access;
}
diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
index c614978..0cbb3ae 100644
--- a/gcc/tree-ssa-loop-im.c
+++ b/gcc/tree-ssa-loop-im.c
@@ -26,6 +26,7 @@ along with GCC; see the file COPYING3. If not see
#include "basic-block.h"
#include "gimple-pretty-print.h"
#include "pointer-set.h"
+#include "hash-map.h"
#include "hash-table.h"
#include "tree-ssa-alias.h"
#include "internal-fn.h"
@@ -103,7 +104,7 @@ struct lim_aux_data
/* Maps statements to their lim_aux_data. */
-static struct pointer_map_t *lim_aux_data_map;
+static hash_map<gimple, lim_aux_data *> *lim_aux_data_map;
/* Description of a memory reference location. */
@@ -225,20 +226,20 @@ static bool ref_indep_loop_p (struct loop *, mem_ref_p);
static struct lim_aux_data *
init_lim_data (gimple stmt)
{
- void **p = pointer_map_insert (lim_aux_data_map, stmt);
+ lim_aux_data *p = XCNEW (struct lim_aux_data);
+ lim_aux_data_map->put (stmt, p);
- *p = XCNEW (struct lim_aux_data);
- return (struct lim_aux_data *) *p;
+ return p;
}
static struct lim_aux_data *
get_lim_data (gimple stmt)
{
- void **p = pointer_map_contains (lim_aux_data_map, stmt);
+ lim_aux_data **p = lim_aux_data_map->get (stmt);
if (!p)
return NULL;
- return (struct lim_aux_data *) *p;
+ return *p;
}
/* Releases the memory occupied by DATA. */
@@ -253,11 +254,11 @@ free_lim_aux_data (struct lim_aux_data *data)
static void
clear_lim_data (gimple stmt)
{
- void **p = pointer_map_contains (lim_aux_data_map, stmt);
+ lim_aux_data **p = lim_aux_data_map->get (stmt);
if (!p)
return;
- free_lim_aux_data ((struct lim_aux_data *) *p);
+ free_lim_aux_data (*p);
*p = NULL;
}
@@ -2429,7 +2430,7 @@ tree_ssa_lim_initialize (void)
bitmap_obstack_initialize (&lim_bitmap_obstack);
gcc_obstack_init (&mem_ref_obstack);
- lim_aux_data_map = pointer_map_create ();
+ lim_aux_data_map = new hash_map<gimple, lim_aux_data *>;
if (flag_tm)
compute_transaction_bits ();
@@ -2484,7 +2485,7 @@ tree_ssa_lim_finalize (void)
SET_ALWAYS_EXECUTED_IN (bb, NULL);
bitmap_obstack_release (&lim_bitmap_obstack);
- pointer_map_destroy (lim_aux_data_map);
+ delete lim_aux_data_map;
delete memory_accesses.refs;
memory_accesses.refs = NULL;
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
index 3b4a6cd..158a081 100644
--- a/gcc/tree-ssa-loop-ivopts.c
+++ b/gcc/tree-ssa-loop-ivopts.c
@@ -70,7 +70,7 @@ along with GCC; see the file COPYING3. If not see
#include "tm_p.h"
#include "basic-block.h"
#include "gimple-pretty-print.h"
-#include "pointer-set.h"
+#include "hash-map.h"
#include "hash-table.h"
#include "tree-ssa-alias.h"
#include "internal-fn.h"
@@ -293,7 +293,7 @@ struct ivopts_data
struct loop *current_loop;
/* Numbers of iterations for all exits of the current loop. */
- struct pointer_map_t *niters;
+ hash_map<edge, tree_niter_desc *> *niters;
/* Number of registers used in it. */
unsigned regs_used;
@@ -814,15 +814,15 @@ static struct tree_niter_desc *
niter_for_exit (struct ivopts_data *data, edge exit)
{
struct tree_niter_desc *desc;
- void **slot;
+ tree_niter_desc **slot;
if (!data->niters)
{
- data->niters = pointer_map_create ();
+ data->niters = new hash_map<edge, tree_niter_desc *>;
slot = NULL;
}
else
- slot = pointer_map_contains (data->niters, exit);
+ slot = data->niters->get (exit);
if (!slot)
{
@@ -837,11 +837,10 @@ niter_for_exit (struct ivopts_data *data, edge exit)
XDELETE (desc);
desc = NULL;
}
- slot = pointer_map_insert (data->niters, exit);
- *slot = desc;
+ data->niters->put (exit, desc);
}
else
- desc = (struct tree_niter_desc *) *slot;
+ desc = *slot;
return desc;
}
@@ -6704,15 +6703,12 @@ remove_unused_ivs (struct ivopts_data *data)
}
/* Frees memory occupied by struct tree_niter_desc in *VALUE. Callback
- for pointer_map_traverse. */
+ for hash_map::traverse. */
-static bool
-free_tree_niter_desc (const void *key ATTRIBUTE_UNUSED, void **value,
- void *data ATTRIBUTE_UNUSED)
+bool
+free_tree_niter_desc (edge const &, tree_niter_desc *const &value, void *)
{
- struct tree_niter_desc *const niter = (struct tree_niter_desc *) *value;
-
- free (niter);
+ free (value);
return true;
}
@@ -6727,8 +6723,8 @@ free_loop_data (struct ivopts_data *data)
if (data->niters)
{
- pointer_map_traverse (data->niters, free_tree_niter_desc, NULL);
- pointer_map_destroy (data->niters);
+ data->niters->traverse<void *, free_tree_niter_desc> (NULL);
+ delete data->niters;
data->niters = NULL;
}
diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
index f9bd9a4..2e8337c 100644
--- a/gcc/tree-ssa-reassoc.c
+++ b/gcc/tree-ssa-reassoc.c
@@ -30,7 +30,7 @@ along with GCC; see the file COPYING3. If not see
#include "basic-block.h"
#include "gimple-pretty-print.h"
#include "tree-inline.h"
-#include "pointer-set.h"
+#include "hash-map.h"
#include "tree-ssa-alias.h"
#include "internal-fn.h"
#include "gimple-fold.h"
@@ -216,7 +216,7 @@ static int next_operand_entry_id;
static long *bb_rank;
/* Operand->rank hashtable. */
-static struct pointer_map_t *operand_rank;
+static hash_map<tree, long> *operand_rank;
/* Forward decls. */
static long get_rank (tree);
@@ -362,8 +362,8 @@ propagate_rank (long rank, tree op)
static inline long
find_operand_rank (tree e)
{
- void **slot = pointer_map_contains (operand_rank, e);
- return slot ? (long) (intptr_t) *slot : -1;
+ long *slot = operand_rank->get (e);
+ return slot ? *slot : -1;
}
/* Insert {E,RANK} into the operand rank hashtable. */
@@ -371,11 +371,8 @@ find_operand_rank (tree e)
static inline void
insert_operand_rank (tree e, long rank)
{
- void **slot;
gcc_assert (rank > 0);
- slot = pointer_map_insert (operand_rank, e);
- gcc_assert (!*slot);
- *slot = (void *) (intptr_t) rank;
+ gcc_assert (!operand_rank->put (e, rank));
}
/* Given an expression E, return the rank of the expression. */
@@ -4635,7 +4632,7 @@ init_reassoc (void)
deeper loops come later. */
pre_and_rev_post_order_compute (NULL, bbs, false);
bb_rank = XCNEWVEC (long, last_basic_block_for_fn (cfun));
- operand_rank = pointer_map_create ();
+ operand_rank = new hash_map<tree, long>;
/* Give each default definition a distinct rank. This includes
parameters and the static chain. Walk backwards over all
@@ -4676,7 +4673,7 @@ fini_reassoc (void)
statistics_counter_event (cfun, "Built-in powi calls created",
reassociate_stats.pows_created);
- pointer_map_destroy (operand_rank);
+ delete operand_rank;
free_alloc_pool (operand_entry_pool);
free (bb_rank);
plus_negates.release ();
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index 1879fc0..08e384b 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -319,7 +319,7 @@ static inline bool type_can_have_subvars (const_tree);
static alloc_pool variable_info_pool;
/* Map varinfo to final pt_solution. */
-static pointer_map_t *final_solutions;
+static hash_map<varinfo_t, pt_solution *> *final_solutions;
struct obstack final_solutions_obstack;
/* Table of variable info structures for constraint variables.
@@ -393,19 +393,19 @@ new_var_info (tree t, const char *name)
/* A map mapping call statements to per-stmt variables for uses
and clobbers specific to the call. */
-static struct pointer_map_t *call_stmt_vars;
+static hash_map<gimple, varinfo_t> *call_stmt_vars;
/* Lookup or create the variable for the call statement CALL. */
static varinfo_t
get_call_vi (gimple call)
{
- void **slot_p;
varinfo_t vi, vi2;
- slot_p = pointer_map_insert (call_stmt_vars, call);
- if (*slot_p)
- return (varinfo_t) *slot_p;
+ bool existed;
+ varinfo_t *slot_p = &call_stmt_vars->get_or_insert (call, &existed);
+ if (existed)
+ return *slot_p;
vi = new_var_info (NULL_TREE, "CALLUSED");
vi->offset = 0;
@@ -421,7 +421,7 @@ get_call_vi (gimple call)
vi->next = vi2->id;
- *slot_p = (void *) vi;
+ *slot_p = vi;
return vi;
}
@@ -431,11 +431,9 @@ get_call_vi (gimple call)
static varinfo_t
lookup_call_use_vi (gimple call)
{
- void **slot_p;
-
- slot_p = pointer_map_contains (call_stmt_vars, call);
+ varinfo_t *slot_p = call_stmt_vars->get (call);
if (slot_p)
- return (varinfo_t) *slot_p;
+ return *slot_p;
return NULL;
}
@@ -2794,7 +2792,7 @@ solve_graph (constraint_graph_t graph)
}
/* Map from trees to variable infos. */
-static struct pointer_map_t *vi_for_tree;
+static hash_map<tree, varinfo_t> *vi_for_tree;
/* Insert ID as the variable id for tree T in the vi_for_tree map. */
@@ -2802,10 +2800,8 @@ static struct pointer_map_t *vi_for_tree;
static void
insert_vi_for_tree (tree t, varinfo_t vi)
{
- void **slot = pointer_map_insert (vi_for_tree, t);
gcc_assert (vi);
- gcc_assert (*slot == NULL);
- *slot = vi;
+ gcc_assert (!vi_for_tree->put (t, vi));
}
/* Find the variable info for tree T in VI_FOR_TREE. If T does not
@@ -2814,11 +2810,11 @@ insert_vi_for_tree (tree t, varinfo_t vi)
static varinfo_t
lookup_vi_for_tree (tree t)
{
- void **slot = pointer_map_contains (vi_for_tree, t);
+ varinfo_t *slot = vi_for_tree->get (t);
if (slot == NULL)
return NULL;
- return (varinfo_t) *slot;
+ return *slot;
}
/* Return a printable name for DECL */
@@ -2876,11 +2872,11 @@ alias_get_name (tree decl)
static varinfo_t
get_vi_for_tree (tree t)
{
- void **slot = pointer_map_contains (vi_for_tree, t);
+ varinfo_t *slot = vi_for_tree->get (t);
if (slot == NULL)
return get_varinfo (create_variable_info_for (t, alias_get_name (t)));
- return (varinfo_t) *slot;
+ return *slot;
}
/* Get a scalar constraint expression for a new temporary variable. */
@@ -6075,7 +6071,6 @@ find_what_var_points_to (varinfo_t orig_vi)
bitmap finished_solution;
bitmap result;
varinfo_t vi;
- void **slot;
struct pt_solution *pt;
/* This variable may have been collapsed, let's get the real
@@ -6083,9 +6078,9 @@ find_what_var_points_to (varinfo_t orig_vi)
vi = get_varinfo (find (orig_vi->id));
/* See if we have already computed the solution and return it. */
- slot = pointer_map_insert (final_solutions, vi);
+ pt_solution **slot = &final_solutions->get_or_insert (vi);
if (*slot != NULL)
- return *(struct pt_solution *)*slot;
+ return **slot;
*slot = pt = XOBNEW (&final_solutions_obstack, struct pt_solution);
memset (pt, 0, sizeof (struct pt_solution));
@@ -6685,8 +6680,8 @@ init_alias_vars (void)
sizeof (struct variable_info), 30);
constraints.create (8);
varmap.create (8);
- vi_for_tree = pointer_map_create ();
- call_stmt_vars = pointer_map_create ();
+ vi_for_tree = new hash_map<tree, varinfo_t>;
+ call_stmt_vars = new hash_map<gimple, varinfo_t>;
memset (&stats, 0, sizeof (stats));
shared_bitmap_table = new hash_table<shared_bitmap_hasher> (511);
@@ -6694,7 +6689,7 @@ init_alias_vars (void)
gcc_obstack_init (&fake_var_decl_obstack);
- final_solutions = pointer_map_create ();
+ final_solutions = new hash_map<varinfo_t, pt_solution *>;
gcc_obstack_init (&final_solutions_obstack);
}
@@ -6943,8 +6938,8 @@ delete_points_to_sets (void)
fprintf (dump_file, "Points to sets created:%d\n",
stats.points_to_sets_created);
- pointer_map_destroy (vi_for_tree);
- pointer_map_destroy (call_stmt_vars);
+ delete vi_for_tree;
+ delete call_stmt_vars;
bitmap_obstack_release (&pta_obstack);
constraints.release ();
@@ -6965,7 +6960,7 @@ delete_points_to_sets (void)
obstack_free (&fake_var_decl_obstack, NULL);
- pointer_map_destroy (final_solutions);
+ delete final_solutions;
obstack_free (&final_solutions_obstack, NULL);
}
diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
index 73a4d1c..217b9fc 100644
--- a/gcc/tree-ssa.c
+++ b/gcc/tree-ssa.c
@@ -49,6 +49,7 @@ along with GCC; see the file COPYING3. If not see
#include "tree-into-ssa.h"
#include "tree-ssa.h"
#include "tree-inline.h"
+#include "hash-map.h"
#include "hashtab.h"
#include "tree-pass.h"
#include "diagnostic-core.h"
@@ -56,7 +57,7 @@ along with GCC; see the file COPYING3. If not see
#include "cfgexpand.h"
/* Pointer map of variable mappings, keyed by edge. */
-static struct pointer_map_t *edge_var_maps;
+static hash_map<edge, auto_vec<edge_var_map> > *edge_var_maps;
/* Add a mapping with PHI RESULT and PHI DEF associated with edge E. */
@@ -64,23 +65,17 @@ static struct pointer_map_t *edge_var_maps;
void
redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus)
{
- void **slot;
- edge_var_map_vector *head;
edge_var_map new_node;
if (edge_var_maps == NULL)
- edge_var_maps = pointer_map_create ();
+ edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >;
- slot = pointer_map_insert (edge_var_maps, e);
- head = (edge_var_map_vector *) *slot;
- if (!head)
- vec_safe_reserve (head, 5);
+ auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e);
new_node.def = def;
new_node.result = result;
new_node.locus = locus;
- vec_safe_push (head, new_node);
- *slot = head;
+ slot.safe_push (new_node);
}
@@ -89,82 +84,51 @@ redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus)
void
redirect_edge_var_map_clear (edge e)
{
- void **slot;
- edge_var_map_vector *head;
-
if (!edge_var_maps)
return;
- slot = pointer_map_contains (edge_var_maps, e);
+ auto_vec<edge_var_map> *head = edge_var_maps->get (e);
- if (slot)
- {
- head = (edge_var_map_vector *) *slot;
- vec_free (head);
- *slot = NULL;
- }
+ if (head)
+ head->release ();
}
/* Duplicate the redirected var mappings in OLDE in NEWE.
- Since we can't remove a mapping, let's just duplicate it. This assumes a
- pointer_map can have multiple edges mapping to the same var_map (many to
- one mapping), since we don't remove the previous mappings. */
+ This assumes a hash_map can have multiple edges mapping to the same
+ var_map (many to one mapping), since we don't remove the previous mappings.
+ */
void
redirect_edge_var_map_dup (edge newe, edge olde)
{
- void **new_slot, **old_slot;
- edge_var_map_vector *head;
-
if (!edge_var_maps)
return;
- new_slot = pointer_map_insert (edge_var_maps, newe);
- old_slot = pointer_map_contains (edge_var_maps, olde);
- if (!old_slot)
+ auto_vec<edge_var_map> *head = edge_var_maps->get (olde);
+ if (!head)
return;
- head = (edge_var_map_vector *) *old_slot;
- edge_var_map_vector *new_head = NULL;
- if (head)
- new_head = vec_safe_copy (head);
- else
- vec_safe_reserve (new_head, 5);
- *new_slot = new_head;
+ edge_var_maps->get_or_insert (newe).safe_splice (*head);
}
/* Return the variable mappings for a given edge. If there is none, return
NULL. */
-edge_var_map_vector *
+vec<edge_var_map> *
redirect_edge_var_map_vector (edge e)
{
- void **slot;
-
/* Hey, what kind of idiot would... you'd be surprised. */
if (!edge_var_maps)
return NULL;
- slot = pointer_map_contains (edge_var_maps, e);
+ auto_vec<edge_var_map> *slot = edge_var_maps->get (e);
if (!slot)
return NULL;
- return (edge_var_map_vector *) *slot;
-}
-
-/* Used by redirect_edge_var_map_destroy to free all memory. */
-
-static bool
-free_var_map_entry (const void *key ATTRIBUTE_UNUSED,
- void **value,
- void *data ATTRIBUTE_UNUSED)
-{
- edge_var_map_vector *head = (edge_var_map_vector *) *value;
- vec_free (head);
- return true;
+ return slot;
}
/* Clear the edge variable mappings. */
@@ -172,12 +136,8 @@ free_var_map_entry (const void *key ATTRIBUTE_UNUSED,
void
redirect_edge_var_map_destroy (void)
{
- if (edge_var_maps)
- {
- pointer_map_traverse (edge_var_maps, free_var_map_entry, NULL);
- pointer_map_destroy (edge_var_maps);
- edge_var_maps = NULL;
- }
+ delete edge_var_maps;
+ edge_var_maps = NULL;
}
@@ -223,12 +183,11 @@ void
flush_pending_stmts (edge e)
{
gimple phi;
- edge_var_map_vector *v;
edge_var_map *vm;
int i;
gimple_stmt_iterator gsi;
- v = redirect_edge_var_map_vector (e);
+ vec<edge_var_map> *v = redirect_edge_var_map_vector (e);
if (!v)
return;
diff --git a/gcc/tree-ssa.h b/gcc/tree-ssa.h
index c866206..835686c 100644
--- a/gcc/tree-ssa.h
+++ b/gcc/tree-ssa.h
@@ -35,7 +35,7 @@ typedef vec<edge_var_map, va_heap, vl_embed> edge_var_map_vector;
extern void redirect_edge_var_map_add (edge, tree, tree, source_location);
extern void redirect_edge_var_map_clear (edge);
extern void redirect_edge_var_map_dup (edge, edge);
-extern edge_var_map_vector *redirect_edge_var_map_vector (edge);
+extern vec<edge_var_map> *redirect_edge_var_map_vector (edge);
extern void redirect_edge_var_map_destroy (void);
extern edge ssa_redirect_edge (edge, basic_block);
extern void flush_pending_stmts (edge);
diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
index 00810b9..3b72fce 100644
--- a/gcc/var-tracking.c
+++ b/gcc/var-tracking.c
@@ -94,6 +94,7 @@
#include "varasm.h"
#include "stor-layout.h"
#include "pointer-set.h"
+#include "hash-map.h"
#include "hash-table.h"
#include "basic-block.h"
#include "tm_p.h"
@@ -2019,12 +2020,12 @@ vt_get_canonicalize_base (rtx loc)
/* This caches canonicalized addresses for VALUEs, computed using
information in the global cselib table. */
-static struct pointer_map_t *global_get_addr_cache;
+static hash_map<rtx, rtx> *global_get_addr_cache;
/* This caches canonicalized addresses for VALUEs, computed using
information from the global cache and information pertaining to a
basic block being analyzed. */
-static struct pointer_map_t *local_get_addr_cache;
+static hash_map<rtx, rtx> *local_get_addr_cache;
static rtx vt_canonicalize_addr (dataflow_set *, rtx);
@@ -2036,13 +2037,13 @@ static rtx
get_addr_from_global_cache (rtx const loc)
{
rtx x;
- void **slot;
gcc_checking_assert (GET_CODE (loc) == VALUE);
- slot = pointer_map_insert (global_get_addr_cache, loc);
- if (*slot)
- return (rtx)*slot;
+ bool existed;
+ rtx *slot = &global_get_addr_cache->get_or_insert (loc, &existed);
+ if (existed)
+ return *slot;
x = canon_rtx (get_addr (loc));
@@ -2056,8 +2057,7 @@ get_addr_from_global_cache (rtx const loc)
{
/* The table may have moved during recursion, recompute
SLOT. */
- slot = pointer_map_contains (global_get_addr_cache, loc);
- *slot = x = nx;
+ *global_get_addr_cache->get (loc) = x = nx;
}
}
@@ -2072,16 +2072,16 @@ static rtx
get_addr_from_local_cache (dataflow_set *set, rtx const loc)
{
rtx x;
- void **slot;
decl_or_value dv;
variable var;
location_chain l;
gcc_checking_assert (GET_CODE (loc) == VALUE);
- slot = pointer_map_insert (local_get_addr_cache, loc);
- if (*slot)
- return (rtx)*slot;
+ bool existed;
+ rtx *slot = &local_get_addr_cache->get_or_insert (loc, &existed);
+ if (existed)
+ return *slot;
x = get_addr_from_global_cache (loc);
@@ -2095,7 +2095,7 @@ get_addr_from_local_cache (dataflow_set *set, rtx const loc)
rtx nx = vt_canonicalize_addr (set, x);
if (nx != x)
{
- slot = pointer_map_contains (local_get_addr_cache, loc);
+ slot = local_get_addr_cache->get (loc);
*slot = x = nx;
}
return x;
@@ -2116,7 +2116,7 @@ get_addr_from_local_cache (dataflow_set *set, rtx const loc)
rtx nx = vt_canonicalize_addr (set, l->loc);
if (x != nx)
{
- slot = pointer_map_contains (local_get_addr_cache, loc);
+ slot = local_get_addr_cache->get (loc);
*slot = x = nx;
}
break;
@@ -2503,11 +2503,10 @@ val_store (dataflow_set *set, rtx val, rtx loc, rtx insn, bool modified)
/* Clear (canonical address) slots that reference X. */
-static bool
-local_get_addr_clear_given_value (const void *v ATTRIBUTE_UNUSED,
- void **slot, void *x)
+bool
+local_get_addr_clear_given_value (rtx const &, rtx *slot, rtx x)
{
- if (vt_get_canonicalize_base ((rtx)*slot) == x)
+ if (vt_get_canonicalize_base (*slot) == x)
*slot = NULL;
return true;
}
@@ -2530,11 +2529,10 @@ val_reset (dataflow_set *set, decl_or_value dv)
if (var->onepart == ONEPART_VALUE)
{
rtx x = dv_as_value (dv);
- void **slot;
/* Relationships in the global cache don't change, so reset the
local cache entry only. */
- slot = pointer_map_contains (local_get_addr_cache, x);
+ rtx *slot = local_get_addr_cache->get (x);
if (slot)
{
/* If the value resolved back to itself, odds are that other
@@ -2543,8 +2541,8 @@ val_reset (dataflow_set *set, decl_or_value dv)
old X but resolved to something else remain ok as long as
that something else isn't also reset. */
if (*slot == x)
- pointer_map_traverse (local_get_addr_cache,
- local_get_addr_clear_given_value, x);
+ local_get_addr_cache
+ ->traverse<rtx, local_get_addr_clear_given_value> (x);
*slot = NULL;
}
}
@@ -6660,7 +6658,7 @@ compute_bb_dataflow (basic_block bb)
dataflow_set_copy (out, in);
if (MAY_HAVE_DEBUG_INSNS)
- local_get_addr_cache = pointer_map_create ();
+ local_get_addr_cache = new hash_map<rtx, rtx>;
FOR_EACH_VEC_ELT (VTI (bb)->mos, i, mo)
{
@@ -6943,7 +6941,7 @@ compute_bb_dataflow (basic_block bb)
if (MAY_HAVE_DEBUG_INSNS)
{
- pointer_map_destroy (local_get_addr_cache);
+ delete local_get_addr_cache;
local_get_addr_cache = NULL;
dataflow_set_equiv_regs (out);
@@ -9477,13 +9475,13 @@ vt_emit_notes (void)
emit_notes_for_differences (BB_HEAD (bb), &cur, &VTI (bb)->in);
if (MAY_HAVE_DEBUG_INSNS)
- local_get_addr_cache = pointer_map_create ();
+ local_get_addr_cache = new hash_map<rtx, rtx>;
/* Emit the notes for the changes in the basic block itself. */
emit_notes_in_bb (bb, &cur);
if (MAY_HAVE_DEBUG_INSNS)
- pointer_map_destroy (local_get_addr_cache);
+ delete local_get_addr_cache;
local_get_addr_cache = NULL;
/* Free memory occupied by the in hash table, we won't need it
@@ -9916,7 +9914,7 @@ vt_initialize (void)
valvar_pool = create_alloc_pool ("small variable_def pool",
sizeof (struct variable_def), 256);
preserved_values.create (256);
- global_get_addr_cache = pointer_map_create ();
+ global_get_addr_cache = new hash_map<rtx, rtx>;
}
else
{
@@ -10263,7 +10261,7 @@ vt_finalize (void)
if (MAY_HAVE_DEBUG_INSNS)
{
if (global_get_addr_cache)
- pointer_map_destroy (global_get_addr_cache);
+ delete global_get_addr_cache;
global_get_addr_cache = NULL;
if (loc_exp_dep_pool)
free_alloc_pool (loc_exp_dep_pool);
--
2.0.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] convert many pointer_map to hash_map
2014-08-01 10:37 [PATCH] convert many pointer_map to hash_map tsaunders
@ 2014-08-01 10:52 ` Richard Biener
2014-08-02 11:36 ` Trevor Saunders
0 siblings, 1 reply; 6+ messages in thread
From: Richard Biener @ 2014-08-01 10:52 UTC (permalink / raw)
To: tsaunders; +Cc: GCC Patches
On Fri, Aug 1, 2014 at 12:34 PM, <tsaunders@mozilla.com> wrote:
> From: Trevor Saunders <tsaunders@mozilla.com>
>
> Hi,
>
> This patch replaces a bunch of usage of pointer_map with hash_map. It also
> adds an overload to hash_map::traverse that allows modifying the value, and a
> remove method.
>
> bootstrapped + regtested on x86_64-unknown-linux-gnu, ok?
Ok.
Thanks,
Richard.
> Trev
>
> c-family/
>
> * cilk.c: Use hash_map instead of pointer_map.
>
> c/
>
> * c-typeck.c: Use hash_map instead of pointer_map.
>
> cp/
>
> * optimize.c, semantics.c: Use hash_map instead of pointer_map.
>
> gcc/
>
> * hash-map.h (default_hashmap_traits::mark_key_deleted):
> Fix cast.
> (hash_map::remove): New method.
> (hash_map::traverse): New method.
> * cgraph.h, except.c, except.h, gimple-ssa-strength-reduction.c,
> ipa-utils.c, lto-cgraph.c, lto-streamer.h, omp-low.c, predict.c,
> tree-cfg.c, tree-cfgcleanup.c, tree-eh.c, tree-eh.h, tree-inline.c,
> tree-inline.h, tree-nested.c, tree-sra.c, tree-ssa-loop-im.c,
> tree-ssa-loop-ivopts.c, tree-ssa-reassoc.c, tree-ssa-structalias.c,
> tree-ssa.c, tree-ssa.h, var-tracking.c: Use hash_map instead of
> pointer_map.
> diff --git a/gcc/c-family/cilk.c b/gcc/c-family/cilk.c
> index b864bb1..e0d1141 100644
> --- a/gcc/c-family/cilk.c
> +++ b/gcc/c-family/cilk.c
> @@ -64,7 +64,7 @@ struct wrapper_data
> /* Containing function. */
> tree context;
> /* Disposition of all variables in the inner statement. */
> - struct pointer_map_t *decl_map;
> + hash_map<tree, tree> *decl_map;
> /* True if this function needs a static chain. */
> bool nested;
> /* Arguments to be passed to wrapper function, currently a list. */
> @@ -335,12 +335,11 @@ create_cilk_helper_decl (struct wrapper_data *wd)
>
> /* A function used by walk tree to find wrapper parms. */
>
> -static bool
> -wrapper_parm_cb (const void *key0, void **val0, void *data)
> +bool
> +wrapper_parm_cb (tree const &key0, tree *val0, wrapper_data *wd)
> {
> - struct wrapper_data *wd = (struct wrapper_data *) data;
> - tree arg = * (tree *)&key0;
> - tree val = (tree)*val0;
> + tree arg = key0;
> + tree val = *val0;
> tree parm;
>
> if (val == error_mark_node || val == arg)
> @@ -387,7 +386,7 @@ build_wrapper_type (struct wrapper_data *wd)
> wd->parms = NULL_TREE;
> wd->argtypes = void_list_node;
>
> - pointer_map_traverse (wd->decl_map, wrapper_parm_cb, wd);
> + wd->decl_map->traverse<wrapper_data *, wrapper_parm_cb> (wd);
> gcc_assert (wd->type != CILK_BLOCK_FOR);
>
> /* Now build a function.
> @@ -452,25 +451,22 @@ copy_decl_for_cilk (tree decl, copy_body_data *id)
>
> /* Copy all local variables. */
>
> -static bool
> -for_local_cb (const void *k_v, void **vp, void *p)
> +bool
> +for_local_cb (tree const &k, tree *vp, copy_body_data *id)
> {
> - tree k = *(tree *) &k_v;
> - tree v = (tree) *vp;
> + tree v = *vp;
>
> if (v == error_mark_node)
> - *vp = copy_decl_no_change (k, (copy_body_data *) p);
> + *vp = copy_decl_no_change (k, id);
> return true;
> }
>
> /* Copy all local declarations from a _Cilk_spawned function's body. */
>
> -static bool
> -wrapper_local_cb (const void *k_v, void **vp, void *data)
> +bool
> +wrapper_local_cb (tree const &key, tree *vp, copy_body_data *id)
> {
> - copy_body_data *id = (copy_body_data *) data;
> - tree key = *(tree *) &k_v;
> - tree val = (tree) *vp;
> + tree val = *vp;
>
> if (val == error_mark_node)
> *vp = copy_decl_for_cilk (key, id);
> @@ -514,8 +510,11 @@ cilk_outline (tree inner_fn, tree *stmt_p, void *w)
> insert_decl_map (&id, wd->block, DECL_INITIAL (inner_fn));
>
> /* We don't want the private variables any more. */
> - pointer_map_traverse (wd->decl_map, nested ? for_local_cb : wrapper_local_cb,
> - &id);
> + if (nested)
> + wd->decl_map->traverse<copy_body_data *, for_local_cb> (&id);
> + else
> + wd->decl_map->traverse<copy_body_data *, wrapper_local_cb> (&id);
> +
> walk_tree (stmt_p, copy_tree_body_r, (void *) &id, NULL);
>
> /* See if this function can throw or calls something that should
> @@ -576,7 +575,7 @@ init_wd (struct wrapper_data *wd, enum cilk_block_type type)
> wd->type = type;
> wd->fntype = NULL_TREE;
> wd->context = current_function_decl;
> - wd->decl_map = pointer_map_create ();
> + wd->decl_map = new hash_map<tree, tree>;
> /* _Cilk_for bodies are always nested. Others start off as
> normal functions. */
> wd->nested = (type == CILK_BLOCK_FOR);
> @@ -590,7 +589,7 @@ init_wd (struct wrapper_data *wd, enum cilk_block_type type)
> static void
> free_wd (struct wrapper_data *wd)
> {
> - pointer_map_destroy (wd->decl_map);
> + delete wd->decl_map;
> wd->nested = false;
> wd->arglist = NULL_TREE;
> wd->argtypes = NULL_TREE;
> @@ -618,12 +617,11 @@ free_wd (struct wrapper_data *wd)
> (var, ???) -- Pure output argument, handled similarly to above.
> */
>
> -static bool
> -declare_one_free_variable (const void *var0, void **map0,
> - void *data ATTRIBUTE_UNUSED)
> +bool
> +declare_one_free_variable (tree const &var0, tree *map0, wrapper_data &)
> {
> - const_tree var = (const_tree) var0;
> - tree map = (tree)*map0;
> + const_tree var = var0;
> + tree map = *map0;
> tree var_type = TREE_TYPE (var), arg_type;
> bool by_reference;
> tree parm;
> @@ -713,7 +711,7 @@ create_cilk_wrapper (tree exp, tree *args_out)
> }
> else
> extract_free_variables (exp, &wd, ADD_READ);
> - pointer_map_traverse (wd.decl_map, declare_one_free_variable, &wd);
> + wd.decl_map->traverse<wrapper_data &, declare_one_free_variable> (wd);
> wd.block = TREE_BLOCK (exp);
> if (!wd.block)
> wd.block = DECL_INITIAL (current_function_decl);
> @@ -884,9 +882,7 @@ cilk_install_body_pedigree_operations (tree frame_ptr)
> static void
> add_variable (struct wrapper_data *wd, tree var, enum add_variable_type how)
> {
> - void **valp;
> -
> - valp = pointer_map_contains (wd->decl_map, (void *) var);
> + tree *valp = wd->decl_map->get (var);
> if (valp)
> {
> tree val = (tree) *valp;
> @@ -907,7 +903,7 @@ add_variable (struct wrapper_data *wd, tree var, enum add_variable_type how)
> if (how != ADD_WRITE)
> return;
> /* This variable might have been entered as read but is now written. */
> - *valp = (void *) var;
> + *valp = var;
> wd->nested = true;
> return;
> }
> @@ -971,7 +967,7 @@ add_variable (struct wrapper_data *wd, tree var, enum add_variable_type how)
> break;
> }
> }
> - *pointer_map_insert (wd->decl_map, (void *) var) = val;
> + wd->decl_map->put (var, val);
> }
> }
>
> diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
> index 06fd565..bedb63e 100644
> --- a/gcc/c/c-typeck.c
> +++ b/gcc/c/c-typeck.c
> @@ -11783,15 +11783,15 @@ c_clone_omp_udr (tree stmt, tree omp_decl1, tree omp_decl2,
> tree decl, tree placeholder)
> {
> copy_body_data id;
> - struct pointer_map_t *decl_map = pointer_map_create ();
> + hash_map<tree, tree> decl_map;
>
> - *pointer_map_insert (decl_map, omp_decl1) = placeholder;
> - *pointer_map_insert (decl_map, omp_decl2) = decl;
> + decl_map.put (omp_decl1, placeholder);
> + decl_map.put (omp_decl2, decl);
> memset (&id, 0, sizeof (id));
> id.src_fn = DECL_CONTEXT (omp_decl1);
> id.dst_fn = current_function_decl;
> id.src_cfun = DECL_STRUCT_FUNCTION (id.src_fn);
> - id.decl_map = decl_map;
> + id.decl_map = &decl_map;
>
> id.copy_decl = copy_decl_no_change;
> id.transform_call_graph_edges = CB_CGE_DUPLICATE;
> @@ -11800,7 +11800,6 @@ c_clone_omp_udr (tree stmt, tree omp_decl1, tree omp_decl2,
> id.transform_lang_insert_block = NULL;
> id.eh_lp_nr = 0;
> walk_tree (&stmt, copy_tree_body_r, &id, NULL);
> - pointer_map_destroy (decl_map);
> return stmt;
> }
>
> diff --git a/gcc/cgraph.h b/gcc/cgraph.h
> index f8f76c4..0fa8635 100644
> --- a/gcc/cgraph.h
> +++ b/gcc/cgraph.h
> @@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. If not see
> #ifndef GCC_CGRAPH_H
> #define GCC_CGRAPH_H
>
> +#include "hash-map.h"
> #include "is-a.h"
> #include "plugin-api.h"
> #include "vec.h"
> @@ -1204,7 +1205,7 @@ public:
> can appear in multiple sets. */
> struct cgraph_node_set_def
> {
> - struct pointer_map_t *map;
> + hash_map<cgraph_node *, size_t> *map;
> vec<cgraph_node *> nodes;
> };
>
> @@ -1217,7 +1218,7 @@ class varpool_node;
> can appear in multiple sets. */
> struct varpool_node_set_def
> {
> - struct pointer_map_t * map;
> + hash_map<varpool_node *, size_t> * map;
> vec<varpool_node *> nodes;
> };
>
> diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c
> index 3cd8047..6eeca4d 100644
> --- a/gcc/cp/optimize.c
> +++ b/gcc/cp/optimize.c
> @@ -86,7 +86,7 @@ clone_body (tree clone, tree fn, void *arg_map)
> id.src_fn = fn;
> id.dst_fn = clone;
> id.src_cfun = DECL_STRUCT_FUNCTION (fn);
> - id.decl_map = (struct pointer_map_t *) arg_map;
> + id.decl_map = static_cast<hash_map<tree, tree> *> (arg_map);
>
> id.copy_decl = copy_decl_no_change;
> id.transform_call_graph_edges = CB_CGE_DUPLICATE;
> @@ -527,7 +527,7 @@ maybe_clone_body (tree fn)
> tree parm;
> tree clone_parm;
> int parmno;
> - struct pointer_map_t *decl_map;
> + hash_map<tree, tree> *decl_map;
> bool alias = false;
>
> clone = fns[idx];
> @@ -587,7 +587,7 @@ maybe_clone_body (tree fn)
> }
>
> /* Remap the parameters. */
> - decl_map = pointer_map_create ();
> + decl_map = new hash_map<tree, tree>;
> for (parmno = 0,
> parm = DECL_ARGUMENTS (fn),
> clone_parm = DECL_ARGUMENTS (clone);
> @@ -600,7 +600,7 @@ maybe_clone_body (tree fn)
> {
> tree in_charge;
> in_charge = in_charge_arg_for_name (DECL_NAME (clone));
> - *pointer_map_insert (decl_map, parm) = in_charge;
> + decl_map->put (parm, in_charge);
> }
> else if (DECL_ARTIFICIAL (parm)
> && DECL_NAME (parm) == vtt_parm_identifier)
> @@ -611,19 +611,22 @@ maybe_clone_body (tree fn)
> if (DECL_HAS_VTT_PARM_P (clone))
> {
> DECL_ABSTRACT_ORIGIN (clone_parm) = parm;
> - *pointer_map_insert (decl_map, parm) = clone_parm;
> + decl_map->put (parm, clone_parm);
> clone_parm = DECL_CHAIN (clone_parm);
> }
> /* Otherwise, map the VTT parameter to `NULL'. */
> else
> - *pointer_map_insert (decl_map, parm)
> - = fold_convert (TREE_TYPE (parm), null_pointer_node);
> + {
> + tree t
> + = fold_convert (TREE_TYPE (parm), null_pointer_node);
> + decl_map->put (parm, t);
> + }
> }
> /* Map other parameters to their equivalents in the cloned
> function. */
> else
> {
> - *pointer_map_insert (decl_map, parm) = clone_parm;
> + decl_map->put (parm, clone_parm);
> clone_parm = DECL_CHAIN (clone_parm);
> }
> }
> @@ -632,14 +635,14 @@ maybe_clone_body (tree fn)
> {
> parm = DECL_RESULT (fn);
> clone_parm = DECL_RESULT (clone);
> - *pointer_map_insert (decl_map, parm) = clone_parm;
> + decl_map->put (parm, clone_parm);
> }
>
> /* Clone the body. */
> clone_body (clone, fn, decl_map);
>
> /* Clean up. */
> - pointer_map_destroy (decl_map);
> + delete decl_map;
> }
>
> /* The clone can throw iff the original function can throw. */
> diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
> index 735284e..4868d69 100644
> --- a/gcc/cp/semantics.c
> +++ b/gcc/cp/semantics.c
> @@ -4977,15 +4977,15 @@ clone_omp_udr (tree stmt, tree omp_decl1, tree omp_decl2,
> tree decl, tree placeholder)
> {
> copy_body_data id;
> - struct pointer_map_t *decl_map = pointer_map_create ();
> + hash_map<tree, tree> decl_map;
>
> - *pointer_map_insert (decl_map, omp_decl1) = placeholder;
> - *pointer_map_insert (decl_map, omp_decl2) = decl;
> + decl_map.put (omp_decl1, placeholder);
> + decl_map.put (omp_decl2, decl);
> memset (&id, 0, sizeof (id));
> id.src_fn = DECL_CONTEXT (omp_decl1);
> id.dst_fn = current_function_decl;
> id.src_cfun = DECL_STRUCT_FUNCTION (id.src_fn);
> - id.decl_map = decl_map;
> + id.decl_map = &decl_map;
>
> id.copy_decl = copy_decl_no_change;
> id.transform_call_graph_edges = CB_CGE_DUPLICATE;
> @@ -4994,7 +4994,6 @@ clone_omp_udr (tree stmt, tree omp_decl1, tree omp_decl2,
> id.transform_lang_insert_block = NULL;
> id.eh_lp_nr = 0;
> walk_tree (&stmt, copy_tree_body_r, &id, NULL);
> - pointer_map_destroy (decl_map);
> return stmt;
> }
>
> diff --git a/gcc/except.c b/gcc/except.c
> index c8dbc50..ec08e91 100644
> --- a/gcc/except.c
> +++ b/gcc/except.c
> @@ -527,7 +527,7 @@ struct duplicate_eh_regions_data
> {
> duplicate_eh_regions_map label_map;
> void *label_map_data;
> - struct pointer_map_t *eh_map;
> + hash_map<void *, void *> *eh_map;
> };
>
> static void
> @@ -536,12 +536,9 @@ duplicate_eh_regions_1 (struct duplicate_eh_regions_data *data,
> {
> eh_landing_pad old_lp, new_lp;
> eh_region new_r;
> - void **slot;
>
> new_r = gen_eh_region (old_r->type, outer);
> - slot = pointer_map_insert (data->eh_map, (void *)old_r);
> - gcc_assert (*slot == NULL);
> - *slot = (void *)new_r;
> + gcc_assert (!data->eh_map->put (old_r, new_r));
>
> switch (old_r->type)
> {
> @@ -586,9 +583,7 @@ duplicate_eh_regions_1 (struct duplicate_eh_regions_data *data,
> continue;
>
> new_lp = gen_eh_landing_pad (new_r);
> - slot = pointer_map_insert (data->eh_map, (void *)old_lp);
> - gcc_assert (*slot == NULL);
> - *slot = (void *)new_lp;
> + gcc_assert (!data->eh_map->put (old_lp, new_lp));
>
> new_lp->post_landing_pad
> = data->label_map (old_lp->post_landing_pad, data->label_map_data);
> @@ -609,7 +604,7 @@ duplicate_eh_regions_1 (struct duplicate_eh_regions_data *data,
> that allows the caller to remap uses of both EH regions and
> EH landing pads. */
>
> -struct pointer_map_t *
> +hash_map<void *, void *> *
> duplicate_eh_regions (struct function *ifun,
> eh_region copy_region, int outer_lp,
> duplicate_eh_regions_map map, void *map_data)
> @@ -623,7 +618,7 @@ duplicate_eh_regions (struct function *ifun,
>
> data.label_map = map;
> data.label_map_data = map_data;
> - data.eh_map = pointer_map_create ();
> + data.eh_map = new hash_map<void *, void *>;
>
> outer_region = get_eh_region_from_lp_number (outer_lp);
>
> diff --git a/gcc/except.h b/gcc/except.h
> index bab13e1..5c2aa3d 100644
> --- a/gcc/except.h
> +++ b/gcc/except.h
> @@ -25,6 +25,7 @@ along with GCC; see the file COPYING3. If not see
> # define GCC_EXCEPT_H
> #endif
>
> +#include "hash-map.h"
> #include "hashtab.h"
>
> struct function;
> @@ -249,7 +250,7 @@ extern rtx expand_builtin_extend_pointer (tree);
> extern void expand_dw2_landing_pad_for_region (eh_region);
>
> typedef tree (*duplicate_eh_regions_map) (tree, void *);
> -extern struct pointer_map_t *duplicate_eh_regions
> +extern hash_map<void *, void *> *duplicate_eh_regions
> (struct function *, eh_region, int, duplicate_eh_regions_map, void *);
>
> extern void sjlj_emit_function_exit_after (rtx);
> diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c
> index d7c5db5..b13b7f7 100644
> --- a/gcc/gimple-ssa-strength-reduction.c
> +++ b/gcc/gimple-ssa-strength-reduction.c
> @@ -38,6 +38,7 @@ along with GCC; see the file COPYING3. If not see
> #include "coretypes.h"
> #include "tree.h"
> #include "pointer-set.h"
> +#include "hash-map.h"
> #include "hash-table.h"
> #include "basic-block.h"
> #include "tree-ssa-alias.h"
> @@ -373,7 +374,7 @@ enum count_phis_status
> };
>
> /* Pointer map embodying a mapping from statements to candidates. */
> -static struct pointer_map_t *stmt_cand_map;
> +static hash_map<gimple, slsr_cand_t> *stmt_cand_map;
>
> /* Obstack for candidates. */
> static struct obstack cand_obstack;
> @@ -435,7 +436,7 @@ static hash_table<cand_chain_hasher> *base_cand_map;
> /* Pointer map used by tree_to_aff_combination_expand. */
> static struct pointer_map_t *name_expansions;
> /* Pointer map embodying a mapping from bases to alternative bases. */
> -static struct pointer_map_t *alt_base_map;
> +static hash_map<tree, tree> *alt_base_map;
>
> /* Given BASE, use the tree affine combiniation facilities to
> find the underlying tree expression for BASE, with any
> @@ -447,7 +448,7 @@ static struct pointer_map_t *alt_base_map;
> static tree
> get_alternative_base (tree base)
> {
> - tree *result = (tree *) pointer_map_contains (alt_base_map, base);
> + tree *result = alt_base_map->get (base);
>
> if (result == NULL)
> {
> @@ -459,13 +460,9 @@ get_alternative_base (tree base)
> aff.offset = 0;
> expr = aff_combination_to_tree (&aff);
>
> - result = (tree *) pointer_map_insert (alt_base_map, base);
> - gcc_assert (!*result);
> + gcc_assert (!alt_base_map->put (base, base == expr ? NULL : expr));
>
> - if (expr == base)
> - *result = NULL;
> - else
> - *result = expr;
> + return expr == base ? NULL : expr;
> }
>
> return *result;
> @@ -724,7 +721,7 @@ base_cand_from_table (tree base_in)
> if (!def)
> return (slsr_cand_t) NULL;
>
> - result = (slsr_cand_t *) pointer_map_contains (stmt_cand_map, def);
> + result = stmt_cand_map->get (def);
>
> if (result && (*result)->kind != CAND_REF)
> return *result;
> @@ -737,9 +734,7 @@ base_cand_from_table (tree base_in)
> static void
> add_cand_for_stmt (gimple gs, slsr_cand_t c)
> {
> - void **slot = pointer_map_insert (stmt_cand_map, gs);
> - gcc_assert (!*slot);
> - *slot = c;
> + gcc_assert (!stmt_cand_map->put (gs, c));
> }
>
> /* Given PHI which contains a phi statement, determine whether it
> @@ -3628,7 +3623,7 @@ pass_strength_reduction::execute (function *fun)
> cand_vec.create (128);
>
> /* Allocate the mapping from statements to candidate indices. */
> - stmt_cand_map = pointer_map_create ();
> + stmt_cand_map = new hash_map<gimple, slsr_cand_t>;
>
> /* Create the obstack where candidate chains will reside. */
> gcc_obstack_init (&chain_obstack);
> @@ -3637,7 +3632,7 @@ pass_strength_reduction::execute (function *fun)
> base_cand_map = new hash_table<cand_chain_hasher> (500);
>
> /* Allocate the mapping from bases to alternative bases. */
> - alt_base_map = pointer_map_create ();
> + alt_base_map = new hash_map<tree, tree>;
>
> /* Initialize the loop optimizer. We need to detect flow across
> back edges, and this gives us dominator information as well. */
> @@ -3654,7 +3649,7 @@ pass_strength_reduction::execute (function *fun)
> dump_cand_chains ();
> }
>
> - pointer_map_destroy (alt_base_map);
> + delete alt_base_map;
> free_affine_expand_cache (&name_expansions);
>
> /* Analyze costs and make appropriate replacements. */
> @@ -3664,7 +3659,7 @@ pass_strength_reduction::execute (function *fun)
> delete base_cand_map;
> base_cand_map = NULL;
> obstack_free (&chain_obstack, NULL);
> - pointer_map_destroy (stmt_cand_map);
> + delete stmt_cand_map;
> cand_vec.release ();
> obstack_free (&cand_obstack, NULL);
>
> diff --git a/gcc/hash-map.h b/gcc/hash-map.h
> index 0b50f72..ec48844 100644
> --- a/gcc/hash-map.h
> +++ b/gcc/hash-map.h
> @@ -93,7 +93,7 @@ private:
> static void
> mark_key_deleted (T *&k)
> {
> - k = static_cast<T *> (1);
> + k = reinterpret_cast<T *> (1);
> }
>
> template<typename T>
> @@ -185,6 +185,11 @@ public:
> return e->m_value;
> }
>
> + void remove (const Key &k)
> + {
> + m_table.remove_elt_with_hash (k, Traits::hash (k));
> + }
> +
> /* Call the call back on each pair of key and value with the passed in
> arg. */
>
> @@ -196,6 +201,15 @@ public:
> f ((*iter).m_key, (*iter).m_value, a);
> }
>
> + template<typename Arg, bool (*f)(const Key &, Value *, Arg)>
> + void traverse (Arg a) const
> + {
> + for (typename hash_table<hash_entry>::iterator iter = m_table.begin ();
> + iter != m_table.end (); ++iter)
> + if (!f ((*iter).m_key, &(*iter).m_value, a))
> + break;
> + }
> +
> private:
> hash_table<hash_entry> m_table;
> };
> diff --git a/gcc/ipa-utils.c b/gcc/ipa-utils.c
> index 7810e55..a391b5d 100644
> --- a/gcc/ipa-utils.c
> +++ b/gcc/ipa-utils.c
> @@ -389,7 +389,7 @@ cgraph_node_set_new (void)
> cgraph_node_set new_node_set;
>
> new_node_set = XCNEW (struct cgraph_node_set_def);
> - new_node_set->map = pointer_map_create ();
> + new_node_set->map = new hash_map<cgraph_node *, size_t>;
> new_node_set->nodes.create (0);
> return new_node_set;
> }
> @@ -400,19 +400,17 @@ cgraph_node_set_new (void)
> void
> cgraph_node_set_add (cgraph_node_set set, struct cgraph_node *node)
> {
> - void **slot;
> + bool existed_p;
> + size_t &index = set->map->get_or_insert (node, &existed_p);
>
> - slot = pointer_map_insert (set->map, node);
> -
> - if (*slot)
> + if (existed_p)
> {
> - int index = (size_t) *slot - 1;
> gcc_checking_assert ((set->nodes[index]
> == node));
> return;
> }
>
> - *slot = (void *)(size_t) (set->nodes.length () + 1);
> + index = set->nodes.length () + 1;
>
> /* Insert into node vector. */
> set->nodes.safe_push (node);
> @@ -424,15 +422,14 @@ cgraph_node_set_add (cgraph_node_set set, struct cgraph_node *node)
> void
> cgraph_node_set_remove (cgraph_node_set set, struct cgraph_node *node)
> {
> - void **slot, **last_slot;
> int index;
> struct cgraph_node *last_node;
>
> - slot = pointer_map_contains (set->map, node);
> + size_t *slot = set->map->get (node);
> if (slot == NULL || !*slot)
> return;
>
> - index = (size_t) *slot - 1;
> + index = *slot - 1;
> gcc_checking_assert (set->nodes[index]
> == node);
>
> @@ -441,16 +438,16 @@ cgraph_node_set_remove (cgraph_node_set set, struct cgraph_node *node)
> last_node = set->nodes.pop ();
> if (last_node != node)
> {
> - last_slot = pointer_map_contains (set->map, last_node);
> + size_t *last_slot = set->map->get (last_node);
> gcc_checking_assert (last_slot && *last_slot);
> - *last_slot = (void *)(size_t) (index + 1);
> + *last_slot = index + 1;
>
> /* Move the last element to the original spot of NODE. */
> set->nodes[index] = last_node;
> }
>
> /* Remove element from hash table. */
> - *slot = NULL;
> + set->map->remove (node);
> }
>
>
> @@ -460,14 +457,14 @@ cgraph_node_set_remove (cgraph_node_set set, struct cgraph_node *node)
> cgraph_node_set_iterator
> cgraph_node_set_find (cgraph_node_set set, struct cgraph_node *node)
> {
> - void **slot;
> + size_t *slot;
> cgraph_node_set_iterator csi;
>
> - slot = pointer_map_contains (set->map, node);
> + slot = set->map->get (node);
> if (slot == NULL || !*slot)
> csi.index = (unsigned) ~0;
> else
> - csi.index = (size_t)*slot - 1;
> + csi.index = *slot - 1;
> csi.set = set;
>
> return csi;
> @@ -505,7 +502,7 @@ void
> free_cgraph_node_set (cgraph_node_set set)
> {
> set->nodes.release ();
> - pointer_map_destroy (set->map);
> + delete set->map;
> free (set);
> }
>
> @@ -518,7 +515,7 @@ varpool_node_set_new (void)
> varpool_node_set new_node_set;
>
> new_node_set = XCNEW (struct varpool_node_set_def);
> - new_node_set->map = pointer_map_create ();
> + new_node_set->map = new hash_map<varpool_node *, size_t>;
> new_node_set->nodes.create (0);
> return new_node_set;
> }
> @@ -529,19 +526,18 @@ varpool_node_set_new (void)
> void
> varpool_node_set_add (varpool_node_set set, varpool_node *node)
> {
> - void **slot;
> -
> - slot = pointer_map_insert (set->map, node);
> + bool existed;
> + size_t &slot = set->map->get_or_insert (node, &existed);
>
> - if (*slot)
> + if (existed)
> {
> - int index = (size_t) *slot - 1;
> + int index = slot - 1;
> gcc_checking_assert ((set->nodes[index]
> == node));
> return;
> }
>
> - *slot = (void *)(size_t) (set->nodes.length () + 1);
> + slot = set->nodes.length () + 1;
>
> /* Insert into node vector. */
> set->nodes.safe_push (node);
> @@ -553,15 +549,14 @@ varpool_node_set_add (varpool_node_set set, varpool_node *node)
> void
> varpool_node_set_remove (varpool_node_set set, varpool_node *node)
> {
> - void **slot, **last_slot;
> int index;
> varpool_node *last_node;
>
> - slot = pointer_map_contains (set->map, node);
> + size_t *slot = set->map->get (node);
> if (slot == NULL || !*slot)
> return;
>
> - index = (size_t) *slot - 1;
> + index = *slot - 1;
> gcc_checking_assert (set->nodes[index]
> == node);
>
> @@ -570,16 +565,16 @@ varpool_node_set_remove (varpool_node_set set, varpool_node *node)
> last_node = set->nodes.pop ();
> if (last_node != node)
> {
> - last_slot = pointer_map_contains (set->map, last_node);
> + size_t *last_slot = set->map->get (last_node);
> gcc_checking_assert (last_slot && *last_slot);
> - *last_slot = (void *)(size_t) (index + 1);
> + *last_slot = index + 1;
>
> /* Move the last element to the original spot of NODE. */
> set->nodes[index] = last_node;
> }
>
> /* Remove element from hash table. */
> - *slot = NULL;
> + set->map->remove (node);
> }
>
>
> @@ -589,14 +584,13 @@ varpool_node_set_remove (varpool_node_set set, varpool_node *node)
> varpool_node_set_iterator
> varpool_node_set_find (varpool_node_set set, varpool_node *node)
> {
> - void **slot;
> varpool_node_set_iterator vsi;
>
> - slot = pointer_map_contains (set->map, node);
> + size_t *slot = set->map->get (node);
> if (slot == NULL || !*slot)
> vsi.index = (unsigned) ~0;
> else
> - vsi.index = (size_t)*slot - 1;
> + vsi.index = *slot - 1;
> vsi.set = set;
>
> return vsi;
> @@ -625,7 +619,7 @@ void
> free_varpool_node_set (varpool_node_set set)
> {
> set->nodes.release ();
> - pointer_map_destroy (set->map);
> + delete set->map;
> free (set);
> }
>
> diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
> index 42b0790..28a30ad 100644
> --- a/gcc/lto-cgraph.c
> +++ b/gcc/lto-cgraph.c
> @@ -93,7 +93,7 @@ lto_symtab_encoder_new (bool for_input)
> lto_symtab_encoder_t encoder = XCNEW (struct lto_symtab_encoder_d);
>
> if (!for_input)
> - encoder->map = pointer_map_create ();
> + encoder->map = new hash_map<symtab_node *, size_t>;
> encoder->nodes.create (0);
> return encoder;
> }
> @@ -106,7 +106,7 @@ lto_symtab_encoder_delete (lto_symtab_encoder_t encoder)
> {
> encoder->nodes.release ();
> if (encoder->map)
> - pointer_map_destroy (encoder->map);
> + delete encoder->map;
> free (encoder);
> }
>
> @@ -120,7 +120,6 @@ lto_symtab_encoder_encode (lto_symtab_encoder_t encoder,
> symtab_node *node)
> {
> int ref;
> - void **slot;
>
> if (!encoder->map)
> {
> @@ -131,18 +130,17 @@ lto_symtab_encoder_encode (lto_symtab_encoder_t encoder,
> return ref;
> }
>
> - slot = pointer_map_contains (encoder->map, node);
> + size_t *slot = encoder->map->get (node);
> if (!slot || !*slot)
> {
> lto_encoder_entry entry = {node, false, false, false};
> ref = encoder->nodes.length ();
> if (!slot)
> - slot = pointer_map_insert (encoder->map, node);
> - *slot = (void *) (intptr_t) (ref + 1);
> + encoder->map->put (node, ref + 1);
> encoder->nodes.safe_push (entry);
> }
> else
> - ref = (size_t) *slot - 1;
> + ref = *slot - 1;
>
> return ref;
> }
> @@ -153,15 +151,14 @@ bool
> lto_symtab_encoder_delete_node (lto_symtab_encoder_t encoder,
> symtab_node *node)
> {
> - void **slot, **last_slot;
> int index;
> lto_encoder_entry last_node;
>
> - slot = pointer_map_contains (encoder->map, node);
> + size_t *slot = encoder->map->get (node);
> if (slot == NULL || !*slot)
> return false;
>
> - index = (size_t) *slot - 1;
> + index = *slot - 1;
> gcc_checking_assert (encoder->nodes[index].node == node);
>
> /* Remove from vector. We do this by swapping node with the last element
> @@ -169,16 +166,14 @@ lto_symtab_encoder_delete_node (lto_symtab_encoder_t encoder,
> last_node = encoder->nodes.pop ();
> if (last_node.node != node)
> {
> - last_slot = pointer_map_contains (encoder->map, last_node.node);
> - gcc_checking_assert (last_slot && *last_slot);
> - *last_slot = (void *)(size_t) (index + 1);
> + gcc_assert (encoder->map->put (last_node.node, index + 1));
>
> /* Move the last element to the original spot of NODE. */
> encoder->nodes[index] = last_node;
> }
>
> /* Remove element from hash table. */
> - *slot = NULL;
> + encoder->map->remove (node);
> return true;
> }
>
> diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h
> index d350ad9..b2486dd 100644
> --- a/gcc/lto-streamer.h
> +++ b/gcc/lto-streamer.h
> @@ -443,7 +443,7 @@ struct lto_encoder_entry
> struct lto_symtab_encoder_d
> {
> vec<lto_encoder_entry> nodes;
> - pointer_map_t *map;
> + hash_map<symtab_node *, size_t> *map;
> };
>
> typedef struct lto_symtab_encoder_d *lto_symtab_encoder_t;
> @@ -1046,8 +1046,8 @@ static inline int
> lto_symtab_encoder_lookup (lto_symtab_encoder_t encoder,
> symtab_node *node)
> {
> - void **slot = pointer_map_contains (encoder->map, node);
> - return (slot && *slot ? (size_t) *(slot) - 1 : LCC_NOT_FOUND);
> + size_t *slot = encoder->map->get (node);
> + return (slot && *slot ? *(slot) - 1 : LCC_NOT_FOUND);
> }
>
> /* Return true if iterator LSE points to nothing. */
> diff --git a/gcc/omp-low.c b/gcc/omp-low.c
> index b46693b..0fe2a40 100644
> --- a/gcc/omp-low.c
> +++ b/gcc/omp-low.c
> @@ -812,16 +812,14 @@ is_reference (tree decl)
> static inline tree
> lookup_decl (tree var, omp_context *ctx)
> {
> - tree *n;
> - n = (tree *) pointer_map_contains (ctx->cb.decl_map, var);
> + tree *n = ctx->cb.decl_map->get (var);
> return *n;
> }
>
> static inline tree
> maybe_lookup_decl (const_tree var, omp_context *ctx)
> {
> - tree *n;
> - n = (tree *) pointer_map_contains (ctx->cb.decl_map, var);
> + tree *n = ctx->cb.decl_map->get (const_cast<tree> (var));
> return n ? *n : NULL_TREE;
> }
>
> @@ -1359,7 +1357,7 @@ new_omp_context (gimple stmt, omp_context *outer_ctx)
> ctx->depth = 1;
> }
>
> - ctx->cb.decl_map = pointer_map_create ();
> + ctx->cb.decl_map = new hash_map<tree, tree>;
>
> return ctx;
> }
> @@ -1408,7 +1406,7 @@ delete_omp_context (splay_tree_value value)
> {
> omp_context *ctx = (omp_context *) value;
>
> - pointer_map_destroy (ctx->cb.decl_map);
> + delete ctx->cb.decl_map;
>
> if (ctx->field_map)
> splay_tree_delete (ctx->field_map);
> @@ -6541,7 +6539,6 @@ expand_omp_for_static_chunk (struct omp_region *region,
> gimple_stmt_iterator psi;
> gimple phi;
> edge re, ene;
> - edge_var_map_vector *head;
> edge_var_map *vm;
> size_t i;
>
> @@ -6552,7 +6549,7 @@ expand_omp_for_static_chunk (struct omp_region *region,
> appropriate phi nodes in iter_part_bb instead. */
> se = single_pred_edge (fin_bb);
> re = single_succ_edge (trip_update_bb);
> - head = redirect_edge_var_map_vector (re);
> + vec<edge_var_map> *head = redirect_edge_var_map_vector (re);
> ene = single_succ_edge (entry_bb);
>
> psi = gsi_start_phis (fin_bb);
> @@ -9219,7 +9216,7 @@ task_copyfn_remap_type (struct omp_taskcopy_context *tcctx, tree orig_type)
> walk_tree (&DECL_FIELD_OFFSET (new_f), copy_tree_body_r,
> &tcctx->cb, NULL);
> new_fields = new_f;
> - *pointer_map_insert (tcctx->cb.decl_map, f) = new_f;
> + tcctx->cb.decl_map->put (f, new_f);
> }
> TYPE_FIELDS (type) = nreverse (new_fields);
> layout_type (type);
> @@ -9286,7 +9283,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> tcctx.cb.copy_decl = task_copyfn_copy_decl;
> tcctx.cb.eh_lp_nr = 0;
> tcctx.cb.transform_call_graph_edges = CB_CGE_MOVE;
> - tcctx.cb.decl_map = pointer_map_create ();
> + tcctx.cb.decl_map = new hash_map<tree, tree>;
> tcctx.ctx = ctx;
>
> if (record_needs_remap)
> @@ -9311,12 +9308,12 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> tree *p;
>
> decl = OMP_CLAUSE_DECL (c);
> - p = (tree *) pointer_map_contains (tcctx.cb.decl_map, decl);
> + p = tcctx.cb.decl_map->get (decl);
> if (p == NULL)
> continue;
> n = splay_tree_lookup (ctx->sfield_map, (splay_tree_key) decl);
> sf = (tree) n->value;
> - sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
> + sf = *tcctx.cb.decl_map->get (sf);
> src = build_simple_mem_ref_loc (loc, sarg);
> src = omp_build_component_ref (src, sf);
> t = build2 (MODIFY_EXPR, TREE_TYPE (*p), *p, src);
> @@ -9335,11 +9332,11 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> break;
> f = (tree) n->value;
> if (tcctx.cb.decl_map)
> - f = *(tree *) pointer_map_contains (tcctx.cb.decl_map, f);
> + f = *tcctx.cb.decl_map->get (f);
> n = splay_tree_lookup (ctx->sfield_map, (splay_tree_key) decl);
> sf = (tree) n->value;
> if (tcctx.cb.decl_map)
> - sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
> + sf = *tcctx.cb.decl_map->get (sf);
> src = build_simple_mem_ref_loc (loc, sarg);
> src = omp_build_component_ref (src, sf);
> dst = build_simple_mem_ref_loc (loc, arg);
> @@ -9356,13 +9353,13 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> break;
> f = (tree) n->value;
> if (tcctx.cb.decl_map)
> - f = *(tree *) pointer_map_contains (tcctx.cb.decl_map, f);
> + f = *tcctx.cb.decl_map->get (f);
> n = splay_tree_lookup (ctx->sfield_map, (splay_tree_key) decl);
> if (n != NULL)
> {
> sf = (tree) n->value;
> if (tcctx.cb.decl_map)
> - sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
> + sf = *tcctx.cb.decl_map->get (sf);
> src = build_simple_mem_ref_loc (loc, sarg);
> src = omp_build_component_ref (src, sf);
> if (use_pointer_for_field (decl, NULL) || is_reference (decl))
> @@ -9382,13 +9379,13 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> n = splay_tree_lookup (ctx->field_map, (splay_tree_key) decl);
> f = (tree) n->value;
> if (tcctx.cb.decl_map)
> - f = *(tree *) pointer_map_contains (tcctx.cb.decl_map, f);
> + f = *tcctx.cb.decl_map->get (f);
> n = splay_tree_lookup (ctx->sfield_map, (splay_tree_key) decl);
> if (n != NULL)
> {
> sf = (tree) n->value;
> if (tcctx.cb.decl_map)
> - sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
> + sf = *tcctx.cb.decl_map->get (sf);
> src = build_simple_mem_ref_loc (loc, sarg);
> src = omp_build_component_ref (src, sf);
> if (use_pointer_for_field (decl, NULL))
> @@ -9419,7 +9416,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> if (n == NULL)
> continue;
> f = (tree) n->value;
> - f = *(tree *) pointer_map_contains (tcctx.cb.decl_map, f);
> + f = *tcctx.cb.decl_map->get (f);
> gcc_assert (DECL_HAS_VALUE_EXPR_P (decl));
> ind = DECL_VALUE_EXPR (decl);
> gcc_assert (TREE_CODE (ind) == INDIRECT_REF);
> @@ -9427,7 +9424,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> n = splay_tree_lookup (ctx->sfield_map,
> (splay_tree_key) TREE_OPERAND (ind, 0));
> sf = (tree) n->value;
> - sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
> + sf = *tcctx.cb.decl_map->get (sf);
> src = build_simple_mem_ref_loc (loc, sarg);
> src = omp_build_component_ref (src, sf);
> src = build_simple_mem_ref_loc (loc, src);
> @@ -9438,7 +9435,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> n = splay_tree_lookup (ctx->field_map,
> (splay_tree_key) TREE_OPERAND (ind, 0));
> df = (tree) n->value;
> - df = *(tree *) pointer_map_contains (tcctx.cb.decl_map, df);
> + df = *tcctx.cb.decl_map->get (df);
> ptr = build_simple_mem_ref_loc (loc, arg);
> ptr = omp_build_component_ref (ptr, df);
> t = build2 (MODIFY_EXPR, TREE_TYPE (ptr), ptr,
> @@ -9450,7 +9447,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> append_to_statement_list (t, &list);
>
> if (tcctx.cb.decl_map)
> - pointer_map_destroy (tcctx.cb.decl_map);
> + delete tcctx.cb.decl_map;
> pop_gimplify_context (NULL);
> BIND_EXPR_BODY (bind) = list;
> pop_cfun ();
> diff --git a/gcc/predict.c b/gcc/predict.c
> index 72a3b53..34ebdc3 100644
> --- a/gcc/predict.c
> +++ b/gcc/predict.c
> @@ -52,6 +52,7 @@ along with GCC; see the file COPYING3. If not see
> #include "target.h"
> #include "cfgloop.h"
> #include "pointer-set.h"
> +#include "hash-map.h"
> #include "tree-ssa-alias.h"
> #include "internal-fn.h"
> #include "gimple-expr.h"
> @@ -490,11 +491,6 @@ rtl_predicted_by_p (const_basic_block bb, enum br_predictor predictor)
> return false;
> }
>
> -/* This map contains for a basic block the list of predictions for the
> - outgoing edges. */
> -
> -static struct pointer_map_t *bb_predictions;
> -
> /* Structure representing predictions in tree level. */
>
> struct edge_prediction {
> @@ -504,6 +500,11 @@ struct edge_prediction {
> int ep_probability;
> };
>
> +/* This map contains for a basic block the list of predictions for the
> + outgoing edges. */
> +
> +static hash_map<const_basic_block, edge_prediction *> *bb_predictions;
> +
> /* Return true if the one of outgoing edges is already predicted by
> PREDICTOR. */
>
> @@ -511,12 +512,12 @@ bool
> gimple_predicted_by_p (const_basic_block bb, enum br_predictor predictor)
> {
> struct edge_prediction *i;
> - void **preds = pointer_map_contains (bb_predictions, bb);
> + edge_prediction **preds = bb_predictions->get (bb);
>
> if (!preds)
> return false;
>
> - for (i = (struct edge_prediction *) *preds; i; i = i->ep_next)
> + for (i = *preds; i; i = i->ep_next)
> if (i->ep_predictor == predictor)
> return true;
> return false;
> @@ -618,10 +619,10 @@ gimple_predict_edge (edge e, enum br_predictor predictor, int probability)
> && flag_guess_branch_prob && optimize)
> {
> struct edge_prediction *i = XNEW (struct edge_prediction);
> - void **preds = pointer_map_insert (bb_predictions, e->src);
> + edge_prediction *&preds = bb_predictions->get_or_insert (e->src);
>
> - i->ep_next = (struct edge_prediction *) *preds;
> - *preds = i;
> + i->ep_next = preds;
> + preds = i;
> i->ep_probability = probability;
> i->ep_predictor = predictor;
> i->ep_edge = e;
> @@ -633,16 +634,14 @@ gimple_predict_edge (edge e, enum br_predictor predictor, int probability)
> void
> remove_predictions_associated_with_edge (edge e)
> {
> - void **preds;
> -
> if (!bb_predictions)
> return;
>
> - preds = pointer_map_contains (bb_predictions, e->src);
> + edge_prediction **preds = bb_predictions->get (e->src);
>
> if (preds)
> {
> - struct edge_prediction **prediction = (struct edge_prediction **) preds;
> + struct edge_prediction **prediction = preds;
> struct edge_prediction *next;
>
> while (*prediction)
> @@ -664,13 +663,13 @@ remove_predictions_associated_with_edge (edge e)
> static void
> clear_bb_predictions (basic_block bb)
> {
> - void **preds = pointer_map_contains (bb_predictions, bb);
> + edge_prediction **preds = bb_predictions->get (bb);
> struct edge_prediction *pred, *next;
>
> if (!preds)
> return;
>
> - for (pred = (struct edge_prediction *) *preds; pred; pred = next)
> + for (pred = *preds; pred; pred = next)
> {
> next = pred->ep_next;
> free (pred);
> @@ -903,7 +902,6 @@ combine_predictions_for_bb (basic_block bb)
> int nedges = 0;
> edge e, first = NULL, second = NULL;
> edge_iterator ei;
> - void **preds;
>
> FOR_EACH_EDGE (e, ei, bb->succs)
> if (!(e->flags & (EDGE_EH | EDGE_FAKE)))
> @@ -935,12 +933,12 @@ combine_predictions_for_bb (basic_block bb)
> if (dump_file)
> fprintf (dump_file, "Predictions for bb %i\n", bb->index);
>
> - preds = pointer_map_contains (bb_predictions, bb);
> + edge_prediction **preds = bb_predictions->get (bb);
> if (preds)
> {
> /* We implement "first match" heuristics and use probability guessed
> by predictor with smallest index. */
> - for (pred = (struct edge_prediction *) *preds; pred; pred = pred->ep_next)
> + for (pred = *preds; pred; pred = pred->ep_next)
> {
> enum br_predictor predictor = pred->ep_predictor;
> int probability = pred->ep_probability;
> @@ -2243,14 +2241,14 @@ tree_bb_level_predictions (void)
>
> #ifdef ENABLE_CHECKING
>
> -/* Callback for pointer_map_traverse, asserts that the pointer map is
> +/* Callback for hash_map::traverse, asserts that the pointer map is
> empty. */
>
> -static bool
> -assert_is_empty (const void *key ATTRIBUTE_UNUSED, void **value,
> - void *data ATTRIBUTE_UNUSED)
> +bool
> +assert_is_empty (const_basic_block const &, edge_prediction *const &value,
> + void *)
> {
> - gcc_assert (!*value);
> + gcc_assert (!value);
> return false;
> }
> #endif
> @@ -2375,7 +2373,7 @@ tree_estimate_probability (void)
> create_preheaders (CP_SIMPLE_PREHEADERS);
> calculate_dominance_info (CDI_POST_DOMINATORS);
>
> - bb_predictions = pointer_map_create ();
> + bb_predictions = new hash_map<const_basic_block, edge_prediction *>;
> tree_bb_level_predictions ();
> record_loop_exits ();
>
> @@ -2389,9 +2387,9 @@ tree_estimate_probability (void)
> combine_predictions_for_bb (bb);
>
> #ifdef ENABLE_CHECKING
> - pointer_map_traverse (bb_predictions, assert_is_empty, NULL);
> + bb_predictions->traverse<void *, assert_is_empty> (NULL);
> #endif
> - pointer_map_destroy (bb_predictions);
> + delete bb_predictions;
> bb_predictions = NULL;
>
> estimate_bb_frequencies (false);
> diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
> index e034762..cfa6527 100644
> --- a/gcc/tree-cfg.c
> +++ b/gcc/tree-cfg.c
> @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see
> #include "system.h"
> #include "coretypes.h"
> #include "hash-table.h"
> +#include "hash-map.h"
> #include "tm.h"
> #include "tree.h"
> #include "trans-mem.h"
> @@ -92,7 +93,7 @@ static const int initial_cfg_capacity = 20;
> more persistent. The key is getting notification of changes to
> the CFG (particularly edge removal, creation and redirection). */
>
> -static struct pointer_map_t *edge_to_cases;
> +static hash_map<edge, tree> *edge_to_cases;
>
> /* If we record edge_to_cases, this bitmap will hold indexes
> of basic blocks that end in a GIMPLE_SWITCH which we touched
> @@ -1048,19 +1049,17 @@ make_cond_expr_edges (basic_block bb)
> SWITCH_EXPRs and structure sharing rules, then free the hash table
> element. */
>
> -static bool
> -edge_to_cases_cleanup (const void *key ATTRIBUTE_UNUSED, void **value,
> - void *data ATTRIBUTE_UNUSED)
> +bool
> +edge_to_cases_cleanup (edge const &, tree const &value, void *)
> {
> tree t, next;
>
> - for (t = (tree) *value; t; t = next)
> + for (t = value; t; t = next)
> {
> next = CASE_CHAIN (t);
> CASE_CHAIN (t) = NULL;
> }
>
> - *value = NULL;
> return true;
> }
>
> @@ -1070,7 +1069,7 @@ void
> start_recording_case_labels (void)
> {
> gcc_assert (edge_to_cases == NULL);
> - edge_to_cases = pointer_map_create ();
> + edge_to_cases = new hash_map<edge, tree>;
> touched_switch_bbs = BITMAP_ALLOC (NULL);
> }
>
> @@ -1089,8 +1088,8 @@ end_recording_case_labels (void)
> {
> bitmap_iterator bi;
> unsigned i;
> - pointer_map_traverse (edge_to_cases, edge_to_cases_cleanup, NULL);
> - pointer_map_destroy (edge_to_cases);
> + edge_to_cases->traverse<void *, edge_to_cases_cleanup> (NULL);
> + delete edge_to_cases;
> edge_to_cases = NULL;
> EXECUTE_IF_SET_IN_BITMAP (touched_switch_bbs, 0, i, bi)
> {
> @@ -1113,7 +1112,7 @@ end_recording_case_labels (void)
> static tree
> get_cases_for_edge (edge e, gimple t)
> {
> - void **slot;
> + tree *slot;
> size_t i, n;
>
> /* If we are not recording cases, then we do not have CASE_LABEL_EXPR
> @@ -1121,9 +1120,9 @@ get_cases_for_edge (edge e, gimple t)
> if (!recording_case_labels_p ())
> return NULL;
>
> - slot = pointer_map_contains (edge_to_cases, e);
> + slot = edge_to_cases->get (e);
> if (slot)
> - return (tree) *slot;
> + return *slot;
>
> /* If we did not find E in the hash table, then this must be the first
> time we have been queried for information about E & T. Add all the
> @@ -1139,12 +1138,12 @@ get_cases_for_edge (edge e, gimple t)
>
> /* Add it to the chain of CASE_LABEL_EXPRs referencing E, or create
> a new chain. */
> - slot = pointer_map_insert (edge_to_cases, this_edge);
> - CASE_CHAIN (elt) = (tree) *slot;
> - *slot = elt;
> + tree &s = edge_to_cases->get_or_insert (this_edge);
> + CASE_CHAIN (elt) = s;
> + s = elt;
> }
>
> - return (tree) *pointer_map_contains (edge_to_cases, e);
> + return *edge_to_cases->get (e);
> }
>
> /* Create the edges for a GIMPLE_SWITCH starting at block BB. */
> @@ -2577,12 +2576,11 @@ last_and_only_stmt (basic_block bb)
> static void
> reinstall_phi_args (edge new_edge, edge old_edge)
> {
> - edge_var_map_vector *v;
> edge_var_map *vm;
> int i;
> gimple_stmt_iterator phis;
>
> - v = redirect_edge_var_map_vector (old_edge);
> + vec<edge_var_map> *v = redirect_edge_var_map_vector (old_edge);
> if (!v)
> return;
>
> @@ -6268,22 +6266,20 @@ gather_blocks_in_sese_region (basic_block entry, basic_block exit,
> The duplicates are recorded in VARS_MAP. */
>
> static void
> -replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
> +replace_by_duplicate_decl (tree *tp, hash_map<tree, tree> *vars_map,
> tree to_context)
> {
> tree t = *tp, new_t;
> struct function *f = DECL_STRUCT_FUNCTION (to_context);
> - void **loc;
>
> if (DECL_CONTEXT (t) == to_context)
> return;
>
> - loc = pointer_map_contains (vars_map, t);
> + bool existed;
> + tree &loc = vars_map->get_or_insert (t, &existed);
>
> - if (!loc)
> + if (!existed)
> {
> - loc = pointer_map_insert (vars_map, t);
> -
> if (SSA_VAR_P (t))
> {
> new_t = copy_var_decl (t, DECL_NAME (t), TREE_TYPE (t));
> @@ -6296,10 +6292,10 @@ replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
> }
> DECL_CONTEXT (new_t) = to_context;
>
> - *loc = new_t;
> + loc = new_t;
> }
> else
> - new_t = (tree) *loc;
> + new_t = loc;
>
> *tp = new_t;
> }
> @@ -6309,15 +6305,14 @@ replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
> VARS_MAP maps old ssa names and var_decls to the new ones. */
>
> static tree
> -replace_ssa_name (tree name, struct pointer_map_t *vars_map,
> +replace_ssa_name (tree name, hash_map<tree, tree> *vars_map,
> tree to_context)
> {
> - void **loc;
> tree new_name;
>
> gcc_assert (!virtual_operand_p (name));
>
> - loc = pointer_map_contains (vars_map, name);
> + tree *loc = vars_map->get (name);
>
> if (!loc)
> {
> @@ -6335,11 +6330,10 @@ replace_ssa_name (tree name, struct pointer_map_t *vars_map,
> new_name = copy_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context),
> name, SSA_NAME_DEF_STMT (name));
>
> - loc = pointer_map_insert (vars_map, name);
> - *loc = new_name;
> + vars_map->put (name, new_name);
> }
> else
> - new_name = (tree) *loc;
> + new_name = *loc;
>
> return new_name;
> }
> @@ -6350,9 +6344,9 @@ struct move_stmt_d
> tree new_block;
> tree from_context;
> tree to_context;
> - struct pointer_map_t *vars_map;
> + hash_map<tree, tree> *vars_map;
> htab_t new_label_map;
> - struct pointer_map_t *eh_map;
> + hash_map<void *, void *> *eh_map;
> bool remap_decls_p;
> };
>
> @@ -6429,11 +6423,9 @@ static int
> move_stmt_eh_region_nr (int old_nr, struct move_stmt_d *p)
> {
> eh_region old_r, new_r;
> - void **slot;
>
> old_r = get_eh_region_from_number (old_nr);
> - slot = pointer_map_contains (p->eh_map, old_r);
> - new_r = (eh_region) *slot;
> + new_r = static_cast<eh_region> (*p->eh_map->get (old_r));
>
> return new_r->index;
> }
> @@ -6767,7 +6759,7 @@ new_label_mapper (tree decl, void *data)
> subblocks. */
>
> static void
> -replace_block_vars_by_duplicates (tree block, struct pointer_map_t *vars_map,
> +replace_block_vars_by_duplicates (tree block, hash_map<tree, tree> *vars_map,
> tree to_context)
> {
> tree *tp, t;
> @@ -6845,7 +6837,7 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
> edge e;
> edge_iterator ei;
> htab_t new_label_map;
> - struct pointer_map_t *vars_map, *eh_map;
> + hash_map<void *, void *> *eh_map;
> struct loop *loop = entry_bb->loop_father;
> struct loop *loop0 = get_loop (saved_cfun, 0);
> struct move_stmt_d d;
> @@ -6989,14 +6981,14 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
> /* Move blocks from BBS into DEST_CFUN. */
> gcc_assert (bbs.length () >= 2);
> after = dest_cfun->cfg->x_entry_block_ptr;
> - vars_map = pointer_map_create ();
> + hash_map<tree, tree> vars_map;
>
> memset (&d, 0, sizeof (d));
> d.orig_block = orig_block;
> d.new_block = DECL_INITIAL (dest_cfun->decl);
> d.from_context = cfun->decl;
> d.to_context = dest_cfun->decl;
> - d.vars_map = vars_map;
> + d.vars_map = &vars_map;
> d.new_label_map = new_label_map;
> d.eh_map = eh_map;
> d.remap_decls_p = true;
> @@ -7051,13 +7043,12 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
> }
>
> replace_block_vars_by_duplicates (DECL_INITIAL (dest_cfun->decl),
> - vars_map, dest_cfun->decl);
> + &vars_map, dest_cfun->decl);
>
> if (new_label_map)
> htab_delete (new_label_map);
> if (eh_map)
> - pointer_map_destroy (eh_map);
> - pointer_map_destroy (vars_map);
> + delete eh_map;
>
> /* Rewire the entry and exit blocks. The successor to the entry
> block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in
> diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c
> index bc4d83e..2b6927e 100644
> --- a/gcc/tree-cfgcleanup.c
> +++ b/gcc/tree-cfgcleanup.c
> @@ -865,16 +865,14 @@ remove_forwarder_block_with_phi (basic_block bb)
>
> if (TREE_CODE (def) == SSA_NAME)
> {
> - edge_var_map_vector *head;
> - edge_var_map *vm;
> - size_t i;
> -
> /* If DEF is one of the results of PHI nodes removed during
> redirection, replace it with the PHI argument that used
> to be on E. */
> - head = redirect_edge_var_map_vector (e);
> - FOR_EACH_VEC_SAFE_ELT (head, i, vm)
> + vec<edge_var_map> *head = redirect_edge_var_map_vector (e);
> + size_t length = head ? head->length () : 0;
> + for (size_t i = 0; i < length; i++)
> {
> + edge_var_map *vm = &(*head)[i];
> tree old_arg = redirect_edge_var_map_result (vm);
> tree new_arg = redirect_edge_var_map_def (vm);
>
> diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
> index 38842e8..db28184 100644
> --- a/gcc/tree-eh.c
> +++ b/gcc/tree-eh.c
> @@ -406,7 +406,7 @@ struct leh_tf_state
> size_t goto_queue_active;
>
> /* Pointer map to help in searching goto_queue when it is large. */
> - struct pointer_map_t *goto_queue_map;
> + hash_map<gimple, goto_queue_node *> *goto_queue_map;
>
> /* The set of unique labels seen as entries in the goto queue. */
> vec<tree> dest_array;
> @@ -441,7 +441,6 @@ static gimple_seq
> find_goto_replacement (struct leh_tf_state *tf, treemple stmt)
> {
> unsigned int i;
> - void **slot;
>
> if (tf->goto_queue_active < LARGE_GOTO_QUEUE)
> {
> @@ -456,19 +455,18 @@ find_goto_replacement (struct leh_tf_state *tf, treemple stmt)
>
> if (!tf->goto_queue_map)
> {
> - tf->goto_queue_map = pointer_map_create ();
> + tf->goto_queue_map = new hash_map<gimple, goto_queue_node *>;
> for (i = 0; i < tf->goto_queue_active; i++)
> {
> - slot = pointer_map_insert (tf->goto_queue_map,
> - tf->goto_queue[i].stmt.g);
> - gcc_assert (*slot == NULL);
> - *slot = &tf->goto_queue[i];
> + bool existed = tf->goto_queue_map->put (tf->goto_queue[i].stmt.g,
> + &tf->goto_queue[i]);
> + gcc_assert (!existed);
> }
> }
>
> - slot = pointer_map_contains (tf->goto_queue_map, stmt.g);
> + goto_queue_node **slot = tf->goto_queue_map->get (stmt.g);
> if (slot != NULL)
> - return (((struct goto_queue_node *) *slot)->repl_stmt);
> + return ((*slot)->repl_stmt);
>
> return NULL;
> }
> @@ -1372,7 +1370,7 @@ lower_try_finally_switch (struct leh_state *state, struct leh_tf_state *tf)
> tree tmp;
> gimple switch_stmt;
> gimple_seq finally;
> - struct pointer_map_t *cont_map = NULL;
> + hash_map<tree, gimple> *cont_map = NULL;
> /* The location of the TRY_FINALLY stmt. */
> location_t tf_loc = gimple_location (tf->try_finally_expr);
> /* The location of the finally block. */
> @@ -1511,32 +1509,27 @@ lower_try_finally_switch (struct leh_state *state, struct leh_tf_state *tf)
> if (case_label_vec.length () <= case_index || !case_label_vec[case_index])
> {
> tree case_lab;
> - void **slot;
> tmp = build_int_cst (integer_type_node, switch_id);
> case_lab = build_case_label (tmp, NULL,
> create_artificial_label (tf_loc));
> /* We store the cont_stmt in the pointer map, so that we can recover
> it in the loop below. */
> if (!cont_map)
> - cont_map = pointer_map_create ();
> - slot = pointer_map_insert (cont_map, case_lab);
> - *slot = q->cont_stmt;
> + cont_map = new hash_map<tree, gimple>;
> + cont_map->put (case_lab, q->cont_stmt);
> case_label_vec.quick_push (case_lab);
> }
> }
> for (j = last_case_index; j < last_case_index + nlabels; j++)
> {
> gimple cont_stmt;
> - void **slot;
>
> last_case = case_label_vec[j];
>
> gcc_assert (last_case);
> gcc_assert (cont_map);
>
> - slot = pointer_map_contains (cont_map, last_case);
> - gcc_assert (slot);
> - cont_stmt = *(gimple *) slot;
> + cont_stmt = *cont_map->get (last_case);
>
> x = gimple_build_label (CASE_LABEL (last_case));
> gimple_seq_add_stmt (&switch_body, x);
> @@ -1544,7 +1537,7 @@ lower_try_finally_switch (struct leh_state *state, struct leh_tf_state *tf)
> maybe_record_in_goto_queue (state, cont_stmt);
> }
> if (cont_map)
> - pointer_map_destroy (cont_map);
> + delete cont_map;
>
> replace_goto_queue (tf);
>
> @@ -1734,7 +1727,7 @@ lower_try_finally (struct leh_state *state, gimple tp)
> this_tf.dest_array.release ();
> free (this_tf.goto_queue);
> if (this_tf.goto_queue_map)
> - pointer_map_destroy (this_tf.goto_queue_map);
> + delete this_tf.goto_queue_map;
>
> /* If there was an old (aka outer) eh_seq, append the current eh_seq.
> If there was no old eh_seq, then the append is trivially already done. */
> @@ -2921,10 +2914,10 @@ maybe_clean_or_replace_eh_stmt (gimple old_stmt, gimple new_stmt)
> bool
> maybe_duplicate_eh_stmt_fn (struct function *new_fun, gimple new_stmt,
> struct function *old_fun, gimple old_stmt,
> - struct pointer_map_t *map, int default_lp_nr)
> + hash_map<void *, void *> *map,
> + int default_lp_nr)
> {
> int old_lp_nr, new_lp_nr;
> - void **slot;
>
> if (!stmt_could_throw_p (new_stmt))
> return false;
> @@ -2941,8 +2934,7 @@ maybe_duplicate_eh_stmt_fn (struct function *new_fun, gimple new_stmt,
> eh_landing_pad old_lp, new_lp;
>
> old_lp = (*old_fun->eh->lp_array)[old_lp_nr];
> - slot = pointer_map_contains (map, old_lp);
> - new_lp = (eh_landing_pad) *slot;
> + new_lp = static_cast<eh_landing_pad> (*map->get (old_lp));
> new_lp_nr = new_lp->index;
> }
> else
> @@ -2950,8 +2942,7 @@ maybe_duplicate_eh_stmt_fn (struct function *new_fun, gimple new_stmt,
> eh_region old_r, new_r;
>
> old_r = (*old_fun->eh->region_array)[-old_lp_nr];
> - slot = pointer_map_contains (map, old_r);
> - new_r = (eh_region) *slot;
> + new_r = static_cast<eh_region> (*map->get (old_r));
> new_lp_nr = -new_r->index;
> }
>
> @@ -3154,7 +3145,7 @@ make_pass_refactor_eh (gcc::context *ctxt)
> /* At the end of gimple optimization, we can lower RESX. */
>
> static bool
> -lower_resx (basic_block bb, gimple stmt, struct pointer_map_t *mnt_map)
> +lower_resx (basic_block bb, gimple stmt, hash_map<eh_region, tree> *mnt_map)
> {
> int lp_nr;
> eh_region src_r, dst_r;
> @@ -3199,14 +3190,13 @@ lower_resx (basic_block bb, gimple stmt, struct pointer_map_t *mnt_map)
> if (lp_nr < 0)
> {
> basic_block new_bb;
> - void **slot;
> tree lab;
>
> /* We are resuming into a MUST_NOT_CALL region. Expand a call to
> the failure decl into a new block, if needed. */
> gcc_assert (dst_r->type == ERT_MUST_NOT_THROW);
>
> - slot = pointer_map_contains (mnt_map, dst_r);
> + tree *slot = mnt_map->get (dst_r);
> if (slot == NULL)
> {
> gimple_stmt_iterator gsi2;
> @@ -3221,12 +3211,11 @@ lower_resx (basic_block bb, gimple stmt, struct pointer_map_t *mnt_map)
> gimple_set_location (x, dst_r->u.must_not_throw.failure_loc);
> gsi_insert_after (&gsi2, x, GSI_CONTINUE_LINKING);
>
> - slot = pointer_map_insert (mnt_map, dst_r);
> - *slot = lab;
> + mnt_map->put (dst_r, lab);
> }
> else
> {
> - lab = (tree) *slot;
> + lab = *slot;
> new_bb = label_to_block (lab);
> }
>
> @@ -3334,24 +3323,21 @@ unsigned
> pass_lower_resx::execute (function *fun)
> {
> basic_block bb;
> - struct pointer_map_t *mnt_map;
> bool dominance_invalidated = false;
> bool any_rewritten = false;
>
> - mnt_map = pointer_map_create ();
> + hash_map<eh_region, tree> mnt_map;
>
> FOR_EACH_BB_FN (bb, fun)
> {
> gimple last = last_stmt (bb);
> if (last && is_gimple_resx (last))
> {
> - dominance_invalidated |= lower_resx (bb, last, mnt_map);
> + dominance_invalidated |= lower_resx (bb, last, &mnt_map);
> any_rewritten = true;
> }
> }
>
> - pointer_map_destroy (mnt_map);
> -
> if (dominance_invalidated)
> {
> free_dominance_info (CDI_DOMINATORS);
> diff --git a/gcc/tree-eh.h b/gcc/tree-eh.h
> index cd9b40d..51c2adc 100644
> --- a/gcc/tree-eh.h
> +++ b/gcc/tree-eh.h
> @@ -20,6 +20,10 @@ along with GCC; see the file COPYING3. If not see
> #ifndef GCC_TREE_EH_H
> #define GCC_TREE_EH_H
>
> +#include "hash-map.h"
> +
> +typedef struct eh_region_d *eh_region;
> +
> extern void using_eh_for_cleanups (void);
> extern void add_stmt_to_eh_lp (gimple, int);
> extern bool remove_stmt_from_eh_lp_fn (struct function *, gimple);
> @@ -43,7 +47,7 @@ extern bool maybe_clean_eh_stmt (gimple);
> extern bool maybe_clean_or_replace_eh_stmt (gimple, gimple);
> extern bool maybe_duplicate_eh_stmt_fn (struct function *, gimple,
> struct function *, gimple,
> - struct pointer_map_t *, int);
> + hash_map<void *, void *> *, int);
> extern bool maybe_duplicate_eh_stmt (gimple, gimple);
> extern void maybe_remove_unreachable_handlers (void);
> extern bool verify_eh_edges (gimple);
> diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
> index 6af4912..e2b7990 100644
> --- a/gcc/tree-inline.c
> +++ b/gcc/tree-inline.c
> @@ -135,7 +135,7 @@ static tree declare_return_variable (copy_body_data *, tree, tree, basic_block);
> static void remap_block (tree *, copy_body_data *);
> static void copy_bind_expr (tree *, int *, copy_body_data *);
> static void declare_inline_vars (tree, tree);
> -static void remap_save_expr (tree *, void *, int *);
> +static void remap_save_expr (tree *, hash_map<tree, tree> *, int *);
> static void prepend_lexical_block (tree current_block, tree new_block);
> static tree copy_decl_to_var (tree, copy_body_data *);
> static tree copy_result_decl_to_var (tree, copy_body_data *);
> @@ -149,12 +149,12 @@ static bool delete_unreachable_blocks_update_callgraph (copy_body_data *id);
> void
> insert_decl_map (copy_body_data *id, tree key, tree value)
> {
> - *pointer_map_insert (id->decl_map, key) = value;
> + id->decl_map->put (key, value);
>
> /* Always insert an identity map as well. If we see this same new
> node again, we won't want to duplicate it a second time. */
> if (key != value)
> - *pointer_map_insert (id->decl_map, value) = value;
> + id->decl_map->put (value, value);
> }
>
> /* Insert a tree->tree mapping for ID. This is only used for
> @@ -176,9 +176,9 @@ insert_debug_decl_map (copy_body_data *id, tree key, tree value)
> gcc_assert (TREE_CODE (value) == VAR_DECL);
>
> if (!id->debug_map)
> - id->debug_map = pointer_map_create ();
> + id->debug_map = new hash_map<tree, tree>;
>
> - *pointer_map_insert (id->debug_map, key) = value;
> + id->debug_map->put (key, value);
> }
>
> /* If nonzero, we're remapping the contents of inlined debug
> @@ -197,7 +197,7 @@ remap_ssa_name (tree name, copy_body_data *id)
>
> gcc_assert (TREE_CODE (name) == SSA_NAME);
>
> - n = (tree *) pointer_map_contains (id->decl_map, name);
> + n = id->decl_map->get (name);
> if (n)
> return unshare_expr (*n);
>
> @@ -213,7 +213,7 @@ remap_ssa_name (tree name, copy_body_data *id)
> gimple_stmt_iterator gsi;
> tree val = SSA_NAME_VAR (name);
>
> - n = (tree *) pointer_map_contains (id->decl_map, val);
> + n = id->decl_map->get (val);
> if (n != NULL)
> val = *n;
> if (TREE_CODE (val) != PARM_DECL)
> @@ -342,7 +342,7 @@ remap_decl (tree decl, copy_body_data *id)
>
> /* See if we have remapped this declaration. */
>
> - n = (tree *) pointer_map_contains (id->decl_map, decl);
> + n = id->decl_map->get (decl);
>
> if (!n && processing_debug_stmt)
> {
> @@ -562,7 +562,7 @@ remap_type (tree type, copy_body_data *id)
> return type;
>
> /* See if we have remapped this type. */
> - node = (tree *) pointer_map_contains (id->decl_map, type);
> + node = id->decl_map->get (type);
> if (node)
> return *node;
>
> @@ -887,7 +887,7 @@ remap_gimple_op_r (tree *tp, int *walk_subtrees, void *data)
> {
> /* If the enclosing record type is variably_modified_type_p, the field
> has already been remapped. Otherwise, it need not be. */
> - tree *n = (tree *) pointer_map_contains (id->decl_map, *tp);
> + tree *n = id->decl_map->get (*tp);
> if (n)
> *tp = *n;
> *walk_subtrees = 0;
> @@ -981,8 +981,7 @@ remap_gimple_op_r (tree *tp, int *walk_subtrees, void *data)
> if (old_block)
> {
> tree *n;
> - n = (tree *) pointer_map_contains (id->decl_map,
> - TREE_BLOCK (*tp));
> + n = id->decl_map->get (TREE_BLOCK (*tp));
> if (n)
> new_block = *n;
> }
> @@ -1108,7 +1107,7 @@ copy_tree_body_r (tree *tp, int *walk_subtrees, void *data)
> tree decl = TREE_OPERAND (*tp, 0), value;
> tree *n;
>
> - n = (tree *) pointer_map_contains (id->decl_map, decl);
> + n = id->decl_map->get (decl);
> if (n)
> {
> value = *n;
> @@ -1125,7 +1124,7 @@ copy_tree_body_r (tree *tp, int *walk_subtrees, void *data)
> /* Get rid of *& from inline substitutions that can happen when a
> pointer argument is an ADDR_EXPR. */
> tree decl = TREE_OPERAND (*tp, 0);
> - tree *n = (tree *) pointer_map_contains (id->decl_map, decl);
> + tree *n = id->decl_map->get (decl);
> if (n)
> {
> /* If we happen to get an ADDR_EXPR in n->value, strip
> @@ -1206,8 +1205,7 @@ copy_tree_body_r (tree *tp, int *walk_subtrees, void *data)
> if (TREE_BLOCK (*tp))
> {
> tree *n;
> - n = (tree *) pointer_map_contains (id->decl_map,
> - TREE_BLOCK (*tp));
> + n = id->decl_map->get (TREE_BLOCK (*tp));
> if (n)
> new_block = *n;
> }
> @@ -1261,11 +1259,9 @@ static int
> remap_eh_region_nr (int old_nr, copy_body_data *id)
> {
> eh_region old_r, new_r;
> - void **slot;
>
> old_r = get_eh_region_from_number_fn (id->src_cfun, old_nr);
> - slot = pointer_map_contains (id->eh_map, old_r);
> - new_r = (eh_region) *slot;
> + new_r = static_cast<eh_region> (*id->eh_map->get (old_r));
>
> return new_r->index;
> }
> @@ -1483,7 +1479,7 @@ remap_gimple_stmt (gimple stmt, copy_body_data *id)
> tree decl = gimple_assign_lhs (stmt), value;
> tree *n;
>
> - n = (tree *) pointer_map_contains (id->decl_map, decl);
> + n = id->decl_map->get (decl);
> if (n)
> {
> value = *n;
> @@ -1597,7 +1593,7 @@ remap_gimple_stmt (gimple stmt, copy_body_data *id)
> if (gimple_block (copy))
> {
> tree *n;
> - n = (tree *) pointer_map_contains (id->decl_map, gimple_block (copy));
> + n = id->decl_map->get (gimple_block (copy));
> gcc_assert (n);
> gimple_set_block (copy, *n);
> }
> @@ -2191,8 +2187,7 @@ copy_phis_for_bb (basic_block bb, copy_body_data *id)
> if (LOCATION_BLOCK (locus))
> {
> tree *n;
> - n = (tree *) pointer_map_contains (id->decl_map,
> - LOCATION_BLOCK (locus));
> + n = id->decl_map->get (LOCATION_BLOCK (locus));
> gcc_assert (n);
> if (*n)
> locus = COMBINE_LOCATION_DATA (line_table, locus, *n);
> @@ -2638,7 +2633,7 @@ copy_cfg_body (copy_body_data * id, gcov_type count, int frequency_scale,
>
> if (id->eh_map)
> {
> - pointer_map_destroy (id->eh_map);
> + delete id->eh_map;
> id->eh_map = NULL;
> }
>
> @@ -2659,7 +2654,7 @@ copy_debug_stmt (gimple stmt, copy_body_data *id)
>
> if (gimple_block (stmt))
> {
> - n = (tree *) pointer_map_contains (id->decl_map, gimple_block (stmt));
> + n = id->decl_map->get (gimple_block (stmt));
> gimple_set_block (stmt, n ? *n : id->block);
> }
>
> @@ -2675,14 +2670,14 @@ copy_debug_stmt (gimple stmt, copy_body_data *id)
> t = gimple_debug_bind_get_var (stmt);
>
> if (TREE_CODE (t) == PARM_DECL && id->debug_map
> - && (n = (tree *) pointer_map_contains (id->debug_map, t)))
> + && (n = id->debug_map->get (t)))
> {
> gcc_assert (TREE_CODE (*n) == VAR_DECL);
> t = *n;
> }
> else if (TREE_CODE (t) == VAR_DECL
> && !is_global_var (t)
> - && !pointer_map_contains (id->decl_map, t))
> + && !id->decl_map->get (t))
> /* T is a non-localized variable. */;
> else
> walk_tree (&t, remap_gimple_op_r, &wi, NULL);
> @@ -3076,7 +3071,7 @@ initialize_inlined_parameters (copy_body_data *id, gimple stmt,
> parameter following the array. */
> for (p = parms, i = 0; p; p = DECL_CHAIN (p), i++)
> {
> - tree *varp = (tree *) pointer_map_contains (id->decl_map, p);
> + tree *varp = id->decl_map->get (p);
> if (varp
> && TREE_CODE (*varp) == VAR_DECL)
> {
> @@ -3089,7 +3084,7 @@ initialize_inlined_parameters (copy_body_data *id, gimple stmt,
> by the parameter setup. */
> if (def)
> {
> - tree *defp = (tree *) pointer_map_contains (id->decl_map, def);
> + tree *defp = id->decl_map->get (def);
> if (defp
> && TREE_CODE (*defp) == SSA_NAME
> && SSA_NAME_VAR (*defp) == var)
> @@ -4135,7 +4130,8 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
> {
> tree use_retvar;
> tree fn;
> - struct pointer_map_t *st, *dst;
> + hash_map<tree, tree> *dst;
> + hash_map<tree, tree> *st = NULL;
> tree return_slot;
> tree modify_dest;
> location_t saved_location;
> @@ -4291,7 +4287,7 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
> /* Local declarations will be replaced by their equivalents in this
> map. */
> st = id->decl_map;
> - id->decl_map = pointer_map_create ();
> + id->decl_map = new hash_map<tree, tree>;
> dst = id->debug_map;
> id->debug_map = NULL;
>
> @@ -4415,10 +4411,10 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
> /* Clean up. */
> if (id->debug_map)
> {
> - pointer_map_destroy (id->debug_map);
> + delete id->debug_map;
> id->debug_map = dst;
> }
> - pointer_map_destroy (id->decl_map);
> + delete id->decl_map;
> id->decl_map = st;
>
> /* Unlink the calls virtual operands before replacing it. */
> @@ -4772,14 +4768,13 @@ copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
> the function into which the copy will be placed. */
>
> static void
> -remap_save_expr (tree *tp, void *st_, int *walk_subtrees)
> +remap_save_expr (tree *tp, hash_map<tree, tree> *st, int *walk_subtrees)
> {
> - struct pointer_map_t *st = (struct pointer_map_t *) st_;
> tree *n;
> tree t;
>
> /* See if we already encountered this SAVE_EXPR. */
> - n = (tree *) pointer_map_contains (st, *tp);
> + n = st->get (*tp);
>
> /* If we didn't already remap this SAVE_EXPR, do so now. */
> if (!n)
> @@ -4787,9 +4782,9 @@ remap_save_expr (tree *tp, void *st_, int *walk_subtrees)
> t = copy_node (*tp);
>
> /* Remember this SAVE_EXPR. */
> - *pointer_map_insert (st, *tp) = t;
> + st->put (*tp, t);
> /* Make sure we don't remap an already-remapped SAVE_EXPR. */
> - *pointer_map_insert (st, t) = t;
> + st->put (t, t);
> }
> else
> {
> @@ -4836,7 +4831,7 @@ replace_locals_op (tree *tp, int *walk_subtrees, void *data)
> {
> struct walk_stmt_info *wi = (struct walk_stmt_info*) data;
> copy_body_data *id = (copy_body_data *) wi->info;
> - struct pointer_map_t *st = id->decl_map;
> + hash_map<tree, tree> *st = id->decl_map;
> tree *n;
> tree expr = *tp;
>
> @@ -4846,7 +4841,7 @@ replace_locals_op (tree *tp, int *walk_subtrees, void *data)
> || TREE_CODE (expr) == LABEL_DECL)
> {
> /* Lookup the declaration. */
> - n = (tree *) pointer_map_contains (st, expr);
> + n = st->get (expr);
>
> /* If it's there, remap it. */
> if (n)
> @@ -4928,7 +4923,7 @@ copy_gimple_seq_and_replace_locals (gimple_seq seq)
> memset (&id, 0, sizeof (id));
> id.src_fn = current_function_decl;
> id.dst_fn = current_function_decl;
> - id.decl_map = pointer_map_create ();
> + id.decl_map = new hash_map<tree, tree>;
> id.debug_map = NULL;
>
> id.copy_decl = copy_decl_no_change;
> @@ -4953,9 +4948,9 @@ copy_gimple_seq_and_replace_locals (gimple_seq seq)
> walk_gimple_seq (copy, replace_locals_stmt, replace_locals_op, &wi);
>
> /* Clean up. */
> - pointer_map_destroy (id.decl_map);
> + delete id.decl_map;
> if (id.debug_map)
> - pointer_map_destroy (id.debug_map);
> + delete id.debug_map;
>
> return copy;
> }
> @@ -5145,7 +5140,7 @@ copy_arguments_for_versioning (tree orig_parm, copy_body_data * id,
> *parg = new_tree;
> parg = &DECL_CHAIN (new_tree);
> }
> - else if (!pointer_map_contains (id->decl_map, arg))
> + else if (!id->decl_map->get (arg))
> {
> /* Make an equivalent VAR_DECL. If the argument was used
> as temporary variable later in function, the uses will be
> @@ -5368,7 +5363,7 @@ tree_function_versioning (tree old_decl, tree new_decl,
> /* Generate a new name for the new version. */
> id.statements_to_fold = new hash_set<gimple>;
>
> - id.decl_map = pointer_map_create ();
> + id.decl_map = new hash_map<tree, tree>;
> id.debug_map = NULL;
> id.src_fn = old_decl;
> id.dst_fn = new_decl;
> @@ -5530,9 +5525,9 @@ tree_function_versioning (tree old_decl, tree new_decl,
> }
>
> /* Clean up. */
> - pointer_map_destroy (id.decl_map);
> + delete id.decl_map;
> if (id.debug_map)
> - pointer_map_destroy (id.debug_map);
> + delete id.debug_map;
> free_dominance_info (CDI_DOMINATORS);
> free_dominance_info (CDI_POST_DOMINATORS);
>
> @@ -5587,22 +5582,22 @@ maybe_inline_call_in_expr (tree exp)
> /* We can only try to inline "const" functions. */
> if (fn && TREE_READONLY (fn) && DECL_SAVED_TREE (fn))
> {
> - struct pointer_map_t *decl_map = pointer_map_create ();
> call_expr_arg_iterator iter;
> copy_body_data id;
> tree param, arg, t;
> + hash_map<tree, tree> decl_map;
>
> /* Remap the parameters. */
> for (param = DECL_ARGUMENTS (fn), arg = first_call_expr_arg (exp, &iter);
> param;
> param = DECL_CHAIN (param), arg = next_call_expr_arg (&iter))
> - *pointer_map_insert (decl_map, param) = arg;
> + decl_map.put (param, arg);
>
> memset (&id, 0, sizeof (id));
> id.src_fn = fn;
> id.dst_fn = current_function_decl;
> id.src_cfun = DECL_STRUCT_FUNCTION (fn);
> - id.decl_map = decl_map;
> + id.decl_map = &decl_map;
>
> id.copy_decl = copy_decl_no_change;
> id.transform_call_graph_edges = CB_CGE_DUPLICATE;
> @@ -5620,7 +5615,6 @@ maybe_inline_call_in_expr (tree exp)
> id.eh_lp_nr = 0;
>
> t = copy_tree_body (&id);
> - pointer_map_destroy (decl_map);
>
> /* We can only return something suitable for use in a GENERIC
> expression tree. */
> @@ -5642,15 +5636,15 @@ build_duplicate_type (tree type)
> id.src_fn = current_function_decl;
> id.dst_fn = current_function_decl;
> id.src_cfun = cfun;
> - id.decl_map = pointer_map_create ();
> + id.decl_map = new hash_map<tree, tree>;
> id.debug_map = NULL;
> id.copy_decl = copy_decl_no_change;
>
> type = remap_type_1 (type, &id);
>
> - pointer_map_destroy (id.decl_map);
> + delete id.decl_map;
> if (id.debug_map)
> - pointer_map_destroy (id.debug_map);
> + delete id.debug_map;
>
> TYPE_CANONICAL (type) = type;
>
> diff --git a/gcc/tree-inline.h b/gcc/tree-inline.h
> index c13e6c7..53059da 100644
> --- a/gcc/tree-inline.h
> +++ b/gcc/tree-inline.h
> @@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. If not see
> #ifndef GCC_TREE_INLINE_H
> #define GCC_TREE_INLINE_H
>
> +#include "hash-map.h"
> #include "hash-set.h"
>
> struct cgraph_edge;
> @@ -64,7 +65,7 @@ struct copy_body_data
>
> /* The map from local declarations in the inlined function to
> equivalents in the function into which it is being inlined. */
> - struct pointer_map_t *decl_map;
> + hash_map<tree, tree> *decl_map;
>
> /* Create a new decl to replace DECL in the destination function. */
> tree (*copy_decl) (tree, struct copy_body_data *);
> @@ -81,7 +82,7 @@ struct copy_body_data
>
> /* Maps region and landing pad structures from the function being copied
> to duplicates created within the function we inline into. */
> - struct pointer_map_t *eh_map;
> + hash_map<void *, void *> *eh_map;
>
> /* We use the same mechanism do all sorts of different things. Rather
> than enumerating the different cases, we categorize the behavior
> @@ -132,7 +133,7 @@ struct copy_body_data
> equivalents in the function into which it is being inlined, where
> the originals have been mapped to a value rather than to a
> variable. */
> - struct pointer_map_t *debug_map;
> + hash_map<tree, tree> *debug_map;
>
> /* Cilk keywords currently need to replace some variables that
> ordinary nested functions do not. */
> diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c
> index 45c5cf7..7d5c039 100644
> --- a/gcc/tree-nested.c
> +++ b/gcc/tree-nested.c
> @@ -93,8 +93,8 @@ struct nesting_info
> struct nesting_info *inner;
> struct nesting_info *next;
>
> - struct pointer_map_t *field_map;
> - struct pointer_map_t *var_map;
> + hash_map<tree, tree> *field_map;
> + hash_map<tree, tree> *var_map;
> hash_set<tree *> *mem_refs;
> bitmap suppress_expansion;
>
> @@ -286,15 +286,13 @@ static tree
> lookup_field_for_decl (struct nesting_info *info, tree decl,
> enum insert_option insert)
> {
> - void **slot;
> -
> if (insert == NO_INSERT)
> {
> - slot = pointer_map_contains (info->field_map, decl);
> - return slot ? (tree) *slot : NULL_TREE;
> + tree *slot = info->field_map->get (decl);
> + return slot ? *slot : NULL_TREE;
> }
>
> - slot = pointer_map_insert (info->field_map, decl);
> + tree *slot = &info->field_map->get_or_insert (decl);
> if (!*slot)
> {
> tree field = make_node (FIELD_DECL);
> @@ -324,7 +322,7 @@ lookup_field_for_decl (struct nesting_info *info, tree decl,
> info->any_parm_remapped = true;
> }
>
> - return (tree) *slot;
> + return *slot;
> }
>
> /* Build or return the variable that holds the static chain within
> @@ -521,15 +519,13 @@ static tree
> lookup_tramp_for_decl (struct nesting_info *info, tree decl,
> enum insert_option insert)
> {
> - void **slot;
> -
> if (insert == NO_INSERT)
> {
> - slot = pointer_map_contains (info->var_map, decl);
> - return slot ? (tree) *slot : NULL_TREE;
> + tree *slot = info->var_map->get (decl);
> + return slot ? *slot : NULL_TREE;
> }
>
> - slot = pointer_map_insert (info->var_map, decl);
> + tree *slot = &info->var_map->get_or_insert (decl);
> if (!*slot)
> {
> tree field = make_node (FIELD_DECL);
> @@ -543,7 +539,7 @@ lookup_tramp_for_decl (struct nesting_info *info, tree decl,
> info->any_tramp_created = true;
> }
>
> - return (tree) *slot;
> + return *slot;
> }
>
> /* Build or return the field within the non-local frame state that holds
> @@ -730,8 +726,8 @@ static struct nesting_info *
> create_nesting_tree (struct cgraph_node *cgn)
> {
> struct nesting_info *info = XCNEW (struct nesting_info);
> - info->field_map = pointer_map_create ();
> - info->var_map = pointer_map_create ();
> + info->field_map = new hash_map<tree, tree>;
> + info->var_map = new hash_map<tree, tree>;
> info->mem_refs = new hash_set<tree *>;
> info->suppress_expansion = BITMAP_ALLOC (&nesting_info_bitmap_obstack);
> info->context = cgn->decl;
> @@ -834,12 +830,11 @@ get_nonlocal_debug_decl (struct nesting_info *info, tree decl)
> tree target_context;
> struct nesting_info *i;
> tree x, field, new_decl;
> - void **slot;
>
> - slot = pointer_map_insert (info->var_map, decl);
> + tree *slot = &info->var_map->get_or_insert (decl);
>
> if (*slot)
> - return (tree) *slot;
> + return *slot;
>
> target_context = decl_function_context (decl);
>
> @@ -1483,11 +1478,10 @@ static tree
> get_local_debug_decl (struct nesting_info *info, tree decl, tree field)
> {
> tree x, new_decl;
> - void **slot;
>
> - slot = pointer_map_insert (info->var_map, decl);
> + tree *slot = &info->var_map->get_or_insert (decl);
> if (*slot)
> - return (tree) *slot;
> + return *slot;
>
> /* Make sure frame_decl gets created. */
> (void) get_frame_type (info);
> @@ -2064,7 +2058,6 @@ convert_nl_goto_reference (gimple_stmt_iterator *gsi, bool *handled_ops_p,
> {
> struct nesting_info *const info = (struct nesting_info *) wi->info, *i;
> tree label, new_label, target_context, x, field;
> - void **slot;
> gimple call;
> gimple stmt = gsi_stmt (*gsi);
>
> @@ -2098,7 +2091,7 @@ convert_nl_goto_reference (gimple_stmt_iterator *gsi, bool *handled_ops_p,
> (hairy target-specific) non-local goto receiver code to be generated
> when we expand rtl. Enter this association into var_map so that we
> can insert the new label into the IL during a second pass. */
> - slot = pointer_map_insert (i->var_map, label);
> + tree *slot = &i->var_map->get_or_insert (label);
> if (*slot == NULL)
> {
> new_label = create_artificial_label (UNKNOWN_LOCATION);
> @@ -2106,7 +2099,7 @@ convert_nl_goto_reference (gimple_stmt_iterator *gsi, bool *handled_ops_p,
> *slot = new_label;
> }
> else
> - new_label = (tree) *slot;
> + new_label = *slot;
>
> /* Build: __builtin_nl_goto(new_label, &chain->nl_goto_field). */
> field = get_nl_goto_field (i);
> @@ -2136,7 +2129,6 @@ convert_nl_goto_receiver (gimple_stmt_iterator *gsi, bool *handled_ops_p,
> struct nesting_info *const info = (struct nesting_info *) wi->info;
> tree label, new_label;
> gimple_stmt_iterator tmp_gsi;
> - void **slot;
> gimple stmt = gsi_stmt (*gsi);
>
> if (gimple_code (stmt) != GIMPLE_LABEL)
> @@ -2147,7 +2139,7 @@ convert_nl_goto_receiver (gimple_stmt_iterator *gsi, bool *handled_ops_p,
>
> label = gimple_label_label (stmt);
>
> - slot = pointer_map_contains (info->var_map, label);
> + tree *slot = info->var_map->get (label);
> if (!slot)
> {
> *handled_ops_p = false;
> @@ -2513,7 +2505,7 @@ static tree
> nesting_copy_decl (tree decl, copy_body_data *id)
> {
> struct nesting_copy_body_data *nid = (struct nesting_copy_body_data *) id;
> - void **slot = pointer_map_contains (nid->root->var_map, decl);
> + tree *slot = nid->root->var_map->get (decl);
>
> if (slot)
> return (tree) *slot;
> @@ -2542,15 +2534,14 @@ contains_remapped_vars (tree *tp, int *walk_subtrees, void *data)
> {
> struct nesting_info *root = (struct nesting_info *) data;
> tree t = *tp;
> - void **slot;
>
> if (DECL_P (t))
> {
> *walk_subtrees = 0;
> - slot = pointer_map_contains (root->var_map, t);
> + tree *slot = root->var_map->get (t);
>
> if (slot)
> - return (tree) *slot;
> + return *slot;
> }
> return NULL;
> }
> @@ -2580,7 +2571,7 @@ remap_vla_decls (tree block, struct nesting_info *root)
> && variably_modified_type_p (type, NULL)))
> continue;
>
> - if (pointer_map_contains (root->var_map, TREE_OPERAND (val, 0))
> + if (root->var_map->get (TREE_OPERAND (val, 0))
> || walk_tree (&type, contains_remapped_vars, root, NULL))
> break;
> }
> @@ -2590,7 +2581,7 @@ remap_vla_decls (tree block, struct nesting_info *root)
>
> memset (&id, 0, sizeof (id));
> id.cb.copy_decl = nesting_copy_decl;
> - id.cb.decl_map = pointer_map_create ();
> + id.cb.decl_map = new hash_map<tree, tree>;
> id.root = root;
>
> for (; var; var = DECL_CHAIN (var))
> @@ -2598,7 +2589,6 @@ remap_vla_decls (tree block, struct nesting_info *root)
> {
> struct nesting_info *i;
> tree newt, context;
> - void **slot;
>
> val = DECL_VALUE_EXPR (var);
> type = TREE_TYPE (var);
> @@ -2608,7 +2598,7 @@ remap_vla_decls (tree block, struct nesting_info *root)
> && variably_modified_type_p (type, NULL)))
> continue;
>
> - slot = pointer_map_contains (root->var_map, TREE_OPERAND (val, 0));
> + tree *slot = root->var_map->get (TREE_OPERAND (val, 0));
> if (!slot && !walk_tree (&type, contains_remapped_vars, root, NULL))
> continue;
>
> @@ -2651,7 +2641,7 @@ remap_vla_decls (tree block, struct nesting_info *root)
> SET_DECL_VALUE_EXPR (var, val);
> }
>
> - pointer_map_destroy (id.cb.decl_map);
> + delete id.cb.decl_map;
> }
>
> /* Fold the MEM_REF *E. */
> @@ -2830,7 +2820,7 @@ finalize_nesting_tree_1 (struct nesting_info *root)
>
> memset (&id, 0, sizeof (id));
> id.cb.copy_decl = nesting_copy_decl;
> - id.cb.decl_map = pointer_map_create ();
> + id.cb.decl_map = new hash_map<tree, tree>;
> id.root = root;
>
> for (; debug_var; debug_var = DECL_CHAIN (debug_var))
> @@ -2865,7 +2855,7 @@ finalize_nesting_tree_1 (struct nesting_info *root)
> TYPE_NAME (newt) = remap_decl (TYPE_NAME (newt), &id.cb);
> }
>
> - pointer_map_destroy (id.cb.decl_map);
> + delete id.cb.decl_map;
> }
>
> scope = gimple_seq_first_stmt (gimple_body (root->context));
> @@ -2931,8 +2921,8 @@ free_nesting_tree (struct nesting_info *root)
> do
> {
> next = iter_nestinfo_next (node);
> - pointer_map_destroy (node->var_map);
> - pointer_map_destroy (node->field_map);
> + delete node->var_map;
> + delete node->field_map;
> delete node->mem_refs;
> free (node);
> node = next;
> diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
> index f9d39ac..2231314 100644
> --- a/gcc/tree-sra.c
> +++ b/gcc/tree-sra.c
> @@ -74,11 +74,11 @@ along with GCC; see the file COPYING3. If not see
> #include "config.h"
> #include "system.h"
> #include "coretypes.h"
> +#include "hash-map.h"
> #include "hash-table.h"
> #include "alloc-pool.h"
> #include "tm.h"
> #include "tree.h"
> -#include "pointer-set.h"
> #include "basic-block.h"
> #include "tree-ssa-alias.h"
> #include "internal-fn.h"
> @@ -290,7 +290,7 @@ struct assign_link
> static alloc_pool link_pool;
>
> /* Base (tree) -> Vector (vec<access_p> *) map. */
> -static struct pointer_map_t *base_access_vec;
> +static hash_map<tree, auto_vec<access_p> > *base_access_vec;
>
> /* Candidate hash table helpers. */
>
> @@ -518,13 +518,7 @@ access_has_replacements_p (struct access *acc)
> static vec<access_p> *
> get_base_access_vector (tree base)
> {
> - void **slot;
> -
> - slot = pointer_map_contains (base_access_vec, base);
> - if (!slot)
> - return NULL;
> - else
> - return *(vec<access_p> **) slot;
> + return base_access_vec->get (base);
> }
>
> /* Find an access with required OFFSET and SIZE in a subtree of accesses rooted
> @@ -667,24 +661,13 @@ sra_initialize (void)
> gcc_obstack_init (&name_obstack);
> access_pool = create_alloc_pool ("SRA accesses", sizeof (struct access), 16);
> link_pool = create_alloc_pool ("SRA links", sizeof (struct assign_link), 16);
> - base_access_vec = pointer_map_create ();
> + base_access_vec = new hash_map<tree, auto_vec<access_p> >;
> memset (&sra_stats, 0, sizeof (sra_stats));
> encountered_apply_args = false;
> encountered_recursive_call = false;
> encountered_unchangable_recursive_call = false;
> }
>
> -/* Hook fed to pointer_map_traverse, deallocate stored vectors. */
> -
> -static bool
> -delete_base_accesses (const void *key ATTRIBUTE_UNUSED, void **value,
> - void *data ATTRIBUTE_UNUSED)
> -{
> - vec<access_p> *access_vec = (vec<access_p> *) *value;
> - vec_free (access_vec);
> - return true;
> -}
> -
> /* Deallocate all general structures. */
>
> static void
> @@ -699,8 +682,7 @@ sra_deinitialize (void)
> free_alloc_pool (link_pool);
> obstack_free (&name_obstack, NULL);
>
> - pointer_map_traverse (base_access_vec, delete_base_accesses, NULL);
> - pointer_map_destroy (base_access_vec);
> + delete base_access_vec;
> }
>
> /* Remove DECL from candidates for SRA and write REASON to the dump file if
> @@ -849,9 +831,7 @@ mark_parm_dereference (tree base, HOST_WIDE_INT dist, gimple stmt)
> static struct access *
> create_access_1 (tree base, HOST_WIDE_INT offset, HOST_WIDE_INT size)
> {
> - vec<access_p> *v;
> struct access *access;
> - void **slot;
>
> access = (struct access *) pool_alloc (access_pool);
> memset (access, 0, sizeof (struct access));
> @@ -859,16 +839,7 @@ create_access_1 (tree base, HOST_WIDE_INT offset, HOST_WIDE_INT size)
> access->offset = offset;
> access->size = size;
>
> - slot = pointer_map_contains (base_access_vec, base);
> - if (slot)
> - v = (vec<access_p> *) *slot;
> - else
> - vec_alloc (v, 32);
> -
> - v->safe_push (access);
> -
> - *((vec<access_p> **)
> - pointer_map_insert (base_access_vec, base)) = v;
> + base_access_vec->get_or_insert (base).safe_push (access);
>
> return access;
> }
> diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
> index c614978..0cbb3ae 100644
> --- a/gcc/tree-ssa-loop-im.c
> +++ b/gcc/tree-ssa-loop-im.c
> @@ -26,6 +26,7 @@ along with GCC; see the file COPYING3. If not see
> #include "basic-block.h"
> #include "gimple-pretty-print.h"
> #include "pointer-set.h"
> +#include "hash-map.h"
> #include "hash-table.h"
> #include "tree-ssa-alias.h"
> #include "internal-fn.h"
> @@ -103,7 +104,7 @@ struct lim_aux_data
>
> /* Maps statements to their lim_aux_data. */
>
> -static struct pointer_map_t *lim_aux_data_map;
> +static hash_map<gimple, lim_aux_data *> *lim_aux_data_map;
>
> /* Description of a memory reference location. */
>
> @@ -225,20 +226,20 @@ static bool ref_indep_loop_p (struct loop *, mem_ref_p);
> static struct lim_aux_data *
> init_lim_data (gimple stmt)
> {
> - void **p = pointer_map_insert (lim_aux_data_map, stmt);
> + lim_aux_data *p = XCNEW (struct lim_aux_data);
> + lim_aux_data_map->put (stmt, p);
>
> - *p = XCNEW (struct lim_aux_data);
> - return (struct lim_aux_data *) *p;
> + return p;
> }
>
> static struct lim_aux_data *
> get_lim_data (gimple stmt)
> {
> - void **p = pointer_map_contains (lim_aux_data_map, stmt);
> + lim_aux_data **p = lim_aux_data_map->get (stmt);
> if (!p)
> return NULL;
>
> - return (struct lim_aux_data *) *p;
> + return *p;
> }
>
> /* Releases the memory occupied by DATA. */
> @@ -253,11 +254,11 @@ free_lim_aux_data (struct lim_aux_data *data)
> static void
> clear_lim_data (gimple stmt)
> {
> - void **p = pointer_map_contains (lim_aux_data_map, stmt);
> + lim_aux_data **p = lim_aux_data_map->get (stmt);
> if (!p)
> return;
>
> - free_lim_aux_data ((struct lim_aux_data *) *p);
> + free_lim_aux_data (*p);
> *p = NULL;
> }
>
> @@ -2429,7 +2430,7 @@ tree_ssa_lim_initialize (void)
>
> bitmap_obstack_initialize (&lim_bitmap_obstack);
> gcc_obstack_init (&mem_ref_obstack);
> - lim_aux_data_map = pointer_map_create ();
> + lim_aux_data_map = new hash_map<gimple, lim_aux_data *>;
>
> if (flag_tm)
> compute_transaction_bits ();
> @@ -2484,7 +2485,7 @@ tree_ssa_lim_finalize (void)
> SET_ALWAYS_EXECUTED_IN (bb, NULL);
>
> bitmap_obstack_release (&lim_bitmap_obstack);
> - pointer_map_destroy (lim_aux_data_map);
> + delete lim_aux_data_map;
>
> delete memory_accesses.refs;
> memory_accesses.refs = NULL;
> diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
> index 3b4a6cd..158a081 100644
> --- a/gcc/tree-ssa-loop-ivopts.c
> +++ b/gcc/tree-ssa-loop-ivopts.c
> @@ -70,7 +70,7 @@ along with GCC; see the file COPYING3. If not see
> #include "tm_p.h"
> #include "basic-block.h"
> #include "gimple-pretty-print.h"
> -#include "pointer-set.h"
> +#include "hash-map.h"
> #include "hash-table.h"
> #include "tree-ssa-alias.h"
> #include "internal-fn.h"
> @@ -293,7 +293,7 @@ struct ivopts_data
> struct loop *current_loop;
>
> /* Numbers of iterations for all exits of the current loop. */
> - struct pointer_map_t *niters;
> + hash_map<edge, tree_niter_desc *> *niters;
>
> /* Number of registers used in it. */
> unsigned regs_used;
> @@ -814,15 +814,15 @@ static struct tree_niter_desc *
> niter_for_exit (struct ivopts_data *data, edge exit)
> {
> struct tree_niter_desc *desc;
> - void **slot;
> + tree_niter_desc **slot;
>
> if (!data->niters)
> {
> - data->niters = pointer_map_create ();
> + data->niters = new hash_map<edge, tree_niter_desc *>;
> slot = NULL;
> }
> else
> - slot = pointer_map_contains (data->niters, exit);
> + slot = data->niters->get (exit);
>
> if (!slot)
> {
> @@ -837,11 +837,10 @@ niter_for_exit (struct ivopts_data *data, edge exit)
> XDELETE (desc);
> desc = NULL;
> }
> - slot = pointer_map_insert (data->niters, exit);
> - *slot = desc;
> + data->niters->put (exit, desc);
> }
> else
> - desc = (struct tree_niter_desc *) *slot;
> + desc = *slot;
>
> return desc;
> }
> @@ -6704,15 +6703,12 @@ remove_unused_ivs (struct ivopts_data *data)
> }
>
> /* Frees memory occupied by struct tree_niter_desc in *VALUE. Callback
> - for pointer_map_traverse. */
> + for hash_map::traverse. */
>
> -static bool
> -free_tree_niter_desc (const void *key ATTRIBUTE_UNUSED, void **value,
> - void *data ATTRIBUTE_UNUSED)
> +bool
> +free_tree_niter_desc (edge const &, tree_niter_desc *const &value, void *)
> {
> - struct tree_niter_desc *const niter = (struct tree_niter_desc *) *value;
> -
> - free (niter);
> + free (value);
> return true;
> }
>
> @@ -6727,8 +6723,8 @@ free_loop_data (struct ivopts_data *data)
>
> if (data->niters)
> {
> - pointer_map_traverse (data->niters, free_tree_niter_desc, NULL);
> - pointer_map_destroy (data->niters);
> + data->niters->traverse<void *, free_tree_niter_desc> (NULL);
> + delete data->niters;
> data->niters = NULL;
> }
>
> diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
> index f9bd9a4..2e8337c 100644
> --- a/gcc/tree-ssa-reassoc.c
> +++ b/gcc/tree-ssa-reassoc.c
> @@ -30,7 +30,7 @@ along with GCC; see the file COPYING3. If not see
> #include "basic-block.h"
> #include "gimple-pretty-print.h"
> #include "tree-inline.h"
> -#include "pointer-set.h"
> +#include "hash-map.h"
> #include "tree-ssa-alias.h"
> #include "internal-fn.h"
> #include "gimple-fold.h"
> @@ -216,7 +216,7 @@ static int next_operand_entry_id;
> static long *bb_rank;
>
> /* Operand->rank hashtable. */
> -static struct pointer_map_t *operand_rank;
> +static hash_map<tree, long> *operand_rank;
>
> /* Forward decls. */
> static long get_rank (tree);
> @@ -362,8 +362,8 @@ propagate_rank (long rank, tree op)
> static inline long
> find_operand_rank (tree e)
> {
> - void **slot = pointer_map_contains (operand_rank, e);
> - return slot ? (long) (intptr_t) *slot : -1;
> + long *slot = operand_rank->get (e);
> + return slot ? *slot : -1;
> }
>
> /* Insert {E,RANK} into the operand rank hashtable. */
> @@ -371,11 +371,8 @@ find_operand_rank (tree e)
> static inline void
> insert_operand_rank (tree e, long rank)
> {
> - void **slot;
> gcc_assert (rank > 0);
> - slot = pointer_map_insert (operand_rank, e);
> - gcc_assert (!*slot);
> - *slot = (void *) (intptr_t) rank;
> + gcc_assert (!operand_rank->put (e, rank));
> }
>
> /* Given an expression E, return the rank of the expression. */
> @@ -4635,7 +4632,7 @@ init_reassoc (void)
> deeper loops come later. */
> pre_and_rev_post_order_compute (NULL, bbs, false);
> bb_rank = XCNEWVEC (long, last_basic_block_for_fn (cfun));
> - operand_rank = pointer_map_create ();
> + operand_rank = new hash_map<tree, long>;
>
> /* Give each default definition a distinct rank. This includes
> parameters and the static chain. Walk backwards over all
> @@ -4676,7 +4673,7 @@ fini_reassoc (void)
> statistics_counter_event (cfun, "Built-in powi calls created",
> reassociate_stats.pows_created);
>
> - pointer_map_destroy (operand_rank);
> + delete operand_rank;
> free_alloc_pool (operand_entry_pool);
> free (bb_rank);
> plus_negates.release ();
> diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
> index 1879fc0..08e384b 100644
> --- a/gcc/tree-ssa-structalias.c
> +++ b/gcc/tree-ssa-structalias.c
> @@ -319,7 +319,7 @@ static inline bool type_can_have_subvars (const_tree);
> static alloc_pool variable_info_pool;
>
> /* Map varinfo to final pt_solution. */
> -static pointer_map_t *final_solutions;
> +static hash_map<varinfo_t, pt_solution *> *final_solutions;
> struct obstack final_solutions_obstack;
>
> /* Table of variable info structures for constraint variables.
> @@ -393,19 +393,19 @@ new_var_info (tree t, const char *name)
>
> /* A map mapping call statements to per-stmt variables for uses
> and clobbers specific to the call. */
> -static struct pointer_map_t *call_stmt_vars;
> +static hash_map<gimple, varinfo_t> *call_stmt_vars;
>
> /* Lookup or create the variable for the call statement CALL. */
>
> static varinfo_t
> get_call_vi (gimple call)
> {
> - void **slot_p;
> varinfo_t vi, vi2;
>
> - slot_p = pointer_map_insert (call_stmt_vars, call);
> - if (*slot_p)
> - return (varinfo_t) *slot_p;
> + bool existed;
> + varinfo_t *slot_p = &call_stmt_vars->get_or_insert (call, &existed);
> + if (existed)
> + return *slot_p;
>
> vi = new_var_info (NULL_TREE, "CALLUSED");
> vi->offset = 0;
> @@ -421,7 +421,7 @@ get_call_vi (gimple call)
>
> vi->next = vi2->id;
>
> - *slot_p = (void *) vi;
> + *slot_p = vi;
> return vi;
> }
>
> @@ -431,11 +431,9 @@ get_call_vi (gimple call)
> static varinfo_t
> lookup_call_use_vi (gimple call)
> {
> - void **slot_p;
> -
> - slot_p = pointer_map_contains (call_stmt_vars, call);
> + varinfo_t *slot_p = call_stmt_vars->get (call);
> if (slot_p)
> - return (varinfo_t) *slot_p;
> + return *slot_p;
>
> return NULL;
> }
> @@ -2794,7 +2792,7 @@ solve_graph (constraint_graph_t graph)
> }
>
> /* Map from trees to variable infos. */
> -static struct pointer_map_t *vi_for_tree;
> +static hash_map<tree, varinfo_t> *vi_for_tree;
>
>
> /* Insert ID as the variable id for tree T in the vi_for_tree map. */
> @@ -2802,10 +2800,8 @@ static struct pointer_map_t *vi_for_tree;
> static void
> insert_vi_for_tree (tree t, varinfo_t vi)
> {
> - void **slot = pointer_map_insert (vi_for_tree, t);
> gcc_assert (vi);
> - gcc_assert (*slot == NULL);
> - *slot = vi;
> + gcc_assert (!vi_for_tree->put (t, vi));
> }
>
> /* Find the variable info for tree T in VI_FOR_TREE. If T does not
> @@ -2814,11 +2810,11 @@ insert_vi_for_tree (tree t, varinfo_t vi)
> static varinfo_t
> lookup_vi_for_tree (tree t)
> {
> - void **slot = pointer_map_contains (vi_for_tree, t);
> + varinfo_t *slot = vi_for_tree->get (t);
> if (slot == NULL)
> return NULL;
>
> - return (varinfo_t) *slot;
> + return *slot;
> }
>
> /* Return a printable name for DECL */
> @@ -2876,11 +2872,11 @@ alias_get_name (tree decl)
> static varinfo_t
> get_vi_for_tree (tree t)
> {
> - void **slot = pointer_map_contains (vi_for_tree, t);
> + varinfo_t *slot = vi_for_tree->get (t);
> if (slot == NULL)
> return get_varinfo (create_variable_info_for (t, alias_get_name (t)));
>
> - return (varinfo_t) *slot;
> + return *slot;
> }
>
> /* Get a scalar constraint expression for a new temporary variable. */
> @@ -6075,7 +6071,6 @@ find_what_var_points_to (varinfo_t orig_vi)
> bitmap finished_solution;
> bitmap result;
> varinfo_t vi;
> - void **slot;
> struct pt_solution *pt;
>
> /* This variable may have been collapsed, let's get the real
> @@ -6083,9 +6078,9 @@ find_what_var_points_to (varinfo_t orig_vi)
> vi = get_varinfo (find (orig_vi->id));
>
> /* See if we have already computed the solution and return it. */
> - slot = pointer_map_insert (final_solutions, vi);
> + pt_solution **slot = &final_solutions->get_or_insert (vi);
> if (*slot != NULL)
> - return *(struct pt_solution *)*slot;
> + return **slot;
>
> *slot = pt = XOBNEW (&final_solutions_obstack, struct pt_solution);
> memset (pt, 0, sizeof (struct pt_solution));
> @@ -6685,8 +6680,8 @@ init_alias_vars (void)
> sizeof (struct variable_info), 30);
> constraints.create (8);
> varmap.create (8);
> - vi_for_tree = pointer_map_create ();
> - call_stmt_vars = pointer_map_create ();
> + vi_for_tree = new hash_map<tree, varinfo_t>;
> + call_stmt_vars = new hash_map<gimple, varinfo_t>;
>
> memset (&stats, 0, sizeof (stats));
> shared_bitmap_table = new hash_table<shared_bitmap_hasher> (511);
> @@ -6694,7 +6689,7 @@ init_alias_vars (void)
>
> gcc_obstack_init (&fake_var_decl_obstack);
>
> - final_solutions = pointer_map_create ();
> + final_solutions = new hash_map<varinfo_t, pt_solution *>;
> gcc_obstack_init (&final_solutions_obstack);
> }
>
> @@ -6943,8 +6938,8 @@ delete_points_to_sets (void)
> fprintf (dump_file, "Points to sets created:%d\n",
> stats.points_to_sets_created);
>
> - pointer_map_destroy (vi_for_tree);
> - pointer_map_destroy (call_stmt_vars);
> + delete vi_for_tree;
> + delete call_stmt_vars;
> bitmap_obstack_release (&pta_obstack);
> constraints.release ();
>
> @@ -6965,7 +6960,7 @@ delete_points_to_sets (void)
>
> obstack_free (&fake_var_decl_obstack, NULL);
>
> - pointer_map_destroy (final_solutions);
> + delete final_solutions;
> obstack_free (&final_solutions_obstack, NULL);
> }
>
> diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
> index 73a4d1c..217b9fc 100644
> --- a/gcc/tree-ssa.c
> +++ b/gcc/tree-ssa.c
> @@ -49,6 +49,7 @@ along with GCC; see the file COPYING3. If not see
> #include "tree-into-ssa.h"
> #include "tree-ssa.h"
> #include "tree-inline.h"
> +#include "hash-map.h"
> #include "hashtab.h"
> #include "tree-pass.h"
> #include "diagnostic-core.h"
> @@ -56,7 +57,7 @@ along with GCC; see the file COPYING3. If not see
> #include "cfgexpand.h"
>
> /* Pointer map of variable mappings, keyed by edge. */
> -static struct pointer_map_t *edge_var_maps;
> +static hash_map<edge, auto_vec<edge_var_map> > *edge_var_maps;
>
>
> /* Add a mapping with PHI RESULT and PHI DEF associated with edge E. */
> @@ -64,23 +65,17 @@ static struct pointer_map_t *edge_var_maps;
> void
> redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus)
> {
> - void **slot;
> - edge_var_map_vector *head;
> edge_var_map new_node;
>
> if (edge_var_maps == NULL)
> - edge_var_maps = pointer_map_create ();
> + edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >;
>
> - slot = pointer_map_insert (edge_var_maps, e);
> - head = (edge_var_map_vector *) *slot;
> - if (!head)
> - vec_safe_reserve (head, 5);
> + auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e);
> new_node.def = def;
> new_node.result = result;
> new_node.locus = locus;
>
> - vec_safe_push (head, new_node);
> - *slot = head;
> + slot.safe_push (new_node);
> }
>
>
> @@ -89,82 +84,51 @@ redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus)
> void
> redirect_edge_var_map_clear (edge e)
> {
> - void **slot;
> - edge_var_map_vector *head;
> -
> if (!edge_var_maps)
> return;
>
> - slot = pointer_map_contains (edge_var_maps, e);
> + auto_vec<edge_var_map> *head = edge_var_maps->get (e);
>
> - if (slot)
> - {
> - head = (edge_var_map_vector *) *slot;
> - vec_free (head);
> - *slot = NULL;
> - }
> + if (head)
> + head->release ();
> }
>
>
> /* Duplicate the redirected var mappings in OLDE in NEWE.
>
> - Since we can't remove a mapping, let's just duplicate it. This assumes a
> - pointer_map can have multiple edges mapping to the same var_map (many to
> - one mapping), since we don't remove the previous mappings. */
> + This assumes a hash_map can have multiple edges mapping to the same
> + var_map (many to one mapping), since we don't remove the previous mappings.
> + */
>
> void
> redirect_edge_var_map_dup (edge newe, edge olde)
> {
> - void **new_slot, **old_slot;
> - edge_var_map_vector *head;
> -
> if (!edge_var_maps)
> return;
>
> - new_slot = pointer_map_insert (edge_var_maps, newe);
> - old_slot = pointer_map_contains (edge_var_maps, olde);
> - if (!old_slot)
> + auto_vec<edge_var_map> *head = edge_var_maps->get (olde);
> + if (!head)
> return;
> - head = (edge_var_map_vector *) *old_slot;
>
> - edge_var_map_vector *new_head = NULL;
> - if (head)
> - new_head = vec_safe_copy (head);
> - else
> - vec_safe_reserve (new_head, 5);
> - *new_slot = new_head;
> + edge_var_maps->get_or_insert (newe).safe_splice (*head);
> }
>
>
> /* Return the variable mappings for a given edge. If there is none, return
> NULL. */
>
> -edge_var_map_vector *
> +vec<edge_var_map> *
> redirect_edge_var_map_vector (edge e)
> {
> - void **slot;
> -
> /* Hey, what kind of idiot would... you'd be surprised. */
> if (!edge_var_maps)
> return NULL;
>
> - slot = pointer_map_contains (edge_var_maps, e);
> + auto_vec<edge_var_map> *slot = edge_var_maps->get (e);
> if (!slot)
> return NULL;
>
> - return (edge_var_map_vector *) *slot;
> -}
> -
> -/* Used by redirect_edge_var_map_destroy to free all memory. */
> -
> -static bool
> -free_var_map_entry (const void *key ATTRIBUTE_UNUSED,
> - void **value,
> - void *data ATTRIBUTE_UNUSED)
> -{
> - edge_var_map_vector *head = (edge_var_map_vector *) *value;
> - vec_free (head);
> - return true;
> + return slot;
> }
>
> /* Clear the edge variable mappings. */
> @@ -172,12 +136,8 @@ free_var_map_entry (const void *key ATTRIBUTE_UNUSED,
> void
> redirect_edge_var_map_destroy (void)
> {
> - if (edge_var_maps)
> - {
> - pointer_map_traverse (edge_var_maps, free_var_map_entry, NULL);
> - pointer_map_destroy (edge_var_maps);
> - edge_var_maps = NULL;
> - }
> + delete edge_var_maps;
> + edge_var_maps = NULL;
> }
>
>
> @@ -223,12 +183,11 @@ void
> flush_pending_stmts (edge e)
> {
> gimple phi;
> - edge_var_map_vector *v;
> edge_var_map *vm;
> int i;
> gimple_stmt_iterator gsi;
>
> - v = redirect_edge_var_map_vector (e);
> + vec<edge_var_map> *v = redirect_edge_var_map_vector (e);
> if (!v)
> return;
>
> diff --git a/gcc/tree-ssa.h b/gcc/tree-ssa.h
> index c866206..835686c 100644
> --- a/gcc/tree-ssa.h
> +++ b/gcc/tree-ssa.h
> @@ -35,7 +35,7 @@ typedef vec<edge_var_map, va_heap, vl_embed> edge_var_map_vector;
> extern void redirect_edge_var_map_add (edge, tree, tree, source_location);
> extern void redirect_edge_var_map_clear (edge);
> extern void redirect_edge_var_map_dup (edge, edge);
> -extern edge_var_map_vector *redirect_edge_var_map_vector (edge);
> +extern vec<edge_var_map> *redirect_edge_var_map_vector (edge);
> extern void redirect_edge_var_map_destroy (void);
> extern edge ssa_redirect_edge (edge, basic_block);
> extern void flush_pending_stmts (edge);
> diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
> index 00810b9..3b72fce 100644
> --- a/gcc/var-tracking.c
> +++ b/gcc/var-tracking.c
> @@ -94,6 +94,7 @@
> #include "varasm.h"
> #include "stor-layout.h"
> #include "pointer-set.h"
> +#include "hash-map.h"
> #include "hash-table.h"
> #include "basic-block.h"
> #include "tm_p.h"
> @@ -2019,12 +2020,12 @@ vt_get_canonicalize_base (rtx loc)
>
> /* This caches canonicalized addresses for VALUEs, computed using
> information in the global cselib table. */
> -static struct pointer_map_t *global_get_addr_cache;
> +static hash_map<rtx, rtx> *global_get_addr_cache;
>
> /* This caches canonicalized addresses for VALUEs, computed using
> information from the global cache and information pertaining to a
> basic block being analyzed. */
> -static struct pointer_map_t *local_get_addr_cache;
> +static hash_map<rtx, rtx> *local_get_addr_cache;
>
> static rtx vt_canonicalize_addr (dataflow_set *, rtx);
>
> @@ -2036,13 +2037,13 @@ static rtx
> get_addr_from_global_cache (rtx const loc)
> {
> rtx x;
> - void **slot;
>
> gcc_checking_assert (GET_CODE (loc) == VALUE);
>
> - slot = pointer_map_insert (global_get_addr_cache, loc);
> - if (*slot)
> - return (rtx)*slot;
> + bool existed;
> + rtx *slot = &global_get_addr_cache->get_or_insert (loc, &existed);
> + if (existed)
> + return *slot;
>
> x = canon_rtx (get_addr (loc));
>
> @@ -2056,8 +2057,7 @@ get_addr_from_global_cache (rtx const loc)
> {
> /* The table may have moved during recursion, recompute
> SLOT. */
> - slot = pointer_map_contains (global_get_addr_cache, loc);
> - *slot = x = nx;
> + *global_get_addr_cache->get (loc) = x = nx;
> }
> }
>
> @@ -2072,16 +2072,16 @@ static rtx
> get_addr_from_local_cache (dataflow_set *set, rtx const loc)
> {
> rtx x;
> - void **slot;
> decl_or_value dv;
> variable var;
> location_chain l;
>
> gcc_checking_assert (GET_CODE (loc) == VALUE);
>
> - slot = pointer_map_insert (local_get_addr_cache, loc);
> - if (*slot)
> - return (rtx)*slot;
> + bool existed;
> + rtx *slot = &local_get_addr_cache->get_or_insert (loc, &existed);
> + if (existed)
> + return *slot;
>
> x = get_addr_from_global_cache (loc);
>
> @@ -2095,7 +2095,7 @@ get_addr_from_local_cache (dataflow_set *set, rtx const loc)
> rtx nx = vt_canonicalize_addr (set, x);
> if (nx != x)
> {
> - slot = pointer_map_contains (local_get_addr_cache, loc);
> + slot = local_get_addr_cache->get (loc);
> *slot = x = nx;
> }
> return x;
> @@ -2116,7 +2116,7 @@ get_addr_from_local_cache (dataflow_set *set, rtx const loc)
> rtx nx = vt_canonicalize_addr (set, l->loc);
> if (x != nx)
> {
> - slot = pointer_map_contains (local_get_addr_cache, loc);
> + slot = local_get_addr_cache->get (loc);
> *slot = x = nx;
> }
> break;
> @@ -2503,11 +2503,10 @@ val_store (dataflow_set *set, rtx val, rtx loc, rtx insn, bool modified)
>
> /* Clear (canonical address) slots that reference X. */
>
> -static bool
> -local_get_addr_clear_given_value (const void *v ATTRIBUTE_UNUSED,
> - void **slot, void *x)
> +bool
> +local_get_addr_clear_given_value (rtx const &, rtx *slot, rtx x)
> {
> - if (vt_get_canonicalize_base ((rtx)*slot) == x)
> + if (vt_get_canonicalize_base (*slot) == x)
> *slot = NULL;
> return true;
> }
> @@ -2530,11 +2529,10 @@ val_reset (dataflow_set *set, decl_or_value dv)
> if (var->onepart == ONEPART_VALUE)
> {
> rtx x = dv_as_value (dv);
> - void **slot;
>
> /* Relationships in the global cache don't change, so reset the
> local cache entry only. */
> - slot = pointer_map_contains (local_get_addr_cache, x);
> + rtx *slot = local_get_addr_cache->get (x);
> if (slot)
> {
> /* If the value resolved back to itself, odds are that other
> @@ -2543,8 +2541,8 @@ val_reset (dataflow_set *set, decl_or_value dv)
> old X but resolved to something else remain ok as long as
> that something else isn't also reset. */
> if (*slot == x)
> - pointer_map_traverse (local_get_addr_cache,
> - local_get_addr_clear_given_value, x);
> + local_get_addr_cache
> + ->traverse<rtx, local_get_addr_clear_given_value> (x);
> *slot = NULL;
> }
> }
> @@ -6660,7 +6658,7 @@ compute_bb_dataflow (basic_block bb)
> dataflow_set_copy (out, in);
>
> if (MAY_HAVE_DEBUG_INSNS)
> - local_get_addr_cache = pointer_map_create ();
> + local_get_addr_cache = new hash_map<rtx, rtx>;
>
> FOR_EACH_VEC_ELT (VTI (bb)->mos, i, mo)
> {
> @@ -6943,7 +6941,7 @@ compute_bb_dataflow (basic_block bb)
>
> if (MAY_HAVE_DEBUG_INSNS)
> {
> - pointer_map_destroy (local_get_addr_cache);
> + delete local_get_addr_cache;
> local_get_addr_cache = NULL;
>
> dataflow_set_equiv_regs (out);
> @@ -9477,13 +9475,13 @@ vt_emit_notes (void)
> emit_notes_for_differences (BB_HEAD (bb), &cur, &VTI (bb)->in);
>
> if (MAY_HAVE_DEBUG_INSNS)
> - local_get_addr_cache = pointer_map_create ();
> + local_get_addr_cache = new hash_map<rtx, rtx>;
>
> /* Emit the notes for the changes in the basic block itself. */
> emit_notes_in_bb (bb, &cur);
>
> if (MAY_HAVE_DEBUG_INSNS)
> - pointer_map_destroy (local_get_addr_cache);
> + delete local_get_addr_cache;
> local_get_addr_cache = NULL;
>
> /* Free memory occupied by the in hash table, we won't need it
> @@ -9916,7 +9914,7 @@ vt_initialize (void)
> valvar_pool = create_alloc_pool ("small variable_def pool",
> sizeof (struct variable_def), 256);
> preserved_values.create (256);
> - global_get_addr_cache = pointer_map_create ();
> + global_get_addr_cache = new hash_map<rtx, rtx>;
> }
> else
> {
> @@ -10263,7 +10261,7 @@ vt_finalize (void)
> if (MAY_HAVE_DEBUG_INSNS)
> {
> if (global_get_addr_cache)
> - pointer_map_destroy (global_get_addr_cache);
> + delete global_get_addr_cache;
> global_get_addr_cache = NULL;
> if (loc_exp_dep_pool)
> free_alloc_pool (loc_exp_dep_pool);
> --
> 2.0.1
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] convert many pointer_map to hash_map
2014-08-01 10:52 ` Richard Biener
@ 2014-08-02 11:36 ` Trevor Saunders
2014-08-02 15:38 ` Oleg Endo
0 siblings, 1 reply; 6+ messages in thread
From: Trevor Saunders @ 2014-08-02 11:36 UTC (permalink / raw)
To: Richard Biener; +Cc: GCC Patches
On Fri, Aug 01, 2014 at 12:52:08PM +0200, Richard Biener wrote:
> On Fri, Aug 1, 2014 at 12:34 PM, <tsaunders@mozilla.com> wrote:
> > From: Trevor Saunders <tsaunders@mozilla.com>
> >
> > Hi,
> >
> > This patch replaces a bunch of usage of pointer_map with hash_map. It also
> > adds an overload to hash_map::traverse that allows modifying the value, and a
> > remove method.
> >
> > bootstrapped + regtested on x86_64-unknown-linux-gnu, ok?
>
> Ok.
committed as r213517 thanks for the review.
Trev
>
> Thanks,
> Richard.
>
> > Trev
> >
> > c-family/
> >
> > * cilk.c: Use hash_map instead of pointer_map.
> >
> > c/
> >
> > * c-typeck.c: Use hash_map instead of pointer_map.
> >
> > cp/
> >
> > * optimize.c, semantics.c: Use hash_map instead of pointer_map.
> >
> > gcc/
> >
> > * hash-map.h (default_hashmap_traits::mark_key_deleted):
> > Fix cast.
> > (hash_map::remove): New method.
> > (hash_map::traverse): New method.
> > * cgraph.h, except.c, except.h, gimple-ssa-strength-reduction.c,
> > ipa-utils.c, lto-cgraph.c, lto-streamer.h, omp-low.c, predict.c,
> > tree-cfg.c, tree-cfgcleanup.c, tree-eh.c, tree-eh.h, tree-inline.c,
> > tree-inline.h, tree-nested.c, tree-sra.c, tree-ssa-loop-im.c,
> > tree-ssa-loop-ivopts.c, tree-ssa-reassoc.c, tree-ssa-structalias.c,
> > tree-ssa.c, tree-ssa.h, var-tracking.c: Use hash_map instead of
> > pointer_map.
> > diff --git a/gcc/c-family/cilk.c b/gcc/c-family/cilk.c
> > index b864bb1..e0d1141 100644
> > --- a/gcc/c-family/cilk.c
> > +++ b/gcc/c-family/cilk.c
> > @@ -64,7 +64,7 @@ struct wrapper_data
> > /* Containing function. */
> > tree context;
> > /* Disposition of all variables in the inner statement. */
> > - struct pointer_map_t *decl_map;
> > + hash_map<tree, tree> *decl_map;
> > /* True if this function needs a static chain. */
> > bool nested;
> > /* Arguments to be passed to wrapper function, currently a list. */
> > @@ -335,12 +335,11 @@ create_cilk_helper_decl (struct wrapper_data *wd)
> >
> > /* A function used by walk tree to find wrapper parms. */
> >
> > -static bool
> > -wrapper_parm_cb (const void *key0, void **val0, void *data)
> > +bool
> > +wrapper_parm_cb (tree const &key0, tree *val0, wrapper_data *wd)
> > {
> > - struct wrapper_data *wd = (struct wrapper_data *) data;
> > - tree arg = * (tree *)&key0;
> > - tree val = (tree)*val0;
> > + tree arg = key0;
> > + tree val = *val0;
> > tree parm;
> >
> > if (val == error_mark_node || val == arg)
> > @@ -387,7 +386,7 @@ build_wrapper_type (struct wrapper_data *wd)
> > wd->parms = NULL_TREE;
> > wd->argtypes = void_list_node;
> >
> > - pointer_map_traverse (wd->decl_map, wrapper_parm_cb, wd);
> > + wd->decl_map->traverse<wrapper_data *, wrapper_parm_cb> (wd);
> > gcc_assert (wd->type != CILK_BLOCK_FOR);
> >
> > /* Now build a function.
> > @@ -452,25 +451,22 @@ copy_decl_for_cilk (tree decl, copy_body_data *id)
> >
> > /* Copy all local variables. */
> >
> > -static bool
> > -for_local_cb (const void *k_v, void **vp, void *p)
> > +bool
> > +for_local_cb (tree const &k, tree *vp, copy_body_data *id)
> > {
> > - tree k = *(tree *) &k_v;
> > - tree v = (tree) *vp;
> > + tree v = *vp;
> >
> > if (v == error_mark_node)
> > - *vp = copy_decl_no_change (k, (copy_body_data *) p);
> > + *vp = copy_decl_no_change (k, id);
> > return true;
> > }
> >
> > /* Copy all local declarations from a _Cilk_spawned function's body. */
> >
> > -static bool
> > -wrapper_local_cb (const void *k_v, void **vp, void *data)
> > +bool
> > +wrapper_local_cb (tree const &key, tree *vp, copy_body_data *id)
> > {
> > - copy_body_data *id = (copy_body_data *) data;
> > - tree key = *(tree *) &k_v;
> > - tree val = (tree) *vp;
> > + tree val = *vp;
> >
> > if (val == error_mark_node)
> > *vp = copy_decl_for_cilk (key, id);
> > @@ -514,8 +510,11 @@ cilk_outline (tree inner_fn, tree *stmt_p, void *w)
> > insert_decl_map (&id, wd->block, DECL_INITIAL (inner_fn));
> >
> > /* We don't want the private variables any more. */
> > - pointer_map_traverse (wd->decl_map, nested ? for_local_cb : wrapper_local_cb,
> > - &id);
> > + if (nested)
> > + wd->decl_map->traverse<copy_body_data *, for_local_cb> (&id);
> > + else
> > + wd->decl_map->traverse<copy_body_data *, wrapper_local_cb> (&id);
> > +
> > walk_tree (stmt_p, copy_tree_body_r, (void *) &id, NULL);
> >
> > /* See if this function can throw or calls something that should
> > @@ -576,7 +575,7 @@ init_wd (struct wrapper_data *wd, enum cilk_block_type type)
> > wd->type = type;
> > wd->fntype = NULL_TREE;
> > wd->context = current_function_decl;
> > - wd->decl_map = pointer_map_create ();
> > + wd->decl_map = new hash_map<tree, tree>;
> > /* _Cilk_for bodies are always nested. Others start off as
> > normal functions. */
> > wd->nested = (type == CILK_BLOCK_FOR);
> > @@ -590,7 +589,7 @@ init_wd (struct wrapper_data *wd, enum cilk_block_type type)
> > static void
> > free_wd (struct wrapper_data *wd)
> > {
> > - pointer_map_destroy (wd->decl_map);
> > + delete wd->decl_map;
> > wd->nested = false;
> > wd->arglist = NULL_TREE;
> > wd->argtypes = NULL_TREE;
> > @@ -618,12 +617,11 @@ free_wd (struct wrapper_data *wd)
> > (var, ???) -- Pure output argument, handled similarly to above.
> > */
> >
> > -static bool
> > -declare_one_free_variable (const void *var0, void **map0,
> > - void *data ATTRIBUTE_UNUSED)
> > +bool
> > +declare_one_free_variable (tree const &var0, tree *map0, wrapper_data &)
> > {
> > - const_tree var = (const_tree) var0;
> > - tree map = (tree)*map0;
> > + const_tree var = var0;
> > + tree map = *map0;
> > tree var_type = TREE_TYPE (var), arg_type;
> > bool by_reference;
> > tree parm;
> > @@ -713,7 +711,7 @@ create_cilk_wrapper (tree exp, tree *args_out)
> > }
> > else
> > extract_free_variables (exp, &wd, ADD_READ);
> > - pointer_map_traverse (wd.decl_map, declare_one_free_variable, &wd);
> > + wd.decl_map->traverse<wrapper_data &, declare_one_free_variable> (wd);
> > wd.block = TREE_BLOCK (exp);
> > if (!wd.block)
> > wd.block = DECL_INITIAL (current_function_decl);
> > @@ -884,9 +882,7 @@ cilk_install_body_pedigree_operations (tree frame_ptr)
> > static void
> > add_variable (struct wrapper_data *wd, tree var, enum add_variable_type how)
> > {
> > - void **valp;
> > -
> > - valp = pointer_map_contains (wd->decl_map, (void *) var);
> > + tree *valp = wd->decl_map->get (var);
> > if (valp)
> > {
> > tree val = (tree) *valp;
> > @@ -907,7 +903,7 @@ add_variable (struct wrapper_data *wd, tree var, enum add_variable_type how)
> > if (how != ADD_WRITE)
> > return;
> > /* This variable might have been entered as read but is now written. */
> > - *valp = (void *) var;
> > + *valp = var;
> > wd->nested = true;
> > return;
> > }
> > @@ -971,7 +967,7 @@ add_variable (struct wrapper_data *wd, tree var, enum add_variable_type how)
> > break;
> > }
> > }
> > - *pointer_map_insert (wd->decl_map, (void *) var) = val;
> > + wd->decl_map->put (var, val);
> > }
> > }
> >
> > diff --git a/gcc/c/c-typeck.c b/gcc/c/c-typeck.c
> > index 06fd565..bedb63e 100644
> > --- a/gcc/c/c-typeck.c
> > +++ b/gcc/c/c-typeck.c
> > @@ -11783,15 +11783,15 @@ c_clone_omp_udr (tree stmt, tree omp_decl1, tree omp_decl2,
> > tree decl, tree placeholder)
> > {
> > copy_body_data id;
> > - struct pointer_map_t *decl_map = pointer_map_create ();
> > + hash_map<tree, tree> decl_map;
> >
> > - *pointer_map_insert (decl_map, omp_decl1) = placeholder;
> > - *pointer_map_insert (decl_map, omp_decl2) = decl;
> > + decl_map.put (omp_decl1, placeholder);
> > + decl_map.put (omp_decl2, decl);
> > memset (&id, 0, sizeof (id));
> > id.src_fn = DECL_CONTEXT (omp_decl1);
> > id.dst_fn = current_function_decl;
> > id.src_cfun = DECL_STRUCT_FUNCTION (id.src_fn);
> > - id.decl_map = decl_map;
> > + id.decl_map = &decl_map;
> >
> > id.copy_decl = copy_decl_no_change;
> > id.transform_call_graph_edges = CB_CGE_DUPLICATE;
> > @@ -11800,7 +11800,6 @@ c_clone_omp_udr (tree stmt, tree omp_decl1, tree omp_decl2,
> > id.transform_lang_insert_block = NULL;
> > id.eh_lp_nr = 0;
> > walk_tree (&stmt, copy_tree_body_r, &id, NULL);
> > - pointer_map_destroy (decl_map);
> > return stmt;
> > }
> >
> > diff --git a/gcc/cgraph.h b/gcc/cgraph.h
> > index f8f76c4..0fa8635 100644
> > --- a/gcc/cgraph.h
> > +++ b/gcc/cgraph.h
> > @@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. If not see
> > #ifndef GCC_CGRAPH_H
> > #define GCC_CGRAPH_H
> >
> > +#include "hash-map.h"
> > #include "is-a.h"
> > #include "plugin-api.h"
> > #include "vec.h"
> > @@ -1204,7 +1205,7 @@ public:
> > can appear in multiple sets. */
> > struct cgraph_node_set_def
> > {
> > - struct pointer_map_t *map;
> > + hash_map<cgraph_node *, size_t> *map;
> > vec<cgraph_node *> nodes;
> > };
> >
> > @@ -1217,7 +1218,7 @@ class varpool_node;
> > can appear in multiple sets. */
> > struct varpool_node_set_def
> > {
> > - struct pointer_map_t * map;
> > + hash_map<varpool_node *, size_t> * map;
> > vec<varpool_node *> nodes;
> > };
> >
> > diff --git a/gcc/cp/optimize.c b/gcc/cp/optimize.c
> > index 3cd8047..6eeca4d 100644
> > --- a/gcc/cp/optimize.c
> > +++ b/gcc/cp/optimize.c
> > @@ -86,7 +86,7 @@ clone_body (tree clone, tree fn, void *arg_map)
> > id.src_fn = fn;
> > id.dst_fn = clone;
> > id.src_cfun = DECL_STRUCT_FUNCTION (fn);
> > - id.decl_map = (struct pointer_map_t *) arg_map;
> > + id.decl_map = static_cast<hash_map<tree, tree> *> (arg_map);
> >
> > id.copy_decl = copy_decl_no_change;
> > id.transform_call_graph_edges = CB_CGE_DUPLICATE;
> > @@ -527,7 +527,7 @@ maybe_clone_body (tree fn)
> > tree parm;
> > tree clone_parm;
> > int parmno;
> > - struct pointer_map_t *decl_map;
> > + hash_map<tree, tree> *decl_map;
> > bool alias = false;
> >
> > clone = fns[idx];
> > @@ -587,7 +587,7 @@ maybe_clone_body (tree fn)
> > }
> >
> > /* Remap the parameters. */
> > - decl_map = pointer_map_create ();
> > + decl_map = new hash_map<tree, tree>;
> > for (parmno = 0,
> > parm = DECL_ARGUMENTS (fn),
> > clone_parm = DECL_ARGUMENTS (clone);
> > @@ -600,7 +600,7 @@ maybe_clone_body (tree fn)
> > {
> > tree in_charge;
> > in_charge = in_charge_arg_for_name (DECL_NAME (clone));
> > - *pointer_map_insert (decl_map, parm) = in_charge;
> > + decl_map->put (parm, in_charge);
> > }
> > else if (DECL_ARTIFICIAL (parm)
> > && DECL_NAME (parm) == vtt_parm_identifier)
> > @@ -611,19 +611,22 @@ maybe_clone_body (tree fn)
> > if (DECL_HAS_VTT_PARM_P (clone))
> > {
> > DECL_ABSTRACT_ORIGIN (clone_parm) = parm;
> > - *pointer_map_insert (decl_map, parm) = clone_parm;
> > + decl_map->put (parm, clone_parm);
> > clone_parm = DECL_CHAIN (clone_parm);
> > }
> > /* Otherwise, map the VTT parameter to `NULL'. */
> > else
> > - *pointer_map_insert (decl_map, parm)
> > - = fold_convert (TREE_TYPE (parm), null_pointer_node);
> > + {
> > + tree t
> > + = fold_convert (TREE_TYPE (parm), null_pointer_node);
> > + decl_map->put (parm, t);
> > + }
> > }
> > /* Map other parameters to their equivalents in the cloned
> > function. */
> > else
> > {
> > - *pointer_map_insert (decl_map, parm) = clone_parm;
> > + decl_map->put (parm, clone_parm);
> > clone_parm = DECL_CHAIN (clone_parm);
> > }
> > }
> > @@ -632,14 +635,14 @@ maybe_clone_body (tree fn)
> > {
> > parm = DECL_RESULT (fn);
> > clone_parm = DECL_RESULT (clone);
> > - *pointer_map_insert (decl_map, parm) = clone_parm;
> > + decl_map->put (parm, clone_parm);
> > }
> >
> > /* Clone the body. */
> > clone_body (clone, fn, decl_map);
> >
> > /* Clean up. */
> > - pointer_map_destroy (decl_map);
> > + delete decl_map;
> > }
> >
> > /* The clone can throw iff the original function can throw. */
> > diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
> > index 735284e..4868d69 100644
> > --- a/gcc/cp/semantics.c
> > +++ b/gcc/cp/semantics.c
> > @@ -4977,15 +4977,15 @@ clone_omp_udr (tree stmt, tree omp_decl1, tree omp_decl2,
> > tree decl, tree placeholder)
> > {
> > copy_body_data id;
> > - struct pointer_map_t *decl_map = pointer_map_create ();
> > + hash_map<tree, tree> decl_map;
> >
> > - *pointer_map_insert (decl_map, omp_decl1) = placeholder;
> > - *pointer_map_insert (decl_map, omp_decl2) = decl;
> > + decl_map.put (omp_decl1, placeholder);
> > + decl_map.put (omp_decl2, decl);
> > memset (&id, 0, sizeof (id));
> > id.src_fn = DECL_CONTEXT (omp_decl1);
> > id.dst_fn = current_function_decl;
> > id.src_cfun = DECL_STRUCT_FUNCTION (id.src_fn);
> > - id.decl_map = decl_map;
> > + id.decl_map = &decl_map;
> >
> > id.copy_decl = copy_decl_no_change;
> > id.transform_call_graph_edges = CB_CGE_DUPLICATE;
> > @@ -4994,7 +4994,6 @@ clone_omp_udr (tree stmt, tree omp_decl1, tree omp_decl2,
> > id.transform_lang_insert_block = NULL;
> > id.eh_lp_nr = 0;
> > walk_tree (&stmt, copy_tree_body_r, &id, NULL);
> > - pointer_map_destroy (decl_map);
> > return stmt;
> > }
> >
> > diff --git a/gcc/except.c b/gcc/except.c
> > index c8dbc50..ec08e91 100644
> > --- a/gcc/except.c
> > +++ b/gcc/except.c
> > @@ -527,7 +527,7 @@ struct duplicate_eh_regions_data
> > {
> > duplicate_eh_regions_map label_map;
> > void *label_map_data;
> > - struct pointer_map_t *eh_map;
> > + hash_map<void *, void *> *eh_map;
> > };
> >
> > static void
> > @@ -536,12 +536,9 @@ duplicate_eh_regions_1 (struct duplicate_eh_regions_data *data,
> > {
> > eh_landing_pad old_lp, new_lp;
> > eh_region new_r;
> > - void **slot;
> >
> > new_r = gen_eh_region (old_r->type, outer);
> > - slot = pointer_map_insert (data->eh_map, (void *)old_r);
> > - gcc_assert (*slot == NULL);
> > - *slot = (void *)new_r;
> > + gcc_assert (!data->eh_map->put (old_r, new_r));
> >
> > switch (old_r->type)
> > {
> > @@ -586,9 +583,7 @@ duplicate_eh_regions_1 (struct duplicate_eh_regions_data *data,
> > continue;
> >
> > new_lp = gen_eh_landing_pad (new_r);
> > - slot = pointer_map_insert (data->eh_map, (void *)old_lp);
> > - gcc_assert (*slot == NULL);
> > - *slot = (void *)new_lp;
> > + gcc_assert (!data->eh_map->put (old_lp, new_lp));
> >
> > new_lp->post_landing_pad
> > = data->label_map (old_lp->post_landing_pad, data->label_map_data);
> > @@ -609,7 +604,7 @@ duplicate_eh_regions_1 (struct duplicate_eh_regions_data *data,
> > that allows the caller to remap uses of both EH regions and
> > EH landing pads. */
> >
> > -struct pointer_map_t *
> > +hash_map<void *, void *> *
> > duplicate_eh_regions (struct function *ifun,
> > eh_region copy_region, int outer_lp,
> > duplicate_eh_regions_map map, void *map_data)
> > @@ -623,7 +618,7 @@ duplicate_eh_regions (struct function *ifun,
> >
> > data.label_map = map;
> > data.label_map_data = map_data;
> > - data.eh_map = pointer_map_create ();
> > + data.eh_map = new hash_map<void *, void *>;
> >
> > outer_region = get_eh_region_from_lp_number (outer_lp);
> >
> > diff --git a/gcc/except.h b/gcc/except.h
> > index bab13e1..5c2aa3d 100644
> > --- a/gcc/except.h
> > +++ b/gcc/except.h
> > @@ -25,6 +25,7 @@ along with GCC; see the file COPYING3. If not see
> > # define GCC_EXCEPT_H
> > #endif
> >
> > +#include "hash-map.h"
> > #include "hashtab.h"
> >
> > struct function;
> > @@ -249,7 +250,7 @@ extern rtx expand_builtin_extend_pointer (tree);
> > extern void expand_dw2_landing_pad_for_region (eh_region);
> >
> > typedef tree (*duplicate_eh_regions_map) (tree, void *);
> > -extern struct pointer_map_t *duplicate_eh_regions
> > +extern hash_map<void *, void *> *duplicate_eh_regions
> > (struct function *, eh_region, int, duplicate_eh_regions_map, void *);
> >
> > extern void sjlj_emit_function_exit_after (rtx);
> > diff --git a/gcc/gimple-ssa-strength-reduction.c b/gcc/gimple-ssa-strength-reduction.c
> > index d7c5db5..b13b7f7 100644
> > --- a/gcc/gimple-ssa-strength-reduction.c
> > +++ b/gcc/gimple-ssa-strength-reduction.c
> > @@ -38,6 +38,7 @@ along with GCC; see the file COPYING3. If not see
> > #include "coretypes.h"
> > #include "tree.h"
> > #include "pointer-set.h"
> > +#include "hash-map.h"
> > #include "hash-table.h"
> > #include "basic-block.h"
> > #include "tree-ssa-alias.h"
> > @@ -373,7 +374,7 @@ enum count_phis_status
> > };
> >
> > /* Pointer map embodying a mapping from statements to candidates. */
> > -static struct pointer_map_t *stmt_cand_map;
> > +static hash_map<gimple, slsr_cand_t> *stmt_cand_map;
> >
> > /* Obstack for candidates. */
> > static struct obstack cand_obstack;
> > @@ -435,7 +436,7 @@ static hash_table<cand_chain_hasher> *base_cand_map;
> > /* Pointer map used by tree_to_aff_combination_expand. */
> > static struct pointer_map_t *name_expansions;
> > /* Pointer map embodying a mapping from bases to alternative bases. */
> > -static struct pointer_map_t *alt_base_map;
> > +static hash_map<tree, tree> *alt_base_map;
> >
> > /* Given BASE, use the tree affine combiniation facilities to
> > find the underlying tree expression for BASE, with any
> > @@ -447,7 +448,7 @@ static struct pointer_map_t *alt_base_map;
> > static tree
> > get_alternative_base (tree base)
> > {
> > - tree *result = (tree *) pointer_map_contains (alt_base_map, base);
> > + tree *result = alt_base_map->get (base);
> >
> > if (result == NULL)
> > {
> > @@ -459,13 +460,9 @@ get_alternative_base (tree base)
> > aff.offset = 0;
> > expr = aff_combination_to_tree (&aff);
> >
> > - result = (tree *) pointer_map_insert (alt_base_map, base);
> > - gcc_assert (!*result);
> > + gcc_assert (!alt_base_map->put (base, base == expr ? NULL : expr));
> >
> > - if (expr == base)
> > - *result = NULL;
> > - else
> > - *result = expr;
> > + return expr == base ? NULL : expr;
> > }
> >
> > return *result;
> > @@ -724,7 +721,7 @@ base_cand_from_table (tree base_in)
> > if (!def)
> > return (slsr_cand_t) NULL;
> >
> > - result = (slsr_cand_t *) pointer_map_contains (stmt_cand_map, def);
> > + result = stmt_cand_map->get (def);
> >
> > if (result && (*result)->kind != CAND_REF)
> > return *result;
> > @@ -737,9 +734,7 @@ base_cand_from_table (tree base_in)
> > static void
> > add_cand_for_stmt (gimple gs, slsr_cand_t c)
> > {
> > - void **slot = pointer_map_insert (stmt_cand_map, gs);
> > - gcc_assert (!*slot);
> > - *slot = c;
> > + gcc_assert (!stmt_cand_map->put (gs, c));
> > }
> >
> > /* Given PHI which contains a phi statement, determine whether it
> > @@ -3628,7 +3623,7 @@ pass_strength_reduction::execute (function *fun)
> > cand_vec.create (128);
> >
> > /* Allocate the mapping from statements to candidate indices. */
> > - stmt_cand_map = pointer_map_create ();
> > + stmt_cand_map = new hash_map<gimple, slsr_cand_t>;
> >
> > /* Create the obstack where candidate chains will reside. */
> > gcc_obstack_init (&chain_obstack);
> > @@ -3637,7 +3632,7 @@ pass_strength_reduction::execute (function *fun)
> > base_cand_map = new hash_table<cand_chain_hasher> (500);
> >
> > /* Allocate the mapping from bases to alternative bases. */
> > - alt_base_map = pointer_map_create ();
> > + alt_base_map = new hash_map<tree, tree>;
> >
> > /* Initialize the loop optimizer. We need to detect flow across
> > back edges, and this gives us dominator information as well. */
> > @@ -3654,7 +3649,7 @@ pass_strength_reduction::execute (function *fun)
> > dump_cand_chains ();
> > }
> >
> > - pointer_map_destroy (alt_base_map);
> > + delete alt_base_map;
> > free_affine_expand_cache (&name_expansions);
> >
> > /* Analyze costs and make appropriate replacements. */
> > @@ -3664,7 +3659,7 @@ pass_strength_reduction::execute (function *fun)
> > delete base_cand_map;
> > base_cand_map = NULL;
> > obstack_free (&chain_obstack, NULL);
> > - pointer_map_destroy (stmt_cand_map);
> > + delete stmt_cand_map;
> > cand_vec.release ();
> > obstack_free (&cand_obstack, NULL);
> >
> > diff --git a/gcc/hash-map.h b/gcc/hash-map.h
> > index 0b50f72..ec48844 100644
> > --- a/gcc/hash-map.h
> > +++ b/gcc/hash-map.h
> > @@ -93,7 +93,7 @@ private:
> > static void
> > mark_key_deleted (T *&k)
> > {
> > - k = static_cast<T *> (1);
> > + k = reinterpret_cast<T *> (1);
> > }
> >
> > template<typename T>
> > @@ -185,6 +185,11 @@ public:
> > return e->m_value;
> > }
> >
> > + void remove (const Key &k)
> > + {
> > + m_table.remove_elt_with_hash (k, Traits::hash (k));
> > + }
> > +
> > /* Call the call back on each pair of key and value with the passed in
> > arg. */
> >
> > @@ -196,6 +201,15 @@ public:
> > f ((*iter).m_key, (*iter).m_value, a);
> > }
> >
> > + template<typename Arg, bool (*f)(const Key &, Value *, Arg)>
> > + void traverse (Arg a) const
> > + {
> > + for (typename hash_table<hash_entry>::iterator iter = m_table.begin ();
> > + iter != m_table.end (); ++iter)
> > + if (!f ((*iter).m_key, &(*iter).m_value, a))
> > + break;
> > + }
> > +
> > private:
> > hash_table<hash_entry> m_table;
> > };
> > diff --git a/gcc/ipa-utils.c b/gcc/ipa-utils.c
> > index 7810e55..a391b5d 100644
> > --- a/gcc/ipa-utils.c
> > +++ b/gcc/ipa-utils.c
> > @@ -389,7 +389,7 @@ cgraph_node_set_new (void)
> > cgraph_node_set new_node_set;
> >
> > new_node_set = XCNEW (struct cgraph_node_set_def);
> > - new_node_set->map = pointer_map_create ();
> > + new_node_set->map = new hash_map<cgraph_node *, size_t>;
> > new_node_set->nodes.create (0);
> > return new_node_set;
> > }
> > @@ -400,19 +400,17 @@ cgraph_node_set_new (void)
> > void
> > cgraph_node_set_add (cgraph_node_set set, struct cgraph_node *node)
> > {
> > - void **slot;
> > + bool existed_p;
> > + size_t &index = set->map->get_or_insert (node, &existed_p);
> >
> > - slot = pointer_map_insert (set->map, node);
> > -
> > - if (*slot)
> > + if (existed_p)
> > {
> > - int index = (size_t) *slot - 1;
> > gcc_checking_assert ((set->nodes[index]
> > == node));
> > return;
> > }
> >
> > - *slot = (void *)(size_t) (set->nodes.length () + 1);
> > + index = set->nodes.length () + 1;
> >
> > /* Insert into node vector. */
> > set->nodes.safe_push (node);
> > @@ -424,15 +422,14 @@ cgraph_node_set_add (cgraph_node_set set, struct cgraph_node *node)
> > void
> > cgraph_node_set_remove (cgraph_node_set set, struct cgraph_node *node)
> > {
> > - void **slot, **last_slot;
> > int index;
> > struct cgraph_node *last_node;
> >
> > - slot = pointer_map_contains (set->map, node);
> > + size_t *slot = set->map->get (node);
> > if (slot == NULL || !*slot)
> > return;
> >
> > - index = (size_t) *slot - 1;
> > + index = *slot - 1;
> > gcc_checking_assert (set->nodes[index]
> > == node);
> >
> > @@ -441,16 +438,16 @@ cgraph_node_set_remove (cgraph_node_set set, struct cgraph_node *node)
> > last_node = set->nodes.pop ();
> > if (last_node != node)
> > {
> > - last_slot = pointer_map_contains (set->map, last_node);
> > + size_t *last_slot = set->map->get (last_node);
> > gcc_checking_assert (last_slot && *last_slot);
> > - *last_slot = (void *)(size_t) (index + 1);
> > + *last_slot = index + 1;
> >
> > /* Move the last element to the original spot of NODE. */
> > set->nodes[index] = last_node;
> > }
> >
> > /* Remove element from hash table. */
> > - *slot = NULL;
> > + set->map->remove (node);
> > }
> >
> >
> > @@ -460,14 +457,14 @@ cgraph_node_set_remove (cgraph_node_set set, struct cgraph_node *node)
> > cgraph_node_set_iterator
> > cgraph_node_set_find (cgraph_node_set set, struct cgraph_node *node)
> > {
> > - void **slot;
> > + size_t *slot;
> > cgraph_node_set_iterator csi;
> >
> > - slot = pointer_map_contains (set->map, node);
> > + slot = set->map->get (node);
> > if (slot == NULL || !*slot)
> > csi.index = (unsigned) ~0;
> > else
> > - csi.index = (size_t)*slot - 1;
> > + csi.index = *slot - 1;
> > csi.set = set;
> >
> > return csi;
> > @@ -505,7 +502,7 @@ void
> > free_cgraph_node_set (cgraph_node_set set)
> > {
> > set->nodes.release ();
> > - pointer_map_destroy (set->map);
> > + delete set->map;
> > free (set);
> > }
> >
> > @@ -518,7 +515,7 @@ varpool_node_set_new (void)
> > varpool_node_set new_node_set;
> >
> > new_node_set = XCNEW (struct varpool_node_set_def);
> > - new_node_set->map = pointer_map_create ();
> > + new_node_set->map = new hash_map<varpool_node *, size_t>;
> > new_node_set->nodes.create (0);
> > return new_node_set;
> > }
> > @@ -529,19 +526,18 @@ varpool_node_set_new (void)
> > void
> > varpool_node_set_add (varpool_node_set set, varpool_node *node)
> > {
> > - void **slot;
> > -
> > - slot = pointer_map_insert (set->map, node);
> > + bool existed;
> > + size_t &slot = set->map->get_or_insert (node, &existed);
> >
> > - if (*slot)
> > + if (existed)
> > {
> > - int index = (size_t) *slot - 1;
> > + int index = slot - 1;
> > gcc_checking_assert ((set->nodes[index]
> > == node));
> > return;
> > }
> >
> > - *slot = (void *)(size_t) (set->nodes.length () + 1);
> > + slot = set->nodes.length () + 1;
> >
> > /* Insert into node vector. */
> > set->nodes.safe_push (node);
> > @@ -553,15 +549,14 @@ varpool_node_set_add (varpool_node_set set, varpool_node *node)
> > void
> > varpool_node_set_remove (varpool_node_set set, varpool_node *node)
> > {
> > - void **slot, **last_slot;
> > int index;
> > varpool_node *last_node;
> >
> > - slot = pointer_map_contains (set->map, node);
> > + size_t *slot = set->map->get (node);
> > if (slot == NULL || !*slot)
> > return;
> >
> > - index = (size_t) *slot - 1;
> > + index = *slot - 1;
> > gcc_checking_assert (set->nodes[index]
> > == node);
> >
> > @@ -570,16 +565,16 @@ varpool_node_set_remove (varpool_node_set set, varpool_node *node)
> > last_node = set->nodes.pop ();
> > if (last_node != node)
> > {
> > - last_slot = pointer_map_contains (set->map, last_node);
> > + size_t *last_slot = set->map->get (last_node);
> > gcc_checking_assert (last_slot && *last_slot);
> > - *last_slot = (void *)(size_t) (index + 1);
> > + *last_slot = index + 1;
> >
> > /* Move the last element to the original spot of NODE. */
> > set->nodes[index] = last_node;
> > }
> >
> > /* Remove element from hash table. */
> > - *slot = NULL;
> > + set->map->remove (node);
> > }
> >
> >
> > @@ -589,14 +584,13 @@ varpool_node_set_remove (varpool_node_set set, varpool_node *node)
> > varpool_node_set_iterator
> > varpool_node_set_find (varpool_node_set set, varpool_node *node)
> > {
> > - void **slot;
> > varpool_node_set_iterator vsi;
> >
> > - slot = pointer_map_contains (set->map, node);
> > + size_t *slot = set->map->get (node);
> > if (slot == NULL || !*slot)
> > vsi.index = (unsigned) ~0;
> > else
> > - vsi.index = (size_t)*slot - 1;
> > + vsi.index = *slot - 1;
> > vsi.set = set;
> >
> > return vsi;
> > @@ -625,7 +619,7 @@ void
> > free_varpool_node_set (varpool_node_set set)
> > {
> > set->nodes.release ();
> > - pointer_map_destroy (set->map);
> > + delete set->map;
> > free (set);
> > }
> >
> > diff --git a/gcc/lto-cgraph.c b/gcc/lto-cgraph.c
> > index 42b0790..28a30ad 100644
> > --- a/gcc/lto-cgraph.c
> > +++ b/gcc/lto-cgraph.c
> > @@ -93,7 +93,7 @@ lto_symtab_encoder_new (bool for_input)
> > lto_symtab_encoder_t encoder = XCNEW (struct lto_symtab_encoder_d);
> >
> > if (!for_input)
> > - encoder->map = pointer_map_create ();
> > + encoder->map = new hash_map<symtab_node *, size_t>;
> > encoder->nodes.create (0);
> > return encoder;
> > }
> > @@ -106,7 +106,7 @@ lto_symtab_encoder_delete (lto_symtab_encoder_t encoder)
> > {
> > encoder->nodes.release ();
> > if (encoder->map)
> > - pointer_map_destroy (encoder->map);
> > + delete encoder->map;
> > free (encoder);
> > }
> >
> > @@ -120,7 +120,6 @@ lto_symtab_encoder_encode (lto_symtab_encoder_t encoder,
> > symtab_node *node)
> > {
> > int ref;
> > - void **slot;
> >
> > if (!encoder->map)
> > {
> > @@ -131,18 +130,17 @@ lto_symtab_encoder_encode (lto_symtab_encoder_t encoder,
> > return ref;
> > }
> >
> > - slot = pointer_map_contains (encoder->map, node);
> > + size_t *slot = encoder->map->get (node);
> > if (!slot || !*slot)
> > {
> > lto_encoder_entry entry = {node, false, false, false};
> > ref = encoder->nodes.length ();
> > if (!slot)
> > - slot = pointer_map_insert (encoder->map, node);
> > - *slot = (void *) (intptr_t) (ref + 1);
> > + encoder->map->put (node, ref + 1);
> > encoder->nodes.safe_push (entry);
> > }
> > else
> > - ref = (size_t) *slot - 1;
> > + ref = *slot - 1;
> >
> > return ref;
> > }
> > @@ -153,15 +151,14 @@ bool
> > lto_symtab_encoder_delete_node (lto_symtab_encoder_t encoder,
> > symtab_node *node)
> > {
> > - void **slot, **last_slot;
> > int index;
> > lto_encoder_entry last_node;
> >
> > - slot = pointer_map_contains (encoder->map, node);
> > + size_t *slot = encoder->map->get (node);
> > if (slot == NULL || !*slot)
> > return false;
> >
> > - index = (size_t) *slot - 1;
> > + index = *slot - 1;
> > gcc_checking_assert (encoder->nodes[index].node == node);
> >
> > /* Remove from vector. We do this by swapping node with the last element
> > @@ -169,16 +166,14 @@ lto_symtab_encoder_delete_node (lto_symtab_encoder_t encoder,
> > last_node = encoder->nodes.pop ();
> > if (last_node.node != node)
> > {
> > - last_slot = pointer_map_contains (encoder->map, last_node.node);
> > - gcc_checking_assert (last_slot && *last_slot);
> > - *last_slot = (void *)(size_t) (index + 1);
> > + gcc_assert (encoder->map->put (last_node.node, index + 1));
> >
> > /* Move the last element to the original spot of NODE. */
> > encoder->nodes[index] = last_node;
> > }
> >
> > /* Remove element from hash table. */
> > - *slot = NULL;
> > + encoder->map->remove (node);
> > return true;
> > }
> >
> > diff --git a/gcc/lto-streamer.h b/gcc/lto-streamer.h
> > index d350ad9..b2486dd 100644
> > --- a/gcc/lto-streamer.h
> > +++ b/gcc/lto-streamer.h
> > @@ -443,7 +443,7 @@ struct lto_encoder_entry
> > struct lto_symtab_encoder_d
> > {
> > vec<lto_encoder_entry> nodes;
> > - pointer_map_t *map;
> > + hash_map<symtab_node *, size_t> *map;
> > };
> >
> > typedef struct lto_symtab_encoder_d *lto_symtab_encoder_t;
> > @@ -1046,8 +1046,8 @@ static inline int
> > lto_symtab_encoder_lookup (lto_symtab_encoder_t encoder,
> > symtab_node *node)
> > {
> > - void **slot = pointer_map_contains (encoder->map, node);
> > - return (slot && *slot ? (size_t) *(slot) - 1 : LCC_NOT_FOUND);
> > + size_t *slot = encoder->map->get (node);
> > + return (slot && *slot ? *(slot) - 1 : LCC_NOT_FOUND);
> > }
> >
> > /* Return true if iterator LSE points to nothing. */
> > diff --git a/gcc/omp-low.c b/gcc/omp-low.c
> > index b46693b..0fe2a40 100644
> > --- a/gcc/omp-low.c
> > +++ b/gcc/omp-low.c
> > @@ -812,16 +812,14 @@ is_reference (tree decl)
> > static inline tree
> > lookup_decl (tree var, omp_context *ctx)
> > {
> > - tree *n;
> > - n = (tree *) pointer_map_contains (ctx->cb.decl_map, var);
> > + tree *n = ctx->cb.decl_map->get (var);
> > return *n;
> > }
> >
> > static inline tree
> > maybe_lookup_decl (const_tree var, omp_context *ctx)
> > {
> > - tree *n;
> > - n = (tree *) pointer_map_contains (ctx->cb.decl_map, var);
> > + tree *n = ctx->cb.decl_map->get (const_cast<tree> (var));
> > return n ? *n : NULL_TREE;
> > }
> >
> > @@ -1359,7 +1357,7 @@ new_omp_context (gimple stmt, omp_context *outer_ctx)
> > ctx->depth = 1;
> > }
> >
> > - ctx->cb.decl_map = pointer_map_create ();
> > + ctx->cb.decl_map = new hash_map<tree, tree>;
> >
> > return ctx;
> > }
> > @@ -1408,7 +1406,7 @@ delete_omp_context (splay_tree_value value)
> > {
> > omp_context *ctx = (omp_context *) value;
> >
> > - pointer_map_destroy (ctx->cb.decl_map);
> > + delete ctx->cb.decl_map;
> >
> > if (ctx->field_map)
> > splay_tree_delete (ctx->field_map);
> > @@ -6541,7 +6539,6 @@ expand_omp_for_static_chunk (struct omp_region *region,
> > gimple_stmt_iterator psi;
> > gimple phi;
> > edge re, ene;
> > - edge_var_map_vector *head;
> > edge_var_map *vm;
> > size_t i;
> >
> > @@ -6552,7 +6549,7 @@ expand_omp_for_static_chunk (struct omp_region *region,
> > appropriate phi nodes in iter_part_bb instead. */
> > se = single_pred_edge (fin_bb);
> > re = single_succ_edge (trip_update_bb);
> > - head = redirect_edge_var_map_vector (re);
> > + vec<edge_var_map> *head = redirect_edge_var_map_vector (re);
> > ene = single_succ_edge (entry_bb);
> >
> > psi = gsi_start_phis (fin_bb);
> > @@ -9219,7 +9216,7 @@ task_copyfn_remap_type (struct omp_taskcopy_context *tcctx, tree orig_type)
> > walk_tree (&DECL_FIELD_OFFSET (new_f), copy_tree_body_r,
> > &tcctx->cb, NULL);
> > new_fields = new_f;
> > - *pointer_map_insert (tcctx->cb.decl_map, f) = new_f;
> > + tcctx->cb.decl_map->put (f, new_f);
> > }
> > TYPE_FIELDS (type) = nreverse (new_fields);
> > layout_type (type);
> > @@ -9286,7 +9283,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> > tcctx.cb.copy_decl = task_copyfn_copy_decl;
> > tcctx.cb.eh_lp_nr = 0;
> > tcctx.cb.transform_call_graph_edges = CB_CGE_MOVE;
> > - tcctx.cb.decl_map = pointer_map_create ();
> > + tcctx.cb.decl_map = new hash_map<tree, tree>;
> > tcctx.ctx = ctx;
> >
> > if (record_needs_remap)
> > @@ -9311,12 +9308,12 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> > tree *p;
> >
> > decl = OMP_CLAUSE_DECL (c);
> > - p = (tree *) pointer_map_contains (tcctx.cb.decl_map, decl);
> > + p = tcctx.cb.decl_map->get (decl);
> > if (p == NULL)
> > continue;
> > n = splay_tree_lookup (ctx->sfield_map, (splay_tree_key) decl);
> > sf = (tree) n->value;
> > - sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
> > + sf = *tcctx.cb.decl_map->get (sf);
> > src = build_simple_mem_ref_loc (loc, sarg);
> > src = omp_build_component_ref (src, sf);
> > t = build2 (MODIFY_EXPR, TREE_TYPE (*p), *p, src);
> > @@ -9335,11 +9332,11 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> > break;
> > f = (tree) n->value;
> > if (tcctx.cb.decl_map)
> > - f = *(tree *) pointer_map_contains (tcctx.cb.decl_map, f);
> > + f = *tcctx.cb.decl_map->get (f);
> > n = splay_tree_lookup (ctx->sfield_map, (splay_tree_key) decl);
> > sf = (tree) n->value;
> > if (tcctx.cb.decl_map)
> > - sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
> > + sf = *tcctx.cb.decl_map->get (sf);
> > src = build_simple_mem_ref_loc (loc, sarg);
> > src = omp_build_component_ref (src, sf);
> > dst = build_simple_mem_ref_loc (loc, arg);
> > @@ -9356,13 +9353,13 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> > break;
> > f = (tree) n->value;
> > if (tcctx.cb.decl_map)
> > - f = *(tree *) pointer_map_contains (tcctx.cb.decl_map, f);
> > + f = *tcctx.cb.decl_map->get (f);
> > n = splay_tree_lookup (ctx->sfield_map, (splay_tree_key) decl);
> > if (n != NULL)
> > {
> > sf = (tree) n->value;
> > if (tcctx.cb.decl_map)
> > - sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
> > + sf = *tcctx.cb.decl_map->get (sf);
> > src = build_simple_mem_ref_loc (loc, sarg);
> > src = omp_build_component_ref (src, sf);
> > if (use_pointer_for_field (decl, NULL) || is_reference (decl))
> > @@ -9382,13 +9379,13 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> > n = splay_tree_lookup (ctx->field_map, (splay_tree_key) decl);
> > f = (tree) n->value;
> > if (tcctx.cb.decl_map)
> > - f = *(tree *) pointer_map_contains (tcctx.cb.decl_map, f);
> > + f = *tcctx.cb.decl_map->get (f);
> > n = splay_tree_lookup (ctx->sfield_map, (splay_tree_key) decl);
> > if (n != NULL)
> > {
> > sf = (tree) n->value;
> > if (tcctx.cb.decl_map)
> > - sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
> > + sf = *tcctx.cb.decl_map->get (sf);
> > src = build_simple_mem_ref_loc (loc, sarg);
> > src = omp_build_component_ref (src, sf);
> > if (use_pointer_for_field (decl, NULL))
> > @@ -9419,7 +9416,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> > if (n == NULL)
> > continue;
> > f = (tree) n->value;
> > - f = *(tree *) pointer_map_contains (tcctx.cb.decl_map, f);
> > + f = *tcctx.cb.decl_map->get (f);
> > gcc_assert (DECL_HAS_VALUE_EXPR_P (decl));
> > ind = DECL_VALUE_EXPR (decl);
> > gcc_assert (TREE_CODE (ind) == INDIRECT_REF);
> > @@ -9427,7 +9424,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> > n = splay_tree_lookup (ctx->sfield_map,
> > (splay_tree_key) TREE_OPERAND (ind, 0));
> > sf = (tree) n->value;
> > - sf = *(tree *) pointer_map_contains (tcctx.cb.decl_map, sf);
> > + sf = *tcctx.cb.decl_map->get (sf);
> > src = build_simple_mem_ref_loc (loc, sarg);
> > src = omp_build_component_ref (src, sf);
> > src = build_simple_mem_ref_loc (loc, src);
> > @@ -9438,7 +9435,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> > n = splay_tree_lookup (ctx->field_map,
> > (splay_tree_key) TREE_OPERAND (ind, 0));
> > df = (tree) n->value;
> > - df = *(tree *) pointer_map_contains (tcctx.cb.decl_map, df);
> > + df = *tcctx.cb.decl_map->get (df);
> > ptr = build_simple_mem_ref_loc (loc, arg);
> > ptr = omp_build_component_ref (ptr, df);
> > t = build2 (MODIFY_EXPR, TREE_TYPE (ptr), ptr,
> > @@ -9450,7 +9447,7 @@ create_task_copyfn (gimple task_stmt, omp_context *ctx)
> > append_to_statement_list (t, &list);
> >
> > if (tcctx.cb.decl_map)
> > - pointer_map_destroy (tcctx.cb.decl_map);
> > + delete tcctx.cb.decl_map;
> > pop_gimplify_context (NULL);
> > BIND_EXPR_BODY (bind) = list;
> > pop_cfun ();
> > diff --git a/gcc/predict.c b/gcc/predict.c
> > index 72a3b53..34ebdc3 100644
> > --- a/gcc/predict.c
> > +++ b/gcc/predict.c
> > @@ -52,6 +52,7 @@ along with GCC; see the file COPYING3. If not see
> > #include "target.h"
> > #include "cfgloop.h"
> > #include "pointer-set.h"
> > +#include "hash-map.h"
> > #include "tree-ssa-alias.h"
> > #include "internal-fn.h"
> > #include "gimple-expr.h"
> > @@ -490,11 +491,6 @@ rtl_predicted_by_p (const_basic_block bb, enum br_predictor predictor)
> > return false;
> > }
> >
> > -/* This map contains for a basic block the list of predictions for the
> > - outgoing edges. */
> > -
> > -static struct pointer_map_t *bb_predictions;
> > -
> > /* Structure representing predictions in tree level. */
> >
> > struct edge_prediction {
> > @@ -504,6 +500,11 @@ struct edge_prediction {
> > int ep_probability;
> > };
> >
> > +/* This map contains for a basic block the list of predictions for the
> > + outgoing edges. */
> > +
> > +static hash_map<const_basic_block, edge_prediction *> *bb_predictions;
> > +
> > /* Return true if the one of outgoing edges is already predicted by
> > PREDICTOR. */
> >
> > @@ -511,12 +512,12 @@ bool
> > gimple_predicted_by_p (const_basic_block bb, enum br_predictor predictor)
> > {
> > struct edge_prediction *i;
> > - void **preds = pointer_map_contains (bb_predictions, bb);
> > + edge_prediction **preds = bb_predictions->get (bb);
> >
> > if (!preds)
> > return false;
> >
> > - for (i = (struct edge_prediction *) *preds; i; i = i->ep_next)
> > + for (i = *preds; i; i = i->ep_next)
> > if (i->ep_predictor == predictor)
> > return true;
> > return false;
> > @@ -618,10 +619,10 @@ gimple_predict_edge (edge e, enum br_predictor predictor, int probability)
> > && flag_guess_branch_prob && optimize)
> > {
> > struct edge_prediction *i = XNEW (struct edge_prediction);
> > - void **preds = pointer_map_insert (bb_predictions, e->src);
> > + edge_prediction *&preds = bb_predictions->get_or_insert (e->src);
> >
> > - i->ep_next = (struct edge_prediction *) *preds;
> > - *preds = i;
> > + i->ep_next = preds;
> > + preds = i;
> > i->ep_probability = probability;
> > i->ep_predictor = predictor;
> > i->ep_edge = e;
> > @@ -633,16 +634,14 @@ gimple_predict_edge (edge e, enum br_predictor predictor, int probability)
> > void
> > remove_predictions_associated_with_edge (edge e)
> > {
> > - void **preds;
> > -
> > if (!bb_predictions)
> > return;
> >
> > - preds = pointer_map_contains (bb_predictions, e->src);
> > + edge_prediction **preds = bb_predictions->get (e->src);
> >
> > if (preds)
> > {
> > - struct edge_prediction **prediction = (struct edge_prediction **) preds;
> > + struct edge_prediction **prediction = preds;
> > struct edge_prediction *next;
> >
> > while (*prediction)
> > @@ -664,13 +663,13 @@ remove_predictions_associated_with_edge (edge e)
> > static void
> > clear_bb_predictions (basic_block bb)
> > {
> > - void **preds = pointer_map_contains (bb_predictions, bb);
> > + edge_prediction **preds = bb_predictions->get (bb);
> > struct edge_prediction *pred, *next;
> >
> > if (!preds)
> > return;
> >
> > - for (pred = (struct edge_prediction *) *preds; pred; pred = next)
> > + for (pred = *preds; pred; pred = next)
> > {
> > next = pred->ep_next;
> > free (pred);
> > @@ -903,7 +902,6 @@ combine_predictions_for_bb (basic_block bb)
> > int nedges = 0;
> > edge e, first = NULL, second = NULL;
> > edge_iterator ei;
> > - void **preds;
> >
> > FOR_EACH_EDGE (e, ei, bb->succs)
> > if (!(e->flags & (EDGE_EH | EDGE_FAKE)))
> > @@ -935,12 +933,12 @@ combine_predictions_for_bb (basic_block bb)
> > if (dump_file)
> > fprintf (dump_file, "Predictions for bb %i\n", bb->index);
> >
> > - preds = pointer_map_contains (bb_predictions, bb);
> > + edge_prediction **preds = bb_predictions->get (bb);
> > if (preds)
> > {
> > /* We implement "first match" heuristics and use probability guessed
> > by predictor with smallest index. */
> > - for (pred = (struct edge_prediction *) *preds; pred; pred = pred->ep_next)
> > + for (pred = *preds; pred; pred = pred->ep_next)
> > {
> > enum br_predictor predictor = pred->ep_predictor;
> > int probability = pred->ep_probability;
> > @@ -2243,14 +2241,14 @@ tree_bb_level_predictions (void)
> >
> > #ifdef ENABLE_CHECKING
> >
> > -/* Callback for pointer_map_traverse, asserts that the pointer map is
> > +/* Callback for hash_map::traverse, asserts that the pointer map is
> > empty. */
> >
> > -static bool
> > -assert_is_empty (const void *key ATTRIBUTE_UNUSED, void **value,
> > - void *data ATTRIBUTE_UNUSED)
> > +bool
> > +assert_is_empty (const_basic_block const &, edge_prediction *const &value,
> > + void *)
> > {
> > - gcc_assert (!*value);
> > + gcc_assert (!value);
> > return false;
> > }
> > #endif
> > @@ -2375,7 +2373,7 @@ tree_estimate_probability (void)
> > create_preheaders (CP_SIMPLE_PREHEADERS);
> > calculate_dominance_info (CDI_POST_DOMINATORS);
> >
> > - bb_predictions = pointer_map_create ();
> > + bb_predictions = new hash_map<const_basic_block, edge_prediction *>;
> > tree_bb_level_predictions ();
> > record_loop_exits ();
> >
> > @@ -2389,9 +2387,9 @@ tree_estimate_probability (void)
> > combine_predictions_for_bb (bb);
> >
> > #ifdef ENABLE_CHECKING
> > - pointer_map_traverse (bb_predictions, assert_is_empty, NULL);
> > + bb_predictions->traverse<void *, assert_is_empty> (NULL);
> > #endif
> > - pointer_map_destroy (bb_predictions);
> > + delete bb_predictions;
> > bb_predictions = NULL;
> >
> > estimate_bb_frequencies (false);
> > diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c
> > index e034762..cfa6527 100644
> > --- a/gcc/tree-cfg.c
> > +++ b/gcc/tree-cfg.c
> > @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see
> > #include "system.h"
> > #include "coretypes.h"
> > #include "hash-table.h"
> > +#include "hash-map.h"
> > #include "tm.h"
> > #include "tree.h"
> > #include "trans-mem.h"
> > @@ -92,7 +93,7 @@ static const int initial_cfg_capacity = 20;
> > more persistent. The key is getting notification of changes to
> > the CFG (particularly edge removal, creation and redirection). */
> >
> > -static struct pointer_map_t *edge_to_cases;
> > +static hash_map<edge, tree> *edge_to_cases;
> >
> > /* If we record edge_to_cases, this bitmap will hold indexes
> > of basic blocks that end in a GIMPLE_SWITCH which we touched
> > @@ -1048,19 +1049,17 @@ make_cond_expr_edges (basic_block bb)
> > SWITCH_EXPRs and structure sharing rules, then free the hash table
> > element. */
> >
> > -static bool
> > -edge_to_cases_cleanup (const void *key ATTRIBUTE_UNUSED, void **value,
> > - void *data ATTRIBUTE_UNUSED)
> > +bool
> > +edge_to_cases_cleanup (edge const &, tree const &value, void *)
> > {
> > tree t, next;
> >
> > - for (t = (tree) *value; t; t = next)
> > + for (t = value; t; t = next)
> > {
> > next = CASE_CHAIN (t);
> > CASE_CHAIN (t) = NULL;
> > }
> >
> > - *value = NULL;
> > return true;
> > }
> >
> > @@ -1070,7 +1069,7 @@ void
> > start_recording_case_labels (void)
> > {
> > gcc_assert (edge_to_cases == NULL);
> > - edge_to_cases = pointer_map_create ();
> > + edge_to_cases = new hash_map<edge, tree>;
> > touched_switch_bbs = BITMAP_ALLOC (NULL);
> > }
> >
> > @@ -1089,8 +1088,8 @@ end_recording_case_labels (void)
> > {
> > bitmap_iterator bi;
> > unsigned i;
> > - pointer_map_traverse (edge_to_cases, edge_to_cases_cleanup, NULL);
> > - pointer_map_destroy (edge_to_cases);
> > + edge_to_cases->traverse<void *, edge_to_cases_cleanup> (NULL);
> > + delete edge_to_cases;
> > edge_to_cases = NULL;
> > EXECUTE_IF_SET_IN_BITMAP (touched_switch_bbs, 0, i, bi)
> > {
> > @@ -1113,7 +1112,7 @@ end_recording_case_labels (void)
> > static tree
> > get_cases_for_edge (edge e, gimple t)
> > {
> > - void **slot;
> > + tree *slot;
> > size_t i, n;
> >
> > /* If we are not recording cases, then we do not have CASE_LABEL_EXPR
> > @@ -1121,9 +1120,9 @@ get_cases_for_edge (edge e, gimple t)
> > if (!recording_case_labels_p ())
> > return NULL;
> >
> > - slot = pointer_map_contains (edge_to_cases, e);
> > + slot = edge_to_cases->get (e);
> > if (slot)
> > - return (tree) *slot;
> > + return *slot;
> >
> > /* If we did not find E in the hash table, then this must be the first
> > time we have been queried for information about E & T. Add all the
> > @@ -1139,12 +1138,12 @@ get_cases_for_edge (edge e, gimple t)
> >
> > /* Add it to the chain of CASE_LABEL_EXPRs referencing E, or create
> > a new chain. */
> > - slot = pointer_map_insert (edge_to_cases, this_edge);
> > - CASE_CHAIN (elt) = (tree) *slot;
> > - *slot = elt;
> > + tree &s = edge_to_cases->get_or_insert (this_edge);
> > + CASE_CHAIN (elt) = s;
> > + s = elt;
> > }
> >
> > - return (tree) *pointer_map_contains (edge_to_cases, e);
> > + return *edge_to_cases->get (e);
> > }
> >
> > /* Create the edges for a GIMPLE_SWITCH starting at block BB. */
> > @@ -2577,12 +2576,11 @@ last_and_only_stmt (basic_block bb)
> > static void
> > reinstall_phi_args (edge new_edge, edge old_edge)
> > {
> > - edge_var_map_vector *v;
> > edge_var_map *vm;
> > int i;
> > gimple_stmt_iterator phis;
> >
> > - v = redirect_edge_var_map_vector (old_edge);
> > + vec<edge_var_map> *v = redirect_edge_var_map_vector (old_edge);
> > if (!v)
> > return;
> >
> > @@ -6268,22 +6266,20 @@ gather_blocks_in_sese_region (basic_block entry, basic_block exit,
> > The duplicates are recorded in VARS_MAP. */
> >
> > static void
> > -replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
> > +replace_by_duplicate_decl (tree *tp, hash_map<tree, tree> *vars_map,
> > tree to_context)
> > {
> > tree t = *tp, new_t;
> > struct function *f = DECL_STRUCT_FUNCTION (to_context);
> > - void **loc;
> >
> > if (DECL_CONTEXT (t) == to_context)
> > return;
> >
> > - loc = pointer_map_contains (vars_map, t);
> > + bool existed;
> > + tree &loc = vars_map->get_or_insert (t, &existed);
> >
> > - if (!loc)
> > + if (!existed)
> > {
> > - loc = pointer_map_insert (vars_map, t);
> > -
> > if (SSA_VAR_P (t))
> > {
> > new_t = copy_var_decl (t, DECL_NAME (t), TREE_TYPE (t));
> > @@ -6296,10 +6292,10 @@ replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
> > }
> > DECL_CONTEXT (new_t) = to_context;
> >
> > - *loc = new_t;
> > + loc = new_t;
> > }
> > else
> > - new_t = (tree) *loc;
> > + new_t = loc;
> >
> > *tp = new_t;
> > }
> > @@ -6309,15 +6305,14 @@ replace_by_duplicate_decl (tree *tp, struct pointer_map_t *vars_map,
> > VARS_MAP maps old ssa names and var_decls to the new ones. */
> >
> > static tree
> > -replace_ssa_name (tree name, struct pointer_map_t *vars_map,
> > +replace_ssa_name (tree name, hash_map<tree, tree> *vars_map,
> > tree to_context)
> > {
> > - void **loc;
> > tree new_name;
> >
> > gcc_assert (!virtual_operand_p (name));
> >
> > - loc = pointer_map_contains (vars_map, name);
> > + tree *loc = vars_map->get (name);
> >
> > if (!loc)
> > {
> > @@ -6335,11 +6330,10 @@ replace_ssa_name (tree name, struct pointer_map_t *vars_map,
> > new_name = copy_ssa_name_fn (DECL_STRUCT_FUNCTION (to_context),
> > name, SSA_NAME_DEF_STMT (name));
> >
> > - loc = pointer_map_insert (vars_map, name);
> > - *loc = new_name;
> > + vars_map->put (name, new_name);
> > }
> > else
> > - new_name = (tree) *loc;
> > + new_name = *loc;
> >
> > return new_name;
> > }
> > @@ -6350,9 +6344,9 @@ struct move_stmt_d
> > tree new_block;
> > tree from_context;
> > tree to_context;
> > - struct pointer_map_t *vars_map;
> > + hash_map<tree, tree> *vars_map;
> > htab_t new_label_map;
> > - struct pointer_map_t *eh_map;
> > + hash_map<void *, void *> *eh_map;
> > bool remap_decls_p;
> > };
> >
> > @@ -6429,11 +6423,9 @@ static int
> > move_stmt_eh_region_nr (int old_nr, struct move_stmt_d *p)
> > {
> > eh_region old_r, new_r;
> > - void **slot;
> >
> > old_r = get_eh_region_from_number (old_nr);
> > - slot = pointer_map_contains (p->eh_map, old_r);
> > - new_r = (eh_region) *slot;
> > + new_r = static_cast<eh_region> (*p->eh_map->get (old_r));
> >
> > return new_r->index;
> > }
> > @@ -6767,7 +6759,7 @@ new_label_mapper (tree decl, void *data)
> > subblocks. */
> >
> > static void
> > -replace_block_vars_by_duplicates (tree block, struct pointer_map_t *vars_map,
> > +replace_block_vars_by_duplicates (tree block, hash_map<tree, tree> *vars_map,
> > tree to_context)
> > {
> > tree *tp, t;
> > @@ -6845,7 +6837,7 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
> > edge e;
> > edge_iterator ei;
> > htab_t new_label_map;
> > - struct pointer_map_t *vars_map, *eh_map;
> > + hash_map<void *, void *> *eh_map;
> > struct loop *loop = entry_bb->loop_father;
> > struct loop *loop0 = get_loop (saved_cfun, 0);
> > struct move_stmt_d d;
> > @@ -6989,14 +6981,14 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
> > /* Move blocks from BBS into DEST_CFUN. */
> > gcc_assert (bbs.length () >= 2);
> > after = dest_cfun->cfg->x_entry_block_ptr;
> > - vars_map = pointer_map_create ();
> > + hash_map<tree, tree> vars_map;
> >
> > memset (&d, 0, sizeof (d));
> > d.orig_block = orig_block;
> > d.new_block = DECL_INITIAL (dest_cfun->decl);
> > d.from_context = cfun->decl;
> > d.to_context = dest_cfun->decl;
> > - d.vars_map = vars_map;
> > + d.vars_map = &vars_map;
> > d.new_label_map = new_label_map;
> > d.eh_map = eh_map;
> > d.remap_decls_p = true;
> > @@ -7051,13 +7043,12 @@ move_sese_region_to_fn (struct function *dest_cfun, basic_block entry_bb,
> > }
> >
> > replace_block_vars_by_duplicates (DECL_INITIAL (dest_cfun->decl),
> > - vars_map, dest_cfun->decl);
> > + &vars_map, dest_cfun->decl);
> >
> > if (new_label_map)
> > htab_delete (new_label_map);
> > if (eh_map)
> > - pointer_map_destroy (eh_map);
> > - pointer_map_destroy (vars_map);
> > + delete eh_map;
> >
> > /* Rewire the entry and exit blocks. The successor to the entry
> > block turns into the successor of DEST_FN's ENTRY_BLOCK_PTR in
> > diff --git a/gcc/tree-cfgcleanup.c b/gcc/tree-cfgcleanup.c
> > index bc4d83e..2b6927e 100644
> > --- a/gcc/tree-cfgcleanup.c
> > +++ b/gcc/tree-cfgcleanup.c
> > @@ -865,16 +865,14 @@ remove_forwarder_block_with_phi (basic_block bb)
> >
> > if (TREE_CODE (def) == SSA_NAME)
> > {
> > - edge_var_map_vector *head;
> > - edge_var_map *vm;
> > - size_t i;
> > -
> > /* If DEF is one of the results of PHI nodes removed during
> > redirection, replace it with the PHI argument that used
> > to be on E. */
> > - head = redirect_edge_var_map_vector (e);
> > - FOR_EACH_VEC_SAFE_ELT (head, i, vm)
> > + vec<edge_var_map> *head = redirect_edge_var_map_vector (e);
> > + size_t length = head ? head->length () : 0;
> > + for (size_t i = 0; i < length; i++)
> > {
> > + edge_var_map *vm = &(*head)[i];
> > tree old_arg = redirect_edge_var_map_result (vm);
> > tree new_arg = redirect_edge_var_map_def (vm);
> >
> > diff --git a/gcc/tree-eh.c b/gcc/tree-eh.c
> > index 38842e8..db28184 100644
> > --- a/gcc/tree-eh.c
> > +++ b/gcc/tree-eh.c
> > @@ -406,7 +406,7 @@ struct leh_tf_state
> > size_t goto_queue_active;
> >
> > /* Pointer map to help in searching goto_queue when it is large. */
> > - struct pointer_map_t *goto_queue_map;
> > + hash_map<gimple, goto_queue_node *> *goto_queue_map;
> >
> > /* The set of unique labels seen as entries in the goto queue. */
> > vec<tree> dest_array;
> > @@ -441,7 +441,6 @@ static gimple_seq
> > find_goto_replacement (struct leh_tf_state *tf, treemple stmt)
> > {
> > unsigned int i;
> > - void **slot;
> >
> > if (tf->goto_queue_active < LARGE_GOTO_QUEUE)
> > {
> > @@ -456,19 +455,18 @@ find_goto_replacement (struct leh_tf_state *tf, treemple stmt)
> >
> > if (!tf->goto_queue_map)
> > {
> > - tf->goto_queue_map = pointer_map_create ();
> > + tf->goto_queue_map = new hash_map<gimple, goto_queue_node *>;
> > for (i = 0; i < tf->goto_queue_active; i++)
> > {
> > - slot = pointer_map_insert (tf->goto_queue_map,
> > - tf->goto_queue[i].stmt.g);
> > - gcc_assert (*slot == NULL);
> > - *slot = &tf->goto_queue[i];
> > + bool existed = tf->goto_queue_map->put (tf->goto_queue[i].stmt.g,
> > + &tf->goto_queue[i]);
> > + gcc_assert (!existed);
> > }
> > }
> >
> > - slot = pointer_map_contains (tf->goto_queue_map, stmt.g);
> > + goto_queue_node **slot = tf->goto_queue_map->get (stmt.g);
> > if (slot != NULL)
> > - return (((struct goto_queue_node *) *slot)->repl_stmt);
> > + return ((*slot)->repl_stmt);
> >
> > return NULL;
> > }
> > @@ -1372,7 +1370,7 @@ lower_try_finally_switch (struct leh_state *state, struct leh_tf_state *tf)
> > tree tmp;
> > gimple switch_stmt;
> > gimple_seq finally;
> > - struct pointer_map_t *cont_map = NULL;
> > + hash_map<tree, gimple> *cont_map = NULL;
> > /* The location of the TRY_FINALLY stmt. */
> > location_t tf_loc = gimple_location (tf->try_finally_expr);
> > /* The location of the finally block. */
> > @@ -1511,32 +1509,27 @@ lower_try_finally_switch (struct leh_state *state, struct leh_tf_state *tf)
> > if (case_label_vec.length () <= case_index || !case_label_vec[case_index])
> > {
> > tree case_lab;
> > - void **slot;
> > tmp = build_int_cst (integer_type_node, switch_id);
> > case_lab = build_case_label (tmp, NULL,
> > create_artificial_label (tf_loc));
> > /* We store the cont_stmt in the pointer map, so that we can recover
> > it in the loop below. */
> > if (!cont_map)
> > - cont_map = pointer_map_create ();
> > - slot = pointer_map_insert (cont_map, case_lab);
> > - *slot = q->cont_stmt;
> > + cont_map = new hash_map<tree, gimple>;
> > + cont_map->put (case_lab, q->cont_stmt);
> > case_label_vec.quick_push (case_lab);
> > }
> > }
> > for (j = last_case_index; j < last_case_index + nlabels; j++)
> > {
> > gimple cont_stmt;
> > - void **slot;
> >
> > last_case = case_label_vec[j];
> >
> > gcc_assert (last_case);
> > gcc_assert (cont_map);
> >
> > - slot = pointer_map_contains (cont_map, last_case);
> > - gcc_assert (slot);
> > - cont_stmt = *(gimple *) slot;
> > + cont_stmt = *cont_map->get (last_case);
> >
> > x = gimple_build_label (CASE_LABEL (last_case));
> > gimple_seq_add_stmt (&switch_body, x);
> > @@ -1544,7 +1537,7 @@ lower_try_finally_switch (struct leh_state *state, struct leh_tf_state *tf)
> > maybe_record_in_goto_queue (state, cont_stmt);
> > }
> > if (cont_map)
> > - pointer_map_destroy (cont_map);
> > + delete cont_map;
> >
> > replace_goto_queue (tf);
> >
> > @@ -1734,7 +1727,7 @@ lower_try_finally (struct leh_state *state, gimple tp)
> > this_tf.dest_array.release ();
> > free (this_tf.goto_queue);
> > if (this_tf.goto_queue_map)
> > - pointer_map_destroy (this_tf.goto_queue_map);
> > + delete this_tf.goto_queue_map;
> >
> > /* If there was an old (aka outer) eh_seq, append the current eh_seq.
> > If there was no old eh_seq, then the append is trivially already done. */
> > @@ -2921,10 +2914,10 @@ maybe_clean_or_replace_eh_stmt (gimple old_stmt, gimple new_stmt)
> > bool
> > maybe_duplicate_eh_stmt_fn (struct function *new_fun, gimple new_stmt,
> > struct function *old_fun, gimple old_stmt,
> > - struct pointer_map_t *map, int default_lp_nr)
> > + hash_map<void *, void *> *map,
> > + int default_lp_nr)
> > {
> > int old_lp_nr, new_lp_nr;
> > - void **slot;
> >
> > if (!stmt_could_throw_p (new_stmt))
> > return false;
> > @@ -2941,8 +2934,7 @@ maybe_duplicate_eh_stmt_fn (struct function *new_fun, gimple new_stmt,
> > eh_landing_pad old_lp, new_lp;
> >
> > old_lp = (*old_fun->eh->lp_array)[old_lp_nr];
> > - slot = pointer_map_contains (map, old_lp);
> > - new_lp = (eh_landing_pad) *slot;
> > + new_lp = static_cast<eh_landing_pad> (*map->get (old_lp));
> > new_lp_nr = new_lp->index;
> > }
> > else
> > @@ -2950,8 +2942,7 @@ maybe_duplicate_eh_stmt_fn (struct function *new_fun, gimple new_stmt,
> > eh_region old_r, new_r;
> >
> > old_r = (*old_fun->eh->region_array)[-old_lp_nr];
> > - slot = pointer_map_contains (map, old_r);
> > - new_r = (eh_region) *slot;
> > + new_r = static_cast<eh_region> (*map->get (old_r));
> > new_lp_nr = -new_r->index;
> > }
> >
> > @@ -3154,7 +3145,7 @@ make_pass_refactor_eh (gcc::context *ctxt)
> > /* At the end of gimple optimization, we can lower RESX. */
> >
> > static bool
> > -lower_resx (basic_block bb, gimple stmt, struct pointer_map_t *mnt_map)
> > +lower_resx (basic_block bb, gimple stmt, hash_map<eh_region, tree> *mnt_map)
> > {
> > int lp_nr;
> > eh_region src_r, dst_r;
> > @@ -3199,14 +3190,13 @@ lower_resx (basic_block bb, gimple stmt, struct pointer_map_t *mnt_map)
> > if (lp_nr < 0)
> > {
> > basic_block new_bb;
> > - void **slot;
> > tree lab;
> >
> > /* We are resuming into a MUST_NOT_CALL region. Expand a call to
> > the failure decl into a new block, if needed. */
> > gcc_assert (dst_r->type == ERT_MUST_NOT_THROW);
> >
> > - slot = pointer_map_contains (mnt_map, dst_r);
> > + tree *slot = mnt_map->get (dst_r);
> > if (slot == NULL)
> > {
> > gimple_stmt_iterator gsi2;
> > @@ -3221,12 +3211,11 @@ lower_resx (basic_block bb, gimple stmt, struct pointer_map_t *mnt_map)
> > gimple_set_location (x, dst_r->u.must_not_throw.failure_loc);
> > gsi_insert_after (&gsi2, x, GSI_CONTINUE_LINKING);
> >
> > - slot = pointer_map_insert (mnt_map, dst_r);
> > - *slot = lab;
> > + mnt_map->put (dst_r, lab);
> > }
> > else
> > {
> > - lab = (tree) *slot;
> > + lab = *slot;
> > new_bb = label_to_block (lab);
> > }
> >
> > @@ -3334,24 +3323,21 @@ unsigned
> > pass_lower_resx::execute (function *fun)
> > {
> > basic_block bb;
> > - struct pointer_map_t *mnt_map;
> > bool dominance_invalidated = false;
> > bool any_rewritten = false;
> >
> > - mnt_map = pointer_map_create ();
> > + hash_map<eh_region, tree> mnt_map;
> >
> > FOR_EACH_BB_FN (bb, fun)
> > {
> > gimple last = last_stmt (bb);
> > if (last && is_gimple_resx (last))
> > {
> > - dominance_invalidated |= lower_resx (bb, last, mnt_map);
> > + dominance_invalidated |= lower_resx (bb, last, &mnt_map);
> > any_rewritten = true;
> > }
> > }
> >
> > - pointer_map_destroy (mnt_map);
> > -
> > if (dominance_invalidated)
> > {
> > free_dominance_info (CDI_DOMINATORS);
> > diff --git a/gcc/tree-eh.h b/gcc/tree-eh.h
> > index cd9b40d..51c2adc 100644
> > --- a/gcc/tree-eh.h
> > +++ b/gcc/tree-eh.h
> > @@ -20,6 +20,10 @@ along with GCC; see the file COPYING3. If not see
> > #ifndef GCC_TREE_EH_H
> > #define GCC_TREE_EH_H
> >
> > +#include "hash-map.h"
> > +
> > +typedef struct eh_region_d *eh_region;
> > +
> > extern void using_eh_for_cleanups (void);
> > extern void add_stmt_to_eh_lp (gimple, int);
> > extern bool remove_stmt_from_eh_lp_fn (struct function *, gimple);
> > @@ -43,7 +47,7 @@ extern bool maybe_clean_eh_stmt (gimple);
> > extern bool maybe_clean_or_replace_eh_stmt (gimple, gimple);
> > extern bool maybe_duplicate_eh_stmt_fn (struct function *, gimple,
> > struct function *, gimple,
> > - struct pointer_map_t *, int);
> > + hash_map<void *, void *> *, int);
> > extern bool maybe_duplicate_eh_stmt (gimple, gimple);
> > extern void maybe_remove_unreachable_handlers (void);
> > extern bool verify_eh_edges (gimple);
> > diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
> > index 6af4912..e2b7990 100644
> > --- a/gcc/tree-inline.c
> > +++ b/gcc/tree-inline.c
> > @@ -135,7 +135,7 @@ static tree declare_return_variable (copy_body_data *, tree, tree, basic_block);
> > static void remap_block (tree *, copy_body_data *);
> > static void copy_bind_expr (tree *, int *, copy_body_data *);
> > static void declare_inline_vars (tree, tree);
> > -static void remap_save_expr (tree *, void *, int *);
> > +static void remap_save_expr (tree *, hash_map<tree, tree> *, int *);
> > static void prepend_lexical_block (tree current_block, tree new_block);
> > static tree copy_decl_to_var (tree, copy_body_data *);
> > static tree copy_result_decl_to_var (tree, copy_body_data *);
> > @@ -149,12 +149,12 @@ static bool delete_unreachable_blocks_update_callgraph (copy_body_data *id);
> > void
> > insert_decl_map (copy_body_data *id, tree key, tree value)
> > {
> > - *pointer_map_insert (id->decl_map, key) = value;
> > + id->decl_map->put (key, value);
> >
> > /* Always insert an identity map as well. If we see this same new
> > node again, we won't want to duplicate it a second time. */
> > if (key != value)
> > - *pointer_map_insert (id->decl_map, value) = value;
> > + id->decl_map->put (value, value);
> > }
> >
> > /* Insert a tree->tree mapping for ID. This is only used for
> > @@ -176,9 +176,9 @@ insert_debug_decl_map (copy_body_data *id, tree key, tree value)
> > gcc_assert (TREE_CODE (value) == VAR_DECL);
> >
> > if (!id->debug_map)
> > - id->debug_map = pointer_map_create ();
> > + id->debug_map = new hash_map<tree, tree>;
> >
> > - *pointer_map_insert (id->debug_map, key) = value;
> > + id->debug_map->put (key, value);
> > }
> >
> > /* If nonzero, we're remapping the contents of inlined debug
> > @@ -197,7 +197,7 @@ remap_ssa_name (tree name, copy_body_data *id)
> >
> > gcc_assert (TREE_CODE (name) == SSA_NAME);
> >
> > - n = (tree *) pointer_map_contains (id->decl_map, name);
> > + n = id->decl_map->get (name);
> > if (n)
> > return unshare_expr (*n);
> >
> > @@ -213,7 +213,7 @@ remap_ssa_name (tree name, copy_body_data *id)
> > gimple_stmt_iterator gsi;
> > tree val = SSA_NAME_VAR (name);
> >
> > - n = (tree *) pointer_map_contains (id->decl_map, val);
> > + n = id->decl_map->get (val);
> > if (n != NULL)
> > val = *n;
> > if (TREE_CODE (val) != PARM_DECL)
> > @@ -342,7 +342,7 @@ remap_decl (tree decl, copy_body_data *id)
> >
> > /* See if we have remapped this declaration. */
> >
> > - n = (tree *) pointer_map_contains (id->decl_map, decl);
> > + n = id->decl_map->get (decl);
> >
> > if (!n && processing_debug_stmt)
> > {
> > @@ -562,7 +562,7 @@ remap_type (tree type, copy_body_data *id)
> > return type;
> >
> > /* See if we have remapped this type. */
> > - node = (tree *) pointer_map_contains (id->decl_map, type);
> > + node = id->decl_map->get (type);
> > if (node)
> > return *node;
> >
> > @@ -887,7 +887,7 @@ remap_gimple_op_r (tree *tp, int *walk_subtrees, void *data)
> > {
> > /* If the enclosing record type is variably_modified_type_p, the field
> > has already been remapped. Otherwise, it need not be. */
> > - tree *n = (tree *) pointer_map_contains (id->decl_map, *tp);
> > + tree *n = id->decl_map->get (*tp);
> > if (n)
> > *tp = *n;
> > *walk_subtrees = 0;
> > @@ -981,8 +981,7 @@ remap_gimple_op_r (tree *tp, int *walk_subtrees, void *data)
> > if (old_block)
> > {
> > tree *n;
> > - n = (tree *) pointer_map_contains (id->decl_map,
> > - TREE_BLOCK (*tp));
> > + n = id->decl_map->get (TREE_BLOCK (*tp));
> > if (n)
> > new_block = *n;
> > }
> > @@ -1108,7 +1107,7 @@ copy_tree_body_r (tree *tp, int *walk_subtrees, void *data)
> > tree decl = TREE_OPERAND (*tp, 0), value;
> > tree *n;
> >
> > - n = (tree *) pointer_map_contains (id->decl_map, decl);
> > + n = id->decl_map->get (decl);
> > if (n)
> > {
> > value = *n;
> > @@ -1125,7 +1124,7 @@ copy_tree_body_r (tree *tp, int *walk_subtrees, void *data)
> > /* Get rid of *& from inline substitutions that can happen when a
> > pointer argument is an ADDR_EXPR. */
> > tree decl = TREE_OPERAND (*tp, 0);
> > - tree *n = (tree *) pointer_map_contains (id->decl_map, decl);
> > + tree *n = id->decl_map->get (decl);
> > if (n)
> > {
> > /* If we happen to get an ADDR_EXPR in n->value, strip
> > @@ -1206,8 +1205,7 @@ copy_tree_body_r (tree *tp, int *walk_subtrees, void *data)
> > if (TREE_BLOCK (*tp))
> > {
> > tree *n;
> > - n = (tree *) pointer_map_contains (id->decl_map,
> > - TREE_BLOCK (*tp));
> > + n = id->decl_map->get (TREE_BLOCK (*tp));
> > if (n)
> > new_block = *n;
> > }
> > @@ -1261,11 +1259,9 @@ static int
> > remap_eh_region_nr (int old_nr, copy_body_data *id)
> > {
> > eh_region old_r, new_r;
> > - void **slot;
> >
> > old_r = get_eh_region_from_number_fn (id->src_cfun, old_nr);
> > - slot = pointer_map_contains (id->eh_map, old_r);
> > - new_r = (eh_region) *slot;
> > + new_r = static_cast<eh_region> (*id->eh_map->get (old_r));
> >
> > return new_r->index;
> > }
> > @@ -1483,7 +1479,7 @@ remap_gimple_stmt (gimple stmt, copy_body_data *id)
> > tree decl = gimple_assign_lhs (stmt), value;
> > tree *n;
> >
> > - n = (tree *) pointer_map_contains (id->decl_map, decl);
> > + n = id->decl_map->get (decl);
> > if (n)
> > {
> > value = *n;
> > @@ -1597,7 +1593,7 @@ remap_gimple_stmt (gimple stmt, copy_body_data *id)
> > if (gimple_block (copy))
> > {
> > tree *n;
> > - n = (tree *) pointer_map_contains (id->decl_map, gimple_block (copy));
> > + n = id->decl_map->get (gimple_block (copy));
> > gcc_assert (n);
> > gimple_set_block (copy, *n);
> > }
> > @@ -2191,8 +2187,7 @@ copy_phis_for_bb (basic_block bb, copy_body_data *id)
> > if (LOCATION_BLOCK (locus))
> > {
> > tree *n;
> > - n = (tree *) pointer_map_contains (id->decl_map,
> > - LOCATION_BLOCK (locus));
> > + n = id->decl_map->get (LOCATION_BLOCK (locus));
> > gcc_assert (n);
> > if (*n)
> > locus = COMBINE_LOCATION_DATA (line_table, locus, *n);
> > @@ -2638,7 +2633,7 @@ copy_cfg_body (copy_body_data * id, gcov_type count, int frequency_scale,
> >
> > if (id->eh_map)
> > {
> > - pointer_map_destroy (id->eh_map);
> > + delete id->eh_map;
> > id->eh_map = NULL;
> > }
> >
> > @@ -2659,7 +2654,7 @@ copy_debug_stmt (gimple stmt, copy_body_data *id)
> >
> > if (gimple_block (stmt))
> > {
> > - n = (tree *) pointer_map_contains (id->decl_map, gimple_block (stmt));
> > + n = id->decl_map->get (gimple_block (stmt));
> > gimple_set_block (stmt, n ? *n : id->block);
> > }
> >
> > @@ -2675,14 +2670,14 @@ copy_debug_stmt (gimple stmt, copy_body_data *id)
> > t = gimple_debug_bind_get_var (stmt);
> >
> > if (TREE_CODE (t) == PARM_DECL && id->debug_map
> > - && (n = (tree *) pointer_map_contains (id->debug_map, t)))
> > + && (n = id->debug_map->get (t)))
> > {
> > gcc_assert (TREE_CODE (*n) == VAR_DECL);
> > t = *n;
> > }
> > else if (TREE_CODE (t) == VAR_DECL
> > && !is_global_var (t)
> > - && !pointer_map_contains (id->decl_map, t))
> > + && !id->decl_map->get (t))
> > /* T is a non-localized variable. */;
> > else
> > walk_tree (&t, remap_gimple_op_r, &wi, NULL);
> > @@ -3076,7 +3071,7 @@ initialize_inlined_parameters (copy_body_data *id, gimple stmt,
> > parameter following the array. */
> > for (p = parms, i = 0; p; p = DECL_CHAIN (p), i++)
> > {
> > - tree *varp = (tree *) pointer_map_contains (id->decl_map, p);
> > + tree *varp = id->decl_map->get (p);
> > if (varp
> > && TREE_CODE (*varp) == VAR_DECL)
> > {
> > @@ -3089,7 +3084,7 @@ initialize_inlined_parameters (copy_body_data *id, gimple stmt,
> > by the parameter setup. */
> > if (def)
> > {
> > - tree *defp = (tree *) pointer_map_contains (id->decl_map, def);
> > + tree *defp = id->decl_map->get (def);
> > if (defp
> > && TREE_CODE (*defp) == SSA_NAME
> > && SSA_NAME_VAR (*defp) == var)
> > @@ -4135,7 +4130,8 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
> > {
> > tree use_retvar;
> > tree fn;
> > - struct pointer_map_t *st, *dst;
> > + hash_map<tree, tree> *dst;
> > + hash_map<tree, tree> *st = NULL;
> > tree return_slot;
> > tree modify_dest;
> > location_t saved_location;
> > @@ -4291,7 +4287,7 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
> > /* Local declarations will be replaced by their equivalents in this
> > map. */
> > st = id->decl_map;
> > - id->decl_map = pointer_map_create ();
> > + id->decl_map = new hash_map<tree, tree>;
> > dst = id->debug_map;
> > id->debug_map = NULL;
> >
> > @@ -4415,10 +4411,10 @@ expand_call_inline (basic_block bb, gimple stmt, copy_body_data *id)
> > /* Clean up. */
> > if (id->debug_map)
> > {
> > - pointer_map_destroy (id->debug_map);
> > + delete id->debug_map;
> > id->debug_map = dst;
> > }
> > - pointer_map_destroy (id->decl_map);
> > + delete id->decl_map;
> > id->decl_map = st;
> >
> > /* Unlink the calls virtual operands before replacing it. */
> > @@ -4772,14 +4768,13 @@ copy_tree_r (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
> > the function into which the copy will be placed. */
> >
> > static void
> > -remap_save_expr (tree *tp, void *st_, int *walk_subtrees)
> > +remap_save_expr (tree *tp, hash_map<tree, tree> *st, int *walk_subtrees)
> > {
> > - struct pointer_map_t *st = (struct pointer_map_t *) st_;
> > tree *n;
> > tree t;
> >
> > /* See if we already encountered this SAVE_EXPR. */
> > - n = (tree *) pointer_map_contains (st, *tp);
> > + n = st->get (*tp);
> >
> > /* If we didn't already remap this SAVE_EXPR, do so now. */
> > if (!n)
> > @@ -4787,9 +4782,9 @@ remap_save_expr (tree *tp, void *st_, int *walk_subtrees)
> > t = copy_node (*tp);
> >
> > /* Remember this SAVE_EXPR. */
> > - *pointer_map_insert (st, *tp) = t;
> > + st->put (*tp, t);
> > /* Make sure we don't remap an already-remapped SAVE_EXPR. */
> > - *pointer_map_insert (st, t) = t;
> > + st->put (t, t);
> > }
> > else
> > {
> > @@ -4836,7 +4831,7 @@ replace_locals_op (tree *tp, int *walk_subtrees, void *data)
> > {
> > struct walk_stmt_info *wi = (struct walk_stmt_info*) data;
> > copy_body_data *id = (copy_body_data *) wi->info;
> > - struct pointer_map_t *st = id->decl_map;
> > + hash_map<tree, tree> *st = id->decl_map;
> > tree *n;
> > tree expr = *tp;
> >
> > @@ -4846,7 +4841,7 @@ replace_locals_op (tree *tp, int *walk_subtrees, void *data)
> > || TREE_CODE (expr) == LABEL_DECL)
> > {
> > /* Lookup the declaration. */
> > - n = (tree *) pointer_map_contains (st, expr);
> > + n = st->get (expr);
> >
> > /* If it's there, remap it. */
> > if (n)
> > @@ -4928,7 +4923,7 @@ copy_gimple_seq_and_replace_locals (gimple_seq seq)
> > memset (&id, 0, sizeof (id));
> > id.src_fn = current_function_decl;
> > id.dst_fn = current_function_decl;
> > - id.decl_map = pointer_map_create ();
> > + id.decl_map = new hash_map<tree, tree>;
> > id.debug_map = NULL;
> >
> > id.copy_decl = copy_decl_no_change;
> > @@ -4953,9 +4948,9 @@ copy_gimple_seq_and_replace_locals (gimple_seq seq)
> > walk_gimple_seq (copy, replace_locals_stmt, replace_locals_op, &wi);
> >
> > /* Clean up. */
> > - pointer_map_destroy (id.decl_map);
> > + delete id.decl_map;
> > if (id.debug_map)
> > - pointer_map_destroy (id.debug_map);
> > + delete id.debug_map;
> >
> > return copy;
> > }
> > @@ -5145,7 +5140,7 @@ copy_arguments_for_versioning (tree orig_parm, copy_body_data * id,
> > *parg = new_tree;
> > parg = &DECL_CHAIN (new_tree);
> > }
> > - else if (!pointer_map_contains (id->decl_map, arg))
> > + else if (!id->decl_map->get (arg))
> > {
> > /* Make an equivalent VAR_DECL. If the argument was used
> > as temporary variable later in function, the uses will be
> > @@ -5368,7 +5363,7 @@ tree_function_versioning (tree old_decl, tree new_decl,
> > /* Generate a new name for the new version. */
> > id.statements_to_fold = new hash_set<gimple>;
> >
> > - id.decl_map = pointer_map_create ();
> > + id.decl_map = new hash_map<tree, tree>;
> > id.debug_map = NULL;
> > id.src_fn = old_decl;
> > id.dst_fn = new_decl;
> > @@ -5530,9 +5525,9 @@ tree_function_versioning (tree old_decl, tree new_decl,
> > }
> >
> > /* Clean up. */
> > - pointer_map_destroy (id.decl_map);
> > + delete id.decl_map;
> > if (id.debug_map)
> > - pointer_map_destroy (id.debug_map);
> > + delete id.debug_map;
> > free_dominance_info (CDI_DOMINATORS);
> > free_dominance_info (CDI_POST_DOMINATORS);
> >
> > @@ -5587,22 +5582,22 @@ maybe_inline_call_in_expr (tree exp)
> > /* We can only try to inline "const" functions. */
> > if (fn && TREE_READONLY (fn) && DECL_SAVED_TREE (fn))
> > {
> > - struct pointer_map_t *decl_map = pointer_map_create ();
> > call_expr_arg_iterator iter;
> > copy_body_data id;
> > tree param, arg, t;
> > + hash_map<tree, tree> decl_map;
> >
> > /* Remap the parameters. */
> > for (param = DECL_ARGUMENTS (fn), arg = first_call_expr_arg (exp, &iter);
> > param;
> > param = DECL_CHAIN (param), arg = next_call_expr_arg (&iter))
> > - *pointer_map_insert (decl_map, param) = arg;
> > + decl_map.put (param, arg);
> >
> > memset (&id, 0, sizeof (id));
> > id.src_fn = fn;
> > id.dst_fn = current_function_decl;
> > id.src_cfun = DECL_STRUCT_FUNCTION (fn);
> > - id.decl_map = decl_map;
> > + id.decl_map = &decl_map;
> >
> > id.copy_decl = copy_decl_no_change;
> > id.transform_call_graph_edges = CB_CGE_DUPLICATE;
> > @@ -5620,7 +5615,6 @@ maybe_inline_call_in_expr (tree exp)
> > id.eh_lp_nr = 0;
> >
> > t = copy_tree_body (&id);
> > - pointer_map_destroy (decl_map);
> >
> > /* We can only return something suitable for use in a GENERIC
> > expression tree. */
> > @@ -5642,15 +5636,15 @@ build_duplicate_type (tree type)
> > id.src_fn = current_function_decl;
> > id.dst_fn = current_function_decl;
> > id.src_cfun = cfun;
> > - id.decl_map = pointer_map_create ();
> > + id.decl_map = new hash_map<tree, tree>;
> > id.debug_map = NULL;
> > id.copy_decl = copy_decl_no_change;
> >
> > type = remap_type_1 (type, &id);
> >
> > - pointer_map_destroy (id.decl_map);
> > + delete id.decl_map;
> > if (id.debug_map)
> > - pointer_map_destroy (id.debug_map);
> > + delete id.debug_map;
> >
> > TYPE_CANONICAL (type) = type;
> >
> > diff --git a/gcc/tree-inline.h b/gcc/tree-inline.h
> > index c13e6c7..53059da 100644
> > --- a/gcc/tree-inline.h
> > +++ b/gcc/tree-inline.h
> > @@ -21,6 +21,7 @@ along with GCC; see the file COPYING3. If not see
> > #ifndef GCC_TREE_INLINE_H
> > #define GCC_TREE_INLINE_H
> >
> > +#include "hash-map.h"
> > #include "hash-set.h"
> >
> > struct cgraph_edge;
> > @@ -64,7 +65,7 @@ struct copy_body_data
> >
> > /* The map from local declarations in the inlined function to
> > equivalents in the function into which it is being inlined. */
> > - struct pointer_map_t *decl_map;
> > + hash_map<tree, tree> *decl_map;
> >
> > /* Create a new decl to replace DECL in the destination function. */
> > tree (*copy_decl) (tree, struct copy_body_data *);
> > @@ -81,7 +82,7 @@ struct copy_body_data
> >
> > /* Maps region and landing pad structures from the function being copied
> > to duplicates created within the function we inline into. */
> > - struct pointer_map_t *eh_map;
> > + hash_map<void *, void *> *eh_map;
> >
> > /* We use the same mechanism do all sorts of different things. Rather
> > than enumerating the different cases, we categorize the behavior
> > @@ -132,7 +133,7 @@ struct copy_body_data
> > equivalents in the function into which it is being inlined, where
> > the originals have been mapped to a value rather than to a
> > variable. */
> > - struct pointer_map_t *debug_map;
> > + hash_map<tree, tree> *debug_map;
> >
> > /* Cilk keywords currently need to replace some variables that
> > ordinary nested functions do not. */
> > diff --git a/gcc/tree-nested.c b/gcc/tree-nested.c
> > index 45c5cf7..7d5c039 100644
> > --- a/gcc/tree-nested.c
> > +++ b/gcc/tree-nested.c
> > @@ -93,8 +93,8 @@ struct nesting_info
> > struct nesting_info *inner;
> > struct nesting_info *next;
> >
> > - struct pointer_map_t *field_map;
> > - struct pointer_map_t *var_map;
> > + hash_map<tree, tree> *field_map;
> > + hash_map<tree, tree> *var_map;
> > hash_set<tree *> *mem_refs;
> > bitmap suppress_expansion;
> >
> > @@ -286,15 +286,13 @@ static tree
> > lookup_field_for_decl (struct nesting_info *info, tree decl,
> > enum insert_option insert)
> > {
> > - void **slot;
> > -
> > if (insert == NO_INSERT)
> > {
> > - slot = pointer_map_contains (info->field_map, decl);
> > - return slot ? (tree) *slot : NULL_TREE;
> > + tree *slot = info->field_map->get (decl);
> > + return slot ? *slot : NULL_TREE;
> > }
> >
> > - slot = pointer_map_insert (info->field_map, decl);
> > + tree *slot = &info->field_map->get_or_insert (decl);
> > if (!*slot)
> > {
> > tree field = make_node (FIELD_DECL);
> > @@ -324,7 +322,7 @@ lookup_field_for_decl (struct nesting_info *info, tree decl,
> > info->any_parm_remapped = true;
> > }
> >
> > - return (tree) *slot;
> > + return *slot;
> > }
> >
> > /* Build or return the variable that holds the static chain within
> > @@ -521,15 +519,13 @@ static tree
> > lookup_tramp_for_decl (struct nesting_info *info, tree decl,
> > enum insert_option insert)
> > {
> > - void **slot;
> > -
> > if (insert == NO_INSERT)
> > {
> > - slot = pointer_map_contains (info->var_map, decl);
> > - return slot ? (tree) *slot : NULL_TREE;
> > + tree *slot = info->var_map->get (decl);
> > + return slot ? *slot : NULL_TREE;
> > }
> >
> > - slot = pointer_map_insert (info->var_map, decl);
> > + tree *slot = &info->var_map->get_or_insert (decl);
> > if (!*slot)
> > {
> > tree field = make_node (FIELD_DECL);
> > @@ -543,7 +539,7 @@ lookup_tramp_for_decl (struct nesting_info *info, tree decl,
> > info->any_tramp_created = true;
> > }
> >
> > - return (tree) *slot;
> > + return *slot;
> > }
> >
> > /* Build or return the field within the non-local frame state that holds
> > @@ -730,8 +726,8 @@ static struct nesting_info *
> > create_nesting_tree (struct cgraph_node *cgn)
> > {
> > struct nesting_info *info = XCNEW (struct nesting_info);
> > - info->field_map = pointer_map_create ();
> > - info->var_map = pointer_map_create ();
> > + info->field_map = new hash_map<tree, tree>;
> > + info->var_map = new hash_map<tree, tree>;
> > info->mem_refs = new hash_set<tree *>;
> > info->suppress_expansion = BITMAP_ALLOC (&nesting_info_bitmap_obstack);
> > info->context = cgn->decl;
> > @@ -834,12 +830,11 @@ get_nonlocal_debug_decl (struct nesting_info *info, tree decl)
> > tree target_context;
> > struct nesting_info *i;
> > tree x, field, new_decl;
> > - void **slot;
> >
> > - slot = pointer_map_insert (info->var_map, decl);
> > + tree *slot = &info->var_map->get_or_insert (decl);
> >
> > if (*slot)
> > - return (tree) *slot;
> > + return *slot;
> >
> > target_context = decl_function_context (decl);
> >
> > @@ -1483,11 +1478,10 @@ static tree
> > get_local_debug_decl (struct nesting_info *info, tree decl, tree field)
> > {
> > tree x, new_decl;
> > - void **slot;
> >
> > - slot = pointer_map_insert (info->var_map, decl);
> > + tree *slot = &info->var_map->get_or_insert (decl);
> > if (*slot)
> > - return (tree) *slot;
> > + return *slot;
> >
> > /* Make sure frame_decl gets created. */
> > (void) get_frame_type (info);
> > @@ -2064,7 +2058,6 @@ convert_nl_goto_reference (gimple_stmt_iterator *gsi, bool *handled_ops_p,
> > {
> > struct nesting_info *const info = (struct nesting_info *) wi->info, *i;
> > tree label, new_label, target_context, x, field;
> > - void **slot;
> > gimple call;
> > gimple stmt = gsi_stmt (*gsi);
> >
> > @@ -2098,7 +2091,7 @@ convert_nl_goto_reference (gimple_stmt_iterator *gsi, bool *handled_ops_p,
> > (hairy target-specific) non-local goto receiver code to be generated
> > when we expand rtl. Enter this association into var_map so that we
> > can insert the new label into the IL during a second pass. */
> > - slot = pointer_map_insert (i->var_map, label);
> > + tree *slot = &i->var_map->get_or_insert (label);
> > if (*slot == NULL)
> > {
> > new_label = create_artificial_label (UNKNOWN_LOCATION);
> > @@ -2106,7 +2099,7 @@ convert_nl_goto_reference (gimple_stmt_iterator *gsi, bool *handled_ops_p,
> > *slot = new_label;
> > }
> > else
> > - new_label = (tree) *slot;
> > + new_label = *slot;
> >
> > /* Build: __builtin_nl_goto(new_label, &chain->nl_goto_field). */
> > field = get_nl_goto_field (i);
> > @@ -2136,7 +2129,6 @@ convert_nl_goto_receiver (gimple_stmt_iterator *gsi, bool *handled_ops_p,
> > struct nesting_info *const info = (struct nesting_info *) wi->info;
> > tree label, new_label;
> > gimple_stmt_iterator tmp_gsi;
> > - void **slot;
> > gimple stmt = gsi_stmt (*gsi);
> >
> > if (gimple_code (stmt) != GIMPLE_LABEL)
> > @@ -2147,7 +2139,7 @@ convert_nl_goto_receiver (gimple_stmt_iterator *gsi, bool *handled_ops_p,
> >
> > label = gimple_label_label (stmt);
> >
> > - slot = pointer_map_contains (info->var_map, label);
> > + tree *slot = info->var_map->get (label);
> > if (!slot)
> > {
> > *handled_ops_p = false;
> > @@ -2513,7 +2505,7 @@ static tree
> > nesting_copy_decl (tree decl, copy_body_data *id)
> > {
> > struct nesting_copy_body_data *nid = (struct nesting_copy_body_data *) id;
> > - void **slot = pointer_map_contains (nid->root->var_map, decl);
> > + tree *slot = nid->root->var_map->get (decl);
> >
> > if (slot)
> > return (tree) *slot;
> > @@ -2542,15 +2534,14 @@ contains_remapped_vars (tree *tp, int *walk_subtrees, void *data)
> > {
> > struct nesting_info *root = (struct nesting_info *) data;
> > tree t = *tp;
> > - void **slot;
> >
> > if (DECL_P (t))
> > {
> > *walk_subtrees = 0;
> > - slot = pointer_map_contains (root->var_map, t);
> > + tree *slot = root->var_map->get (t);
> >
> > if (slot)
> > - return (tree) *slot;
> > + return *slot;
> > }
> > return NULL;
> > }
> > @@ -2580,7 +2571,7 @@ remap_vla_decls (tree block, struct nesting_info *root)
> > && variably_modified_type_p (type, NULL)))
> > continue;
> >
> > - if (pointer_map_contains (root->var_map, TREE_OPERAND (val, 0))
> > + if (root->var_map->get (TREE_OPERAND (val, 0))
> > || walk_tree (&type, contains_remapped_vars, root, NULL))
> > break;
> > }
> > @@ -2590,7 +2581,7 @@ remap_vla_decls (tree block, struct nesting_info *root)
> >
> > memset (&id, 0, sizeof (id));
> > id.cb.copy_decl = nesting_copy_decl;
> > - id.cb.decl_map = pointer_map_create ();
> > + id.cb.decl_map = new hash_map<tree, tree>;
> > id.root = root;
> >
> > for (; var; var = DECL_CHAIN (var))
> > @@ -2598,7 +2589,6 @@ remap_vla_decls (tree block, struct nesting_info *root)
> > {
> > struct nesting_info *i;
> > tree newt, context;
> > - void **slot;
> >
> > val = DECL_VALUE_EXPR (var);
> > type = TREE_TYPE (var);
> > @@ -2608,7 +2598,7 @@ remap_vla_decls (tree block, struct nesting_info *root)
> > && variably_modified_type_p (type, NULL)))
> > continue;
> >
> > - slot = pointer_map_contains (root->var_map, TREE_OPERAND (val, 0));
> > + tree *slot = root->var_map->get (TREE_OPERAND (val, 0));
> > if (!slot && !walk_tree (&type, contains_remapped_vars, root, NULL))
> > continue;
> >
> > @@ -2651,7 +2641,7 @@ remap_vla_decls (tree block, struct nesting_info *root)
> > SET_DECL_VALUE_EXPR (var, val);
> > }
> >
> > - pointer_map_destroy (id.cb.decl_map);
> > + delete id.cb.decl_map;
> > }
> >
> > /* Fold the MEM_REF *E. */
> > @@ -2830,7 +2820,7 @@ finalize_nesting_tree_1 (struct nesting_info *root)
> >
> > memset (&id, 0, sizeof (id));
> > id.cb.copy_decl = nesting_copy_decl;
> > - id.cb.decl_map = pointer_map_create ();
> > + id.cb.decl_map = new hash_map<tree, tree>;
> > id.root = root;
> >
> > for (; debug_var; debug_var = DECL_CHAIN (debug_var))
> > @@ -2865,7 +2855,7 @@ finalize_nesting_tree_1 (struct nesting_info *root)
> > TYPE_NAME (newt) = remap_decl (TYPE_NAME (newt), &id.cb);
> > }
> >
> > - pointer_map_destroy (id.cb.decl_map);
> > + delete id.cb.decl_map;
> > }
> >
> > scope = gimple_seq_first_stmt (gimple_body (root->context));
> > @@ -2931,8 +2921,8 @@ free_nesting_tree (struct nesting_info *root)
> > do
> > {
> > next = iter_nestinfo_next (node);
> > - pointer_map_destroy (node->var_map);
> > - pointer_map_destroy (node->field_map);
> > + delete node->var_map;
> > + delete node->field_map;
> > delete node->mem_refs;
> > free (node);
> > node = next;
> > diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c
> > index f9d39ac..2231314 100644
> > --- a/gcc/tree-sra.c
> > +++ b/gcc/tree-sra.c
> > @@ -74,11 +74,11 @@ along with GCC; see the file COPYING3. If not see
> > #include "config.h"
> > #include "system.h"
> > #include "coretypes.h"
> > +#include "hash-map.h"
> > #include "hash-table.h"
> > #include "alloc-pool.h"
> > #include "tm.h"
> > #include "tree.h"
> > -#include "pointer-set.h"
> > #include "basic-block.h"
> > #include "tree-ssa-alias.h"
> > #include "internal-fn.h"
> > @@ -290,7 +290,7 @@ struct assign_link
> > static alloc_pool link_pool;
> >
> > /* Base (tree) -> Vector (vec<access_p> *) map. */
> > -static struct pointer_map_t *base_access_vec;
> > +static hash_map<tree, auto_vec<access_p> > *base_access_vec;
> >
> > /* Candidate hash table helpers. */
> >
> > @@ -518,13 +518,7 @@ access_has_replacements_p (struct access *acc)
> > static vec<access_p> *
> > get_base_access_vector (tree base)
> > {
> > - void **slot;
> > -
> > - slot = pointer_map_contains (base_access_vec, base);
> > - if (!slot)
> > - return NULL;
> > - else
> > - return *(vec<access_p> **) slot;
> > + return base_access_vec->get (base);
> > }
> >
> > /* Find an access with required OFFSET and SIZE in a subtree of accesses rooted
> > @@ -667,24 +661,13 @@ sra_initialize (void)
> > gcc_obstack_init (&name_obstack);
> > access_pool = create_alloc_pool ("SRA accesses", sizeof (struct access), 16);
> > link_pool = create_alloc_pool ("SRA links", sizeof (struct assign_link), 16);
> > - base_access_vec = pointer_map_create ();
> > + base_access_vec = new hash_map<tree, auto_vec<access_p> >;
> > memset (&sra_stats, 0, sizeof (sra_stats));
> > encountered_apply_args = false;
> > encountered_recursive_call = false;
> > encountered_unchangable_recursive_call = false;
> > }
> >
> > -/* Hook fed to pointer_map_traverse, deallocate stored vectors. */
> > -
> > -static bool
> > -delete_base_accesses (const void *key ATTRIBUTE_UNUSED, void **value,
> > - void *data ATTRIBUTE_UNUSED)
> > -{
> > - vec<access_p> *access_vec = (vec<access_p> *) *value;
> > - vec_free (access_vec);
> > - return true;
> > -}
> > -
> > /* Deallocate all general structures. */
> >
> > static void
> > @@ -699,8 +682,7 @@ sra_deinitialize (void)
> > free_alloc_pool (link_pool);
> > obstack_free (&name_obstack, NULL);
> >
> > - pointer_map_traverse (base_access_vec, delete_base_accesses, NULL);
> > - pointer_map_destroy (base_access_vec);
> > + delete base_access_vec;
> > }
> >
> > /* Remove DECL from candidates for SRA and write REASON to the dump file if
> > @@ -849,9 +831,7 @@ mark_parm_dereference (tree base, HOST_WIDE_INT dist, gimple stmt)
> > static struct access *
> > create_access_1 (tree base, HOST_WIDE_INT offset, HOST_WIDE_INT size)
> > {
> > - vec<access_p> *v;
> > struct access *access;
> > - void **slot;
> >
> > access = (struct access *) pool_alloc (access_pool);
> > memset (access, 0, sizeof (struct access));
> > @@ -859,16 +839,7 @@ create_access_1 (tree base, HOST_WIDE_INT offset, HOST_WIDE_INT size)
> > access->offset = offset;
> > access->size = size;
> >
> > - slot = pointer_map_contains (base_access_vec, base);
> > - if (slot)
> > - v = (vec<access_p> *) *slot;
> > - else
> > - vec_alloc (v, 32);
> > -
> > - v->safe_push (access);
> > -
> > - *((vec<access_p> **)
> > - pointer_map_insert (base_access_vec, base)) = v;
> > + base_access_vec->get_or_insert (base).safe_push (access);
> >
> > return access;
> > }
> > diff --git a/gcc/tree-ssa-loop-im.c b/gcc/tree-ssa-loop-im.c
> > index c614978..0cbb3ae 100644
> > --- a/gcc/tree-ssa-loop-im.c
> > +++ b/gcc/tree-ssa-loop-im.c
> > @@ -26,6 +26,7 @@ along with GCC; see the file COPYING3. If not see
> > #include "basic-block.h"
> > #include "gimple-pretty-print.h"
> > #include "pointer-set.h"
> > +#include "hash-map.h"
> > #include "hash-table.h"
> > #include "tree-ssa-alias.h"
> > #include "internal-fn.h"
> > @@ -103,7 +104,7 @@ struct lim_aux_data
> >
> > /* Maps statements to their lim_aux_data. */
> >
> > -static struct pointer_map_t *lim_aux_data_map;
> > +static hash_map<gimple, lim_aux_data *> *lim_aux_data_map;
> >
> > /* Description of a memory reference location. */
> >
> > @@ -225,20 +226,20 @@ static bool ref_indep_loop_p (struct loop *, mem_ref_p);
> > static struct lim_aux_data *
> > init_lim_data (gimple stmt)
> > {
> > - void **p = pointer_map_insert (lim_aux_data_map, stmt);
> > + lim_aux_data *p = XCNEW (struct lim_aux_data);
> > + lim_aux_data_map->put (stmt, p);
> >
> > - *p = XCNEW (struct lim_aux_data);
> > - return (struct lim_aux_data *) *p;
> > + return p;
> > }
> >
> > static struct lim_aux_data *
> > get_lim_data (gimple stmt)
> > {
> > - void **p = pointer_map_contains (lim_aux_data_map, stmt);
> > + lim_aux_data **p = lim_aux_data_map->get (stmt);
> > if (!p)
> > return NULL;
> >
> > - return (struct lim_aux_data *) *p;
> > + return *p;
> > }
> >
> > /* Releases the memory occupied by DATA. */
> > @@ -253,11 +254,11 @@ free_lim_aux_data (struct lim_aux_data *data)
> > static void
> > clear_lim_data (gimple stmt)
> > {
> > - void **p = pointer_map_contains (lim_aux_data_map, stmt);
> > + lim_aux_data **p = lim_aux_data_map->get (stmt);
> > if (!p)
> > return;
> >
> > - free_lim_aux_data ((struct lim_aux_data *) *p);
> > + free_lim_aux_data (*p);
> > *p = NULL;
> > }
> >
> > @@ -2429,7 +2430,7 @@ tree_ssa_lim_initialize (void)
> >
> > bitmap_obstack_initialize (&lim_bitmap_obstack);
> > gcc_obstack_init (&mem_ref_obstack);
> > - lim_aux_data_map = pointer_map_create ();
> > + lim_aux_data_map = new hash_map<gimple, lim_aux_data *>;
> >
> > if (flag_tm)
> > compute_transaction_bits ();
> > @@ -2484,7 +2485,7 @@ tree_ssa_lim_finalize (void)
> > SET_ALWAYS_EXECUTED_IN (bb, NULL);
> >
> > bitmap_obstack_release (&lim_bitmap_obstack);
> > - pointer_map_destroy (lim_aux_data_map);
> > + delete lim_aux_data_map;
> >
> > delete memory_accesses.refs;
> > memory_accesses.refs = NULL;
> > diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c
> > index 3b4a6cd..158a081 100644
> > --- a/gcc/tree-ssa-loop-ivopts.c
> > +++ b/gcc/tree-ssa-loop-ivopts.c
> > @@ -70,7 +70,7 @@ along with GCC; see the file COPYING3. If not see
> > #include "tm_p.h"
> > #include "basic-block.h"
> > #include "gimple-pretty-print.h"
> > -#include "pointer-set.h"
> > +#include "hash-map.h"
> > #include "hash-table.h"
> > #include "tree-ssa-alias.h"
> > #include "internal-fn.h"
> > @@ -293,7 +293,7 @@ struct ivopts_data
> > struct loop *current_loop;
> >
> > /* Numbers of iterations for all exits of the current loop. */
> > - struct pointer_map_t *niters;
> > + hash_map<edge, tree_niter_desc *> *niters;
> >
> > /* Number of registers used in it. */
> > unsigned regs_used;
> > @@ -814,15 +814,15 @@ static struct tree_niter_desc *
> > niter_for_exit (struct ivopts_data *data, edge exit)
> > {
> > struct tree_niter_desc *desc;
> > - void **slot;
> > + tree_niter_desc **slot;
> >
> > if (!data->niters)
> > {
> > - data->niters = pointer_map_create ();
> > + data->niters = new hash_map<edge, tree_niter_desc *>;
> > slot = NULL;
> > }
> > else
> > - slot = pointer_map_contains (data->niters, exit);
> > + slot = data->niters->get (exit);
> >
> > if (!slot)
> > {
> > @@ -837,11 +837,10 @@ niter_for_exit (struct ivopts_data *data, edge exit)
> > XDELETE (desc);
> > desc = NULL;
> > }
> > - slot = pointer_map_insert (data->niters, exit);
> > - *slot = desc;
> > + data->niters->put (exit, desc);
> > }
> > else
> > - desc = (struct tree_niter_desc *) *slot;
> > + desc = *slot;
> >
> > return desc;
> > }
> > @@ -6704,15 +6703,12 @@ remove_unused_ivs (struct ivopts_data *data)
> > }
> >
> > /* Frees memory occupied by struct tree_niter_desc in *VALUE. Callback
> > - for pointer_map_traverse. */
> > + for hash_map::traverse. */
> >
> > -static bool
> > -free_tree_niter_desc (const void *key ATTRIBUTE_UNUSED, void **value,
> > - void *data ATTRIBUTE_UNUSED)
> > +bool
> > +free_tree_niter_desc (edge const &, tree_niter_desc *const &value, void *)
> > {
> > - struct tree_niter_desc *const niter = (struct tree_niter_desc *) *value;
> > -
> > - free (niter);
> > + free (value);
> > return true;
> > }
> >
> > @@ -6727,8 +6723,8 @@ free_loop_data (struct ivopts_data *data)
> >
> > if (data->niters)
> > {
> > - pointer_map_traverse (data->niters, free_tree_niter_desc, NULL);
> > - pointer_map_destroy (data->niters);
> > + data->niters->traverse<void *, free_tree_niter_desc> (NULL);
> > + delete data->niters;
> > data->niters = NULL;
> > }
> >
> > diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c
> > index f9bd9a4..2e8337c 100644
> > --- a/gcc/tree-ssa-reassoc.c
> > +++ b/gcc/tree-ssa-reassoc.c
> > @@ -30,7 +30,7 @@ along with GCC; see the file COPYING3. If not see
> > #include "basic-block.h"
> > #include "gimple-pretty-print.h"
> > #include "tree-inline.h"
> > -#include "pointer-set.h"
> > +#include "hash-map.h"
> > #include "tree-ssa-alias.h"
> > #include "internal-fn.h"
> > #include "gimple-fold.h"
> > @@ -216,7 +216,7 @@ static int next_operand_entry_id;
> > static long *bb_rank;
> >
> > /* Operand->rank hashtable. */
> > -static struct pointer_map_t *operand_rank;
> > +static hash_map<tree, long> *operand_rank;
> >
> > /* Forward decls. */
> > static long get_rank (tree);
> > @@ -362,8 +362,8 @@ propagate_rank (long rank, tree op)
> > static inline long
> > find_operand_rank (tree e)
> > {
> > - void **slot = pointer_map_contains (operand_rank, e);
> > - return slot ? (long) (intptr_t) *slot : -1;
> > + long *slot = operand_rank->get (e);
> > + return slot ? *slot : -1;
> > }
> >
> > /* Insert {E,RANK} into the operand rank hashtable. */
> > @@ -371,11 +371,8 @@ find_operand_rank (tree e)
> > static inline void
> > insert_operand_rank (tree e, long rank)
> > {
> > - void **slot;
> > gcc_assert (rank > 0);
> > - slot = pointer_map_insert (operand_rank, e);
> > - gcc_assert (!*slot);
> > - *slot = (void *) (intptr_t) rank;
> > + gcc_assert (!operand_rank->put (e, rank));
> > }
> >
> > /* Given an expression E, return the rank of the expression. */
> > @@ -4635,7 +4632,7 @@ init_reassoc (void)
> > deeper loops come later. */
> > pre_and_rev_post_order_compute (NULL, bbs, false);
> > bb_rank = XCNEWVEC (long, last_basic_block_for_fn (cfun));
> > - operand_rank = pointer_map_create ();
> > + operand_rank = new hash_map<tree, long>;
> >
> > /* Give each default definition a distinct rank. This includes
> > parameters and the static chain. Walk backwards over all
> > @@ -4676,7 +4673,7 @@ fini_reassoc (void)
> > statistics_counter_event (cfun, "Built-in powi calls created",
> > reassociate_stats.pows_created);
> >
> > - pointer_map_destroy (operand_rank);
> > + delete operand_rank;
> > free_alloc_pool (operand_entry_pool);
> > free (bb_rank);
> > plus_negates.release ();
> > diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
> > index 1879fc0..08e384b 100644
> > --- a/gcc/tree-ssa-structalias.c
> > +++ b/gcc/tree-ssa-structalias.c
> > @@ -319,7 +319,7 @@ static inline bool type_can_have_subvars (const_tree);
> > static alloc_pool variable_info_pool;
> >
> > /* Map varinfo to final pt_solution. */
> > -static pointer_map_t *final_solutions;
> > +static hash_map<varinfo_t, pt_solution *> *final_solutions;
> > struct obstack final_solutions_obstack;
> >
> > /* Table of variable info structures for constraint variables.
> > @@ -393,19 +393,19 @@ new_var_info (tree t, const char *name)
> >
> > /* A map mapping call statements to per-stmt variables for uses
> > and clobbers specific to the call. */
> > -static struct pointer_map_t *call_stmt_vars;
> > +static hash_map<gimple, varinfo_t> *call_stmt_vars;
> >
> > /* Lookup or create the variable for the call statement CALL. */
> >
> > static varinfo_t
> > get_call_vi (gimple call)
> > {
> > - void **slot_p;
> > varinfo_t vi, vi2;
> >
> > - slot_p = pointer_map_insert (call_stmt_vars, call);
> > - if (*slot_p)
> > - return (varinfo_t) *slot_p;
> > + bool existed;
> > + varinfo_t *slot_p = &call_stmt_vars->get_or_insert (call, &existed);
> > + if (existed)
> > + return *slot_p;
> >
> > vi = new_var_info (NULL_TREE, "CALLUSED");
> > vi->offset = 0;
> > @@ -421,7 +421,7 @@ get_call_vi (gimple call)
> >
> > vi->next = vi2->id;
> >
> > - *slot_p = (void *) vi;
> > + *slot_p = vi;
> > return vi;
> > }
> >
> > @@ -431,11 +431,9 @@ get_call_vi (gimple call)
> > static varinfo_t
> > lookup_call_use_vi (gimple call)
> > {
> > - void **slot_p;
> > -
> > - slot_p = pointer_map_contains (call_stmt_vars, call);
> > + varinfo_t *slot_p = call_stmt_vars->get (call);
> > if (slot_p)
> > - return (varinfo_t) *slot_p;
> > + return *slot_p;
> >
> > return NULL;
> > }
> > @@ -2794,7 +2792,7 @@ solve_graph (constraint_graph_t graph)
> > }
> >
> > /* Map from trees to variable infos. */
> > -static struct pointer_map_t *vi_for_tree;
> > +static hash_map<tree, varinfo_t> *vi_for_tree;
> >
> >
> > /* Insert ID as the variable id for tree T in the vi_for_tree map. */
> > @@ -2802,10 +2800,8 @@ static struct pointer_map_t *vi_for_tree;
> > static void
> > insert_vi_for_tree (tree t, varinfo_t vi)
> > {
> > - void **slot = pointer_map_insert (vi_for_tree, t);
> > gcc_assert (vi);
> > - gcc_assert (*slot == NULL);
> > - *slot = vi;
> > + gcc_assert (!vi_for_tree->put (t, vi));
> > }
> >
> > /* Find the variable info for tree T in VI_FOR_TREE. If T does not
> > @@ -2814,11 +2810,11 @@ insert_vi_for_tree (tree t, varinfo_t vi)
> > static varinfo_t
> > lookup_vi_for_tree (tree t)
> > {
> > - void **slot = pointer_map_contains (vi_for_tree, t);
> > + varinfo_t *slot = vi_for_tree->get (t);
> > if (slot == NULL)
> > return NULL;
> >
> > - return (varinfo_t) *slot;
> > + return *slot;
> > }
> >
> > /* Return a printable name for DECL */
> > @@ -2876,11 +2872,11 @@ alias_get_name (tree decl)
> > static varinfo_t
> > get_vi_for_tree (tree t)
> > {
> > - void **slot = pointer_map_contains (vi_for_tree, t);
> > + varinfo_t *slot = vi_for_tree->get (t);
> > if (slot == NULL)
> > return get_varinfo (create_variable_info_for (t, alias_get_name (t)));
> >
> > - return (varinfo_t) *slot;
> > + return *slot;
> > }
> >
> > /* Get a scalar constraint expression for a new temporary variable. */
> > @@ -6075,7 +6071,6 @@ find_what_var_points_to (varinfo_t orig_vi)
> > bitmap finished_solution;
> > bitmap result;
> > varinfo_t vi;
> > - void **slot;
> > struct pt_solution *pt;
> >
> > /* This variable may have been collapsed, let's get the real
> > @@ -6083,9 +6078,9 @@ find_what_var_points_to (varinfo_t orig_vi)
> > vi = get_varinfo (find (orig_vi->id));
> >
> > /* See if we have already computed the solution and return it. */
> > - slot = pointer_map_insert (final_solutions, vi);
> > + pt_solution **slot = &final_solutions->get_or_insert (vi);
> > if (*slot != NULL)
> > - return *(struct pt_solution *)*slot;
> > + return **slot;
> >
> > *slot = pt = XOBNEW (&final_solutions_obstack, struct pt_solution);
> > memset (pt, 0, sizeof (struct pt_solution));
> > @@ -6685,8 +6680,8 @@ init_alias_vars (void)
> > sizeof (struct variable_info), 30);
> > constraints.create (8);
> > varmap.create (8);
> > - vi_for_tree = pointer_map_create ();
> > - call_stmt_vars = pointer_map_create ();
> > + vi_for_tree = new hash_map<tree, varinfo_t>;
> > + call_stmt_vars = new hash_map<gimple, varinfo_t>;
> >
> > memset (&stats, 0, sizeof (stats));
> > shared_bitmap_table = new hash_table<shared_bitmap_hasher> (511);
> > @@ -6694,7 +6689,7 @@ init_alias_vars (void)
> >
> > gcc_obstack_init (&fake_var_decl_obstack);
> >
> > - final_solutions = pointer_map_create ();
> > + final_solutions = new hash_map<varinfo_t, pt_solution *>;
> > gcc_obstack_init (&final_solutions_obstack);
> > }
> >
> > @@ -6943,8 +6938,8 @@ delete_points_to_sets (void)
> > fprintf (dump_file, "Points to sets created:%d\n",
> > stats.points_to_sets_created);
> >
> > - pointer_map_destroy (vi_for_tree);
> > - pointer_map_destroy (call_stmt_vars);
> > + delete vi_for_tree;
> > + delete call_stmt_vars;
> > bitmap_obstack_release (&pta_obstack);
> > constraints.release ();
> >
> > @@ -6965,7 +6960,7 @@ delete_points_to_sets (void)
> >
> > obstack_free (&fake_var_decl_obstack, NULL);
> >
> > - pointer_map_destroy (final_solutions);
> > + delete final_solutions;
> > obstack_free (&final_solutions_obstack, NULL);
> > }
> >
> > diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c
> > index 73a4d1c..217b9fc 100644
> > --- a/gcc/tree-ssa.c
> > +++ b/gcc/tree-ssa.c
> > @@ -49,6 +49,7 @@ along with GCC; see the file COPYING3. If not see
> > #include "tree-into-ssa.h"
> > #include "tree-ssa.h"
> > #include "tree-inline.h"
> > +#include "hash-map.h"
> > #include "hashtab.h"
> > #include "tree-pass.h"
> > #include "diagnostic-core.h"
> > @@ -56,7 +57,7 @@ along with GCC; see the file COPYING3. If not see
> > #include "cfgexpand.h"
> >
> > /* Pointer map of variable mappings, keyed by edge. */
> > -static struct pointer_map_t *edge_var_maps;
> > +static hash_map<edge, auto_vec<edge_var_map> > *edge_var_maps;
> >
> >
> > /* Add a mapping with PHI RESULT and PHI DEF associated with edge E. */
> > @@ -64,23 +65,17 @@ static struct pointer_map_t *edge_var_maps;
> > void
> > redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus)
> > {
> > - void **slot;
> > - edge_var_map_vector *head;
> > edge_var_map new_node;
> >
> > if (edge_var_maps == NULL)
> > - edge_var_maps = pointer_map_create ();
> > + edge_var_maps = new hash_map<edge, auto_vec<edge_var_map> >;
> >
> > - slot = pointer_map_insert (edge_var_maps, e);
> > - head = (edge_var_map_vector *) *slot;
> > - if (!head)
> > - vec_safe_reserve (head, 5);
> > + auto_vec<edge_var_map> &slot = edge_var_maps->get_or_insert (e);
> > new_node.def = def;
> > new_node.result = result;
> > new_node.locus = locus;
> >
> > - vec_safe_push (head, new_node);
> > - *slot = head;
> > + slot.safe_push (new_node);
> > }
> >
> >
> > @@ -89,82 +84,51 @@ redirect_edge_var_map_add (edge e, tree result, tree def, source_location locus)
> > void
> > redirect_edge_var_map_clear (edge e)
> > {
> > - void **slot;
> > - edge_var_map_vector *head;
> > -
> > if (!edge_var_maps)
> > return;
> >
> > - slot = pointer_map_contains (edge_var_maps, e);
> > + auto_vec<edge_var_map> *head = edge_var_maps->get (e);
> >
> > - if (slot)
> > - {
> > - head = (edge_var_map_vector *) *slot;
> > - vec_free (head);
> > - *slot = NULL;
> > - }
> > + if (head)
> > + head->release ();
> > }
> >
> >
> > /* Duplicate the redirected var mappings in OLDE in NEWE.
> >
> > - Since we can't remove a mapping, let's just duplicate it. This assumes a
> > - pointer_map can have multiple edges mapping to the same var_map (many to
> > - one mapping), since we don't remove the previous mappings. */
> > + This assumes a hash_map can have multiple edges mapping to the same
> > + var_map (many to one mapping), since we don't remove the previous mappings.
> > + */
> >
> > void
> > redirect_edge_var_map_dup (edge newe, edge olde)
> > {
> > - void **new_slot, **old_slot;
> > - edge_var_map_vector *head;
> > -
> > if (!edge_var_maps)
> > return;
> >
> > - new_slot = pointer_map_insert (edge_var_maps, newe);
> > - old_slot = pointer_map_contains (edge_var_maps, olde);
> > - if (!old_slot)
> > + auto_vec<edge_var_map> *head = edge_var_maps->get (olde);
> > + if (!head)
> > return;
> > - head = (edge_var_map_vector *) *old_slot;
> >
> > - edge_var_map_vector *new_head = NULL;
> > - if (head)
> > - new_head = vec_safe_copy (head);
> > - else
> > - vec_safe_reserve (new_head, 5);
> > - *new_slot = new_head;
> > + edge_var_maps->get_or_insert (newe).safe_splice (*head);
> > }
> >
> >
> > /* Return the variable mappings for a given edge. If there is none, return
> > NULL. */
> >
> > -edge_var_map_vector *
> > +vec<edge_var_map> *
> > redirect_edge_var_map_vector (edge e)
> > {
> > - void **slot;
> > -
> > /* Hey, what kind of idiot would... you'd be surprised. */
> > if (!edge_var_maps)
> > return NULL;
> >
> > - slot = pointer_map_contains (edge_var_maps, e);
> > + auto_vec<edge_var_map> *slot = edge_var_maps->get (e);
> > if (!slot)
> > return NULL;
> >
> > - return (edge_var_map_vector *) *slot;
> > -}
> > -
> > -/* Used by redirect_edge_var_map_destroy to free all memory. */
> > -
> > -static bool
> > -free_var_map_entry (const void *key ATTRIBUTE_UNUSED,
> > - void **value,
> > - void *data ATTRIBUTE_UNUSED)
> > -{
> > - edge_var_map_vector *head = (edge_var_map_vector *) *value;
> > - vec_free (head);
> > - return true;
> > + return slot;
> > }
> >
> > /* Clear the edge variable mappings. */
> > @@ -172,12 +136,8 @@ free_var_map_entry (const void *key ATTRIBUTE_UNUSED,
> > void
> > redirect_edge_var_map_destroy (void)
> > {
> > - if (edge_var_maps)
> > - {
> > - pointer_map_traverse (edge_var_maps, free_var_map_entry, NULL);
> > - pointer_map_destroy (edge_var_maps);
> > - edge_var_maps = NULL;
> > - }
> > + delete edge_var_maps;
> > + edge_var_maps = NULL;
> > }
> >
> >
> > @@ -223,12 +183,11 @@ void
> > flush_pending_stmts (edge e)
> > {
> > gimple phi;
> > - edge_var_map_vector *v;
> > edge_var_map *vm;
> > int i;
> > gimple_stmt_iterator gsi;
> >
> > - v = redirect_edge_var_map_vector (e);
> > + vec<edge_var_map> *v = redirect_edge_var_map_vector (e);
> > if (!v)
> > return;
> >
> > diff --git a/gcc/tree-ssa.h b/gcc/tree-ssa.h
> > index c866206..835686c 100644
> > --- a/gcc/tree-ssa.h
> > +++ b/gcc/tree-ssa.h
> > @@ -35,7 +35,7 @@ typedef vec<edge_var_map, va_heap, vl_embed> edge_var_map_vector;
> > extern void redirect_edge_var_map_add (edge, tree, tree, source_location);
> > extern void redirect_edge_var_map_clear (edge);
> > extern void redirect_edge_var_map_dup (edge, edge);
> > -extern edge_var_map_vector *redirect_edge_var_map_vector (edge);
> > +extern vec<edge_var_map> *redirect_edge_var_map_vector (edge);
> > extern void redirect_edge_var_map_destroy (void);
> > extern edge ssa_redirect_edge (edge, basic_block);
> > extern void flush_pending_stmts (edge);
> > diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c
> > index 00810b9..3b72fce 100644
> > --- a/gcc/var-tracking.c
> > +++ b/gcc/var-tracking.c
> > @@ -94,6 +94,7 @@
> > #include "varasm.h"
> > #include "stor-layout.h"
> > #include "pointer-set.h"
> > +#include "hash-map.h"
> > #include "hash-table.h"
> > #include "basic-block.h"
> > #include "tm_p.h"
> > @@ -2019,12 +2020,12 @@ vt_get_canonicalize_base (rtx loc)
> >
> > /* This caches canonicalized addresses for VALUEs, computed using
> > information in the global cselib table. */
> > -static struct pointer_map_t *global_get_addr_cache;
> > +static hash_map<rtx, rtx> *global_get_addr_cache;
> >
> > /* This caches canonicalized addresses for VALUEs, computed using
> > information from the global cache and information pertaining to a
> > basic block being analyzed. */
> > -static struct pointer_map_t *local_get_addr_cache;
> > +static hash_map<rtx, rtx> *local_get_addr_cache;
> >
> > static rtx vt_canonicalize_addr (dataflow_set *, rtx);
> >
> > @@ -2036,13 +2037,13 @@ static rtx
> > get_addr_from_global_cache (rtx const loc)
> > {
> > rtx x;
> > - void **slot;
> >
> > gcc_checking_assert (GET_CODE (loc) == VALUE);
> >
> > - slot = pointer_map_insert (global_get_addr_cache, loc);
> > - if (*slot)
> > - return (rtx)*slot;
> > + bool existed;
> > + rtx *slot = &global_get_addr_cache->get_or_insert (loc, &existed);
> > + if (existed)
> > + return *slot;
> >
> > x = canon_rtx (get_addr (loc));
> >
> > @@ -2056,8 +2057,7 @@ get_addr_from_global_cache (rtx const loc)
> > {
> > /* The table may have moved during recursion, recompute
> > SLOT. */
> > - slot = pointer_map_contains (global_get_addr_cache, loc);
> > - *slot = x = nx;
> > + *global_get_addr_cache->get (loc) = x = nx;
> > }
> > }
> >
> > @@ -2072,16 +2072,16 @@ static rtx
> > get_addr_from_local_cache (dataflow_set *set, rtx const loc)
> > {
> > rtx x;
> > - void **slot;
> > decl_or_value dv;
> > variable var;
> > location_chain l;
> >
> > gcc_checking_assert (GET_CODE (loc) == VALUE);
> >
> > - slot = pointer_map_insert (local_get_addr_cache, loc);
> > - if (*slot)
> > - return (rtx)*slot;
> > + bool existed;
> > + rtx *slot = &local_get_addr_cache->get_or_insert (loc, &existed);
> > + if (existed)
> > + return *slot;
> >
> > x = get_addr_from_global_cache (loc);
> >
> > @@ -2095,7 +2095,7 @@ get_addr_from_local_cache (dataflow_set *set, rtx const loc)
> > rtx nx = vt_canonicalize_addr (set, x);
> > if (nx != x)
> > {
> > - slot = pointer_map_contains (local_get_addr_cache, loc);
> > + slot = local_get_addr_cache->get (loc);
> > *slot = x = nx;
> > }
> > return x;
> > @@ -2116,7 +2116,7 @@ get_addr_from_local_cache (dataflow_set *set, rtx const loc)
> > rtx nx = vt_canonicalize_addr (set, l->loc);
> > if (x != nx)
> > {
> > - slot = pointer_map_contains (local_get_addr_cache, loc);
> > + slot = local_get_addr_cache->get (loc);
> > *slot = x = nx;
> > }
> > break;
> > @@ -2503,11 +2503,10 @@ val_store (dataflow_set *set, rtx val, rtx loc, rtx insn, bool modified)
> >
> > /* Clear (canonical address) slots that reference X. */
> >
> > -static bool
> > -local_get_addr_clear_given_value (const void *v ATTRIBUTE_UNUSED,
> > - void **slot, void *x)
> > +bool
> > +local_get_addr_clear_given_value (rtx const &, rtx *slot, rtx x)
> > {
> > - if (vt_get_canonicalize_base ((rtx)*slot) == x)
> > + if (vt_get_canonicalize_base (*slot) == x)
> > *slot = NULL;
> > return true;
> > }
> > @@ -2530,11 +2529,10 @@ val_reset (dataflow_set *set, decl_or_value dv)
> > if (var->onepart == ONEPART_VALUE)
> > {
> > rtx x = dv_as_value (dv);
> > - void **slot;
> >
> > /* Relationships in the global cache don't change, so reset the
> > local cache entry only. */
> > - slot = pointer_map_contains (local_get_addr_cache, x);
> > + rtx *slot = local_get_addr_cache->get (x);
> > if (slot)
> > {
> > /* If the value resolved back to itself, odds are that other
> > @@ -2543,8 +2541,8 @@ val_reset (dataflow_set *set, decl_or_value dv)
> > old X but resolved to something else remain ok as long as
> > that something else isn't also reset. */
> > if (*slot == x)
> > - pointer_map_traverse (local_get_addr_cache,
> > - local_get_addr_clear_given_value, x);
> > + local_get_addr_cache
> > + ->traverse<rtx, local_get_addr_clear_given_value> (x);
> > *slot = NULL;
> > }
> > }
> > @@ -6660,7 +6658,7 @@ compute_bb_dataflow (basic_block bb)
> > dataflow_set_copy (out, in);
> >
> > if (MAY_HAVE_DEBUG_INSNS)
> > - local_get_addr_cache = pointer_map_create ();
> > + local_get_addr_cache = new hash_map<rtx, rtx>;
> >
> > FOR_EACH_VEC_ELT (VTI (bb)->mos, i, mo)
> > {
> > @@ -6943,7 +6941,7 @@ compute_bb_dataflow (basic_block bb)
> >
> > if (MAY_HAVE_DEBUG_INSNS)
> > {
> > - pointer_map_destroy (local_get_addr_cache);
> > + delete local_get_addr_cache;
> > local_get_addr_cache = NULL;
> >
> > dataflow_set_equiv_regs (out);
> > @@ -9477,13 +9475,13 @@ vt_emit_notes (void)
> > emit_notes_for_differences (BB_HEAD (bb), &cur, &VTI (bb)->in);
> >
> > if (MAY_HAVE_DEBUG_INSNS)
> > - local_get_addr_cache = pointer_map_create ();
> > + local_get_addr_cache = new hash_map<rtx, rtx>;
> >
> > /* Emit the notes for the changes in the basic block itself. */
> > emit_notes_in_bb (bb, &cur);
> >
> > if (MAY_HAVE_DEBUG_INSNS)
> > - pointer_map_destroy (local_get_addr_cache);
> > + delete local_get_addr_cache;
> > local_get_addr_cache = NULL;
> >
> > /* Free memory occupied by the in hash table, we won't need it
> > @@ -9916,7 +9914,7 @@ vt_initialize (void)
> > valvar_pool = create_alloc_pool ("small variable_def pool",
> > sizeof (struct variable_def), 256);
> > preserved_values.create (256);
> > - global_get_addr_cache = pointer_map_create ();
> > + global_get_addr_cache = new hash_map<rtx, rtx>;
> > }
> > else
> > {
> > @@ -10263,7 +10261,7 @@ vt_finalize (void)
> > if (MAY_HAVE_DEBUG_INSNS)
> > {
> > if (global_get_addr_cache)
> > - pointer_map_destroy (global_get_addr_cache);
> > + delete global_get_addr_cache;
> > global_get_addr_cache = NULL;
> > if (loc_exp_dep_pool)
> > free_alloc_pool (loc_exp_dep_pool);
> > --
> > 2.0.1
> >
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] convert many pointer_map to hash_map
2014-08-02 11:36 ` Trevor Saunders
@ 2014-08-02 15:38 ` Oleg Endo
2014-08-02 16:00 ` Trevor Saunders
0 siblings, 1 reply; 6+ messages in thread
From: Oleg Endo @ 2014-08-02 15:38 UTC (permalink / raw)
To: Trevor Saunders; +Cc: Richard Biener, GCC Patches
On Sat, 2014-08-02 at 07:34 -0400, Trevor Saunders wrote:
> On Fri, Aug 01, 2014 at 12:52:08PM +0200, Richard Biener wrote:
> > On Fri, Aug 1, 2014 at 12:34 PM, <tsaunders@mozilla.com> wrote:
> > > From: Trevor Saunders <tsaunders@mozilla.com>
> > >
> > > Hi,
> > >
> > > This patch replaces a bunch of usage of pointer_map with hash_map. It also
> > > adds an overload to hash_map::traverse that allows modifying the value, and a
> > > remove method.
> > >
> > > bootstrapped + regtested on x86_64-unknown-linux-gnu, ok?
> >
> > Ok.
>
> committed as r213517 thanks for the review.
>
> Trev
>
Either r213517 or r213516 is causing the following on my sh-elf setup
(i686 host) when doing 'make all':
libtool: compile: /home/user/code/gcc/gcc-trunk-build-sh-elf/./gcc/xgcc
-shared-libgcc -B/home/user/code/gcc/gcc-trunk-build-sh-elf/./gcc
-nostdinc++ -L/home/user/code/gcc/gcc-trunk-build-sh-elf/sh-elf/libstdc
++-v3/src -L/home/user/code/gcc/gcc-trunk-build-sh-elf/sh-elf/libstdc
++-v3/src/.libs
-L/home/user/code/gcc/gcc-trunk-build-sh-elf/sh-elf/libstdc++-v3/libsupc
++/.libs -B/usr/local/sh-elf/bin/ -B/usr/local/sh-elf/lib/
-isystem /usr/local/sh-elf/include
-isystem /usr/local/sh-elf/sys-include
-I/home/user/code/gcc/gcc-trunk/libstdc++-v3/../libgcc
-I/home/user/code/gcc/gcc-trunk-build-sh-elf/sh-elf/libstdc
++-v3/include/sh-elf
-I/home/user/code/gcc/gcc-trunk-build-sh-elf/sh-elf/libstdc++-v3/include
-I/home/user/code/gcc/gcc-trunk/libstdc++-v3/libsupc++ -std=gnu++11
-fno-implicit-templates -Wall -Wextra -Wwrite-strings -Wcast-qual -Wabi
-fdiagnostics-show-location=once -ffunction-sections -fdata-sections
-frandom-seed=fstream-inst.lo -g -O2 -c ../../../../../gcc-trunk/libstdc
++-v3/src/c++11/fstream-inst.cc -o fstream-inst.o
cc1plus: out of memory allocating 2129023400 bytes after a total of
1589248 bytes
make[5]: *** [fstream-inst.lo] Error 1
make[5]: Leaving directory
`/home/user/code/gcc/gcc-trunk-build-sh-elf/sh-elf/libstdc++-v3/src/c
++11'
Cheers,
Oleg
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] convert many pointer_map to hash_map
2014-08-02 15:38 ` Oleg Endo
@ 2014-08-02 16:00 ` Trevor Saunders
2014-08-02 17:00 ` Oleg Endo
0 siblings, 1 reply; 6+ messages in thread
From: Trevor Saunders @ 2014-08-02 16:00 UTC (permalink / raw)
To: Oleg Endo; +Cc: Richard Biener, GCC Patches
On Sat, Aug 02, 2014 at 05:38:42PM +0200, Oleg Endo wrote:
> On Sat, 2014-08-02 at 07:34 -0400, Trevor Saunders wrote:
> > On Fri, Aug 01, 2014 at 12:52:08PM +0200, Richard Biener wrote:
> > > On Fri, Aug 1, 2014 at 12:34 PM, <tsaunders@mozilla.com> wrote:
> > > > From: Trevor Saunders <tsaunders@mozilla.com>
> > > >
> > > > Hi,
> > > >
> > > > This patch replaces a bunch of usage of pointer_map with hash_map. It also
> > > > adds an overload to hash_map::traverse that allows modifying the value, and a
> > > > remove method.
> > > >
> > > > bootstrapped + regtested on x86_64-unknown-linux-gnu, ok?
> > >
> > > Ok.
> >
> > committed as r213517 thanks for the review.
> >
> > Trev
> >
>
> Either r213517 or r213516 is causing the following on my sh-elf setup
> (i686 host) when doing 'make all':
I'd guess that its r213517, and for at least one of the hash maps we're
leaking what the entries point at. Can you try compiling that file
under valgrind? if not I can try in a couple hours.
Trev
>
> libtool: compile: /home/user/code/gcc/gcc-trunk-build-sh-elf/./gcc/xgcc
> -shared-libgcc -B/home/user/code/gcc/gcc-trunk-build-sh-elf/./gcc
> -nostdinc++ -L/home/user/code/gcc/gcc-trunk-build-sh-elf/sh-elf/libstdc
> ++-v3/src -L/home/user/code/gcc/gcc-trunk-build-sh-elf/sh-elf/libstdc
> ++-v3/src/.libs
> -L/home/user/code/gcc/gcc-trunk-build-sh-elf/sh-elf/libstdc++-v3/libsupc
> ++/.libs -B/usr/local/sh-elf/bin/ -B/usr/local/sh-elf/lib/
> -isystem /usr/local/sh-elf/include
> -isystem /usr/local/sh-elf/sys-include
> -I/home/user/code/gcc/gcc-trunk/libstdc++-v3/../libgcc
> -I/home/user/code/gcc/gcc-trunk-build-sh-elf/sh-elf/libstdc
> ++-v3/include/sh-elf
> -I/home/user/code/gcc/gcc-trunk-build-sh-elf/sh-elf/libstdc++-v3/include
> -I/home/user/code/gcc/gcc-trunk/libstdc++-v3/libsupc++ -std=gnu++11
> -fno-implicit-templates -Wall -Wextra -Wwrite-strings -Wcast-qual -Wabi
> -fdiagnostics-show-location=once -ffunction-sections -fdata-sections
> -frandom-seed=fstream-inst.lo -g -O2 -c ../../../../../gcc-trunk/libstdc
> ++-v3/src/c++11/fstream-inst.cc -o fstream-inst.o
>
> cc1plus: out of memory allocating 2129023400 bytes after a total of
> 1589248 bytes
> make[5]: *** [fstream-inst.lo] Error 1
> make[5]: Leaving directory
> `/home/user/code/gcc/gcc-trunk-build-sh-elf/sh-elf/libstdc++-v3/src/c
> ++11'
>
> Cheers,
> Oleg
>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] convert many pointer_map to hash_map
2014-08-02 16:00 ` Trevor Saunders
@ 2014-08-02 17:00 ` Oleg Endo
0 siblings, 0 replies; 6+ messages in thread
From: Oleg Endo @ 2014-08-02 17:00 UTC (permalink / raw)
To: Trevor Saunders; +Cc: Richard Biener, GCC Patches
On 02 Aug 2014, at 17:58, Trevor Saunders <tsaunders@mozilla.com> wrote:
> On Sat, Aug 02, 2014 at 05:38:42PM +0200, Oleg Endo wrote:
>> On Sat, 2014-08-02 at 07:34 -0400, Trevor Saunders wrote:
>>> On Fri, Aug 01, 2014 at 12:52:08PM +0200, Richard Biener wrote:
>>>> On Fri, Aug 1, 2014 at 12:34 PM, <tsaunders@mozilla.com> wrote:
>>>>> From: Trevor Saunders <tsaunders@mozilla.com>
>>>>>
>>>>> Hi,
>>>>>
>>>>> This patch replaces a bunch of usage of pointer_map with hash_map. It also
>>>>> adds an overload to hash_map::traverse that allows modifying the value, and a
>>>>> remove method.
>>>>>
>>>>> bootstrapped + regtested on x86_64-unknown-linux-gnu, ok?
>>>>
>>>> Ok.
>>>
>>> committed as r213517 thanks for the review.
>>>
>>> Trev
>>>
>>
>> Either r213517 or r213516 is causing the following on my sh-elf setup
>> (i686 host) when doing 'make all':
>
> I'd guess that its r213517, and for at least one of the hash maps we're
> leaking what the entries point at. Can you try compiling that file
> under valgrind? if not I can try in a couple hours.
I think you'll be faster than me.
Cheers,
Oleg
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-08-02 17:00 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-08-01 10:37 [PATCH] convert many pointer_map to hash_map tsaunders
2014-08-01 10:52 ` Richard Biener
2014-08-02 11:36 ` Trevor Saunders
2014-08-02 15:38 ` Oleg Endo
2014-08-02 16:00 ` Trevor Saunders
2014-08-02 17:00 ` Oleg Endo
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).