diff options
author | Trevor Saunders <tsaunders@mozilla.com> | 2014-08-02 11:34:54 +0000 |
---|---|---|
committer | Trevor Saunders <tbsaunde@gcc.gnu.org> | 2014-08-02 11:34:54 +0000 |
commit | b787e7a2c2c9be2f548d4c76ec324b71859851a4 (patch) | |
tree | b20f9df1d7e2cb3a642d2fab604f827c7d23712a /gcc/tree-ssa.c | |
parent | 6e2830c3dbe0d4972519ddd44bd1b15b2b274ba2 (diff) | |
download | gcc-b787e7a2c2c9be2f548d4c76ec324b71859851a4.zip gcc-b787e7a2c2c9be2f548d4c76ec324b71859851a4.tar.gz gcc-b787e7a2c2c9be2f548d4c76ec324b71859851a4.tar.bz2 |
convert many uses of pointer_map to hash_map
gcc/c-family/
* cilk.c: Use hash_map instead of pointer_map.
gcc/c/
* c-typeck.c: Use hash_map instead of pointer_map.
gcc/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.
From-SVN: r213517
Diffstat (limited to 'gcc/tree-ssa.c')
-rw-r--r-- | gcc/tree-ssa.c | 81 |
1 files changed, 20 insertions, 61 deletions
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; |