diff options
author | David Edelsohn <dje.gcc@gmail.com> | 2015-07-25 01:28:21 +0000 |
---|---|---|
committer | David Edelsohn <dje@gcc.gnu.org> | 2015-07-24 21:28:21 -0400 |
commit | 64d7fb90be5b6aba8ae99e3510faec8d73df879e (patch) | |
tree | dbdb2c3fec9b247df8cbdbf94a7a9569a539909f /gcc/tree-ssa-live.c | |
parent | a406c8ce3f42685e53d8ade8ea4920b26f839ada (diff) | |
download | gcc-64d7fb90be5b6aba8ae99e3510faec8d73df879e.zip gcc-64d7fb90be5b6aba8ae99e3510faec8d73df879e.tar.gz gcc-64d7fb90be5b6aba8ae99e3510faec8d73df879e.tar.bz2 |
Revert:
2015-07-23 Alexandre Oliva <aoliva@redhat.com>
From-SVN: r226202
Diffstat (limited to 'gcc/tree-ssa-live.c')
-rw-r--r-- | gcc/tree-ssa-live.c | 99 |
1 files changed, 94 insertions, 5 deletions
diff --git a/gcc/tree-ssa-live.c b/gcc/tree-ssa-live.c index 4772558..5b00f58 100644 --- a/gcc/tree-ssa-live.c +++ b/gcc/tree-ssa-live.c @@ -70,6 +70,88 @@ static void verify_live_on_entry (tree_live_info_p); ssa_name or variable, and vice versa. */ +/* Hashtable helpers. */ + +struct tree_int_map_hasher : nofree_ptr_hash <tree_int_map> +{ + static inline hashval_t hash (const tree_int_map *); + static inline bool equal (const tree_int_map *, const tree_int_map *); +}; + +inline hashval_t +tree_int_map_hasher::hash (const tree_int_map *v) +{ + return tree_map_base_hash (v); +} + +inline bool +tree_int_map_hasher::equal (const tree_int_map *v, const tree_int_map *c) +{ + return tree_int_map_eq (v, c); +} + + +/* This routine will initialize the basevar fields of MAP. */ + +static void +var_map_base_init (var_map map) +{ + int x, num_part; + tree var; + struct tree_int_map *m, *mapstorage; + + num_part = num_var_partitions (map); + hash_table<tree_int_map_hasher> tree_to_index (num_part); + /* We can have at most num_part entries in the hash tables, so it's + enough to allocate so many map elements once, saving some malloc + calls. */ + mapstorage = m = XNEWVEC (struct tree_int_map, num_part); + + /* If a base table already exists, clear it, otherwise create it. */ + free (map->partition_to_base_index); + map->partition_to_base_index = (int *) xmalloc (sizeof (int) * num_part); + + /* Build the base variable list, and point partitions at their bases. */ + for (x = 0; x < num_part; x++) + { + struct tree_int_map **slot; + unsigned baseindex; + var = partition_to_var (map, x); + if (SSA_NAME_VAR (var) + && (!VAR_P (SSA_NAME_VAR (var)) + || !DECL_IGNORED_P (SSA_NAME_VAR (var)))) + m->base.from = SSA_NAME_VAR (var); + else + /* This restricts what anonymous SSA names we can coalesce + as it restricts the sets we compute conflicts for. + Using TREE_TYPE to generate sets is the easies as + type equivalency also holds for SSA names with the same + underlying decl. + + Check gimple_can_coalesce_p when changing this code. */ + m->base.from = (TYPE_CANONICAL (TREE_TYPE (var)) + ? TYPE_CANONICAL (TREE_TYPE (var)) + : TREE_TYPE (var)); + /* If base variable hasn't been seen, set it up. */ + slot = tree_to_index.find_slot (m, INSERT); + if (!*slot) + { + baseindex = m - mapstorage; + m->to = baseindex; + *slot = m; + m++; + } + else + baseindex = (*slot)->to; + map->partition_to_base_index[x] = baseindex; + } + + map->num_basevars = m - mapstorage; + + free (mapstorage); +} + + /* Remove the base table in MAP. */ static void @@ -247,17 +329,21 @@ partition_view_fini (var_map map, bitmap selected) } -/* Create a partition view which includes all the used partitions in MAP. */ +/* Create a partition view which includes all the used partitions in MAP. If + WANT_BASES is true, create the base variable map as well. */ void -partition_view_normal (var_map map) +partition_view_normal (var_map map, bool want_bases) { bitmap used; used = partition_view_init (map); partition_view_fini (map, used); - var_map_base_fini (map); + if (want_bases) + var_map_base_init (map); + else + var_map_base_fini (map); } @@ -266,7 +352,7 @@ partition_view_normal (var_map map) as well. */ void -partition_view_bitmap (var_map map, bitmap only) +partition_view_bitmap (var_map map, bitmap only, bool want_bases) { bitmap used; bitmap new_partitions = BITMAP_ALLOC (NULL); @@ -282,7 +368,10 @@ partition_view_bitmap (var_map map, bitmap only) } partition_view_fini (map, new_partitions); - var_map_base_fini (map); + if (want_bases) + var_map_base_init (map); + else + var_map_base_fini (map); } |