+2014-08-02 Trevor Saunders <tsaunders@mozilla.com>
+
+ * 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.
+
2014-08-02 Trevor Saunders <tsaunders@mozilla.com>
* hash-set.h: new File.
+2014-08-02 Trevor Saunders <tsaunders@mozilla.com>
+
+ * cilk.c: Use hash_map instead of pointer_map.
+
2014-08-02 Trevor Saunders <tsaunders@mozilla.com>
* c-gimplify.c: Use hash_set instead of pointer_set.
/* 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. */
/* 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)
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.
/* 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);
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
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);
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;
(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;
}
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);
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;
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;
}
break;
}
}
- *pointer_map_insert (wd->decl_map, (void *) var) = val;
+ wd->decl_map->put (var, val);
}
}
+2014-08-02 Trevor Saunders <tsaunders@mozilla.com>
+
+ * c-typeck.c: Use hash_map instead of pointer_map.
+
2014-08-02 Trevor Saunders <tsaunders@mozilla.com>
* c-decl.c: Use hash_set instead of pointer_set.
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;
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;
}
#ifndef GCC_CGRAPH_H
#define GCC_CGRAPH_H
+#include "hash-map.h"
#include "is-a.h"
#include "plugin-api.h"
#include "vec.h"
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;
};
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;
};
+2014-08-02 Trevor Saunders <tsaunders@mozilla.com>
+
+ * optimize.c, semantics.c: Use hash_map instead of pointer_map.
+
2014-08-02 Trevor Saunders <tsaunders@mozilla.com>
* class.c, cp-gimplify.c, cp-tree.h, decl.c, decl2.c, error.c,
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;
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];
}
/* 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);
{
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)
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);
}
}
{
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. */
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;
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;
}
{
duplicate_eh_regions_map label_map;
void *label_map_data;
- struct pointer_map_t *eh_map;
+ hash_map<void *, void *> *eh_map;
};
static void
{
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)
{
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);
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)
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);
# define GCC_EXCEPT_H
#endif
+#include "hash-map.h"
#include "hashtab.h"
struct function;
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);
#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"
};
/* 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;
/* 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
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)
{
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;
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;
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
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);
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. */
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. */
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);
static void
mark_key_deleted (T *&k)
{
- k = static_cast<T *> (1);
+ k = reinterpret_cast<T *> (1);
}
template<typename T>
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. */
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;
};
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;
}
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);
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);
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);
}
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;
free_cgraph_node_set (cgraph_node_set set)
{
set->nodes.release ();
- pointer_map_destroy (set->map);
+ delete set->map;
free (set);
}
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;
}
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);
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);
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);
}
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;
free_varpool_node_set (varpool_node_set set)
{
set->nodes.release ();
- pointer_map_destroy (set->map);
+ delete set->map;
free (set);
}
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;
}
{
encoder->nodes.release ();
if (encoder->map)
- pointer_map_destroy (encoder->map);
+ delete encoder->map;
free (encoder);
}
symtab_node *node)
{
int ref;
- void **slot;
if (!encoder->map)
{
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;
}
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
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;
}
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;
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. */
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;
}
ctx->depth = 1;
}
- ctx->cb.decl_map = pointer_map_create ();
+ ctx->cb.decl_map = new hash_map<tree, tree>;
return ctx;
}
{
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);
gimple_stmt_iterator psi;
gimple phi;
edge re, ene;
- edge_var_map_vector *head;
edge_var_map *vm;
size_t i;
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);
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);
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)
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);
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);
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))
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))
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);
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);
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,
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 ();
#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"
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 {
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. */
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;
&& 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;
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)
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);
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)))
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;
#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
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 ();
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);
#include "system.h"
#include "coretypes.h"
#include "hash-table.h"
+#include "hash-map.h"
#include "tm.h"
#include "tree.h"
#include "trans-mem.h"
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
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;
}
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);
}
{
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)
{
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
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
/* 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. */
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;
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));
}
DECL_CONTEXT (new_t) = to_context;
- *loc = new_t;
+ loc = new_t;
}
else
- new_t = (tree) *loc;
+ new_t = loc;
*tp = new_t;
}
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)
{
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;
}
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;
};
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;
}
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;
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;
/* 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;
}
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
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);
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;
find_goto_replacement (struct leh_tf_state *tf, treemple stmt)
{
unsigned int i;
- void **slot;
if (tf->goto_queue_active < LARGE_GOTO_QUEUE)
{
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;
}
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. */
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);
maybe_record_in_goto_queue (state, cont_stmt);
}
if (cont_map)
- pointer_map_destroy (cont_map);
+ delete cont_map;
replace_goto_queue (tf);
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. */
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;
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
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;
}
/* 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;
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;
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);
}
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);
#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);
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);
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 *);
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
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
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);
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)
/* 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)
{
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;
{
/* 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;
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;
}
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;
/* 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
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;
}
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;
}
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;
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);
}
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);
if (id->eh_map)
{
- pointer_map_destroy (id->eh_map);
+ delete id->eh_map;
id->eh_map = NULL;
}
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);
}
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);
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)
{
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)
{
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;
/* 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;
/* 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. */
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)
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
{
{
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;
|| 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)
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;
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;
}
*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
/* 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;
}
/* 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);
/* 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;
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. */
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;
#ifndef GCC_TREE_INLINE_H
#define GCC_TREE_INLINE_H
+#include "hash-map.h"
#include "hash-set.h"
struct cgraph_edge;
/* 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 *);
/* 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
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. */
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;
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);
info->any_parm_remapped = true;
}
- return (tree) *slot;
+ return *slot;
}
/* Build or return the variable that holds the static chain within
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);
info->any_tramp_created = true;
}
- return (tree) *slot;
+ return *slot;
}
/* Build or return the field within the non-local frame state that holds
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;
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);
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);
{
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);
(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);
*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);
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)
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;
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;
{
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;
}
&& 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;
}
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))
{
struct nesting_info *i;
tree newt, context;
- void **slot;
val = DECL_VALUE_EXPR (var);
type = TREE_TYPE (var);
&& 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;
SET_DECL_VALUE_EXPR (var, val);
}
- pointer_map_destroy (id.cb.decl_map);
+ delete id.cb.decl_map;
}
/* Fold the MEM_REF *E. */
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))
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));
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;
#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"
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. */
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
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
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
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));
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;
}
#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"
/* 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. */
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. */
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;
}
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 ();
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;
#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"
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;
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)
{
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;
}
}
/* 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;
}
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;
}
#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"
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);
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. */
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. */
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
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 ();
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.
/* 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;
vi->next = vi2->id;
- *slot_p = (void *) vi;
+ *slot_p = vi;
return vi;
}
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;
}
}
/* 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. */
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
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 */
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. */
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
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));
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);
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);
}
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 ();
obstack_free (&fake_var_decl_obstack, NULL);
- pointer_map_destroy (final_solutions);
+ delete final_solutions;
obstack_free (&final_solutions_obstack, NULL);
}
#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"
#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. */
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);
}
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. */
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;
}
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;
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);
#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"
/* 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);
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));
{
/* 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;
}
}
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);
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;
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;
/* 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;
}
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
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;
}
}
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)
{
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);
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
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
{
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);