diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2007-02-06 14:34:51 +0000 |
---|---|---|
committer | Paolo Bonzini <bonzini@gnu.org> | 2007-02-06 14:34:51 +0000 |
commit | e1739422fe54f7bacb937b7194392d5fa6703dd9 (patch) | |
tree | 9ee2a06ba9a73c0dbf9a0d7de12bd0049f095cce /gcc/tree-ssa-loop-ivopts.c | |
parent | 86029e629cb5670d916d47a07989bbef7c481237 (diff) |
2006-02-06 Paolo Bonzini <bonzini@gnu.org>
* Makefile.in (tree-ssa-loop-ivopts.o): Add pointer-set.h dependency.
(tree-ssa-reassoc.o): Add pointer-set.h dependency.
(tree-cfg.o): Remove hashtab.h dependency.
* tree-ssa-loop-ivopts.c: Include pointer-set.h.
(struct ivopts_data): Change niters to pointer_map_t.
(struct nfe_cache_elt, nfe_hash, nfe_eq): Delete.
(niter_for_exit): Create pointer_map on demand. Change for
pointer_map API.
(tree_ssa_iv_optimize_init): Initialize data->niters to NULL.
(free_loop_data): Destroy data->niters if created and reset field.
(tree_ssa_iv_optimize_finalize): Don't delete data->niters here.
(tree_ssa_iv_optimize_loop): Check for presence of stale data.
* tree-ssa-reassoc.c: Include pointer-set.h.
(bb_rank): Change to long *.
(operand_rank): Change to pointer_map_t.
(find_operand_rank): Return long, -1 if not found. Declare as inline.
(insert_operand_rank): Accept long.
(operand_entry_hash, operand_entry_eq): Remove.
(get_rank): Return long. Adjust for changes above.
(init_reassoc): Change rank type to long. Adjust creation of bb_rank
and operand_rank.
(fini_reassoc): Delete operand_rank with pointer_map_destroy.
* tree-ssa-structalias.c (vi_for_tree): Change to pointer_map.
(struct tree_vi, tree_vi_t, tree_vi_hash, tree_vi_eq): Delete.
(insert_vi_for_tree): Rewrite for pointer_map API. Assert argument
is not NULL.
(lookup_vi_for_tree): Rewrite for pointer_map API. Return varinfo_t
directly since it cannot be NULL.
(get_vi_for_tree): Rewrite for pointer_map API.
(find_what_p_points_to): Adjust for change to lookup_vi_for_tree.
(init_alias_vars): Create vi_for_tree as pointer_map.
(delete_points_to_sets): Delete vi_for_tree using pointer_map_destroy.
* tree-cfg.c: Don't include hashtab.h.
(edge_to_cases): Declare as pointer_map.
(struct edge_to_cases_elt, edge_to_cases_hash, edge_to_cases_eq):
Delete.
(edge_to_cases_cleanup): Rewrite as pointer_map_traverse callback.
(start_recording_case_labels): Create edge_to_cases as pointer_map.
(end_recoding_case_labels): Cleanup edge_to_cases manually before
destroying it.
(record_switch_edge): Delete.
(get_cases_for_edge): Adjust for pointer_map API, inline
record_switch_edge (rewritten for new API), remove goto.
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@121648 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-loop-ivopts.c')
-rw-r--r-- | gcc/tree-ssa-loop-ivopts.c | 75 |
1 files changed, 25 insertions, 50 deletions
diff --git a/gcc/tree-ssa-loop-ivopts.c b/gcc/tree-ssa-loop-ivopts.c index 65f1b84df14..5982b3d3f62 100644 --- a/gcc/tree-ssa-loop-ivopts.c +++ b/gcc/tree-ssa-loop-ivopts.c @@ -83,6 +83,7 @@ Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA #include "ggc.h" #include "insn-config.h" #include "recog.h" +#include "pointer-set.h" #include "hashtab.h" #include "tree-chrec.h" #include "tree-scalar-evolution.h" @@ -208,7 +209,7 @@ struct ivopts_data unsigned regs_used; /* Numbers of iterations for all exits of the current loop. */ - htab_t niters; + struct pointer_map_t *niters; /* The size of version_info array allocated. */ unsigned version_info_size; @@ -673,58 +674,26 @@ contains_abnormal_ssa_name_p (tree expr) return false; } -/* Element of the table in that we cache the numbers of iterations obtained - from exits of the loop. */ - -struct nfe_cache_elt -{ - /* The edge for that the number of iterations is cached. */ - edge exit; - - /* Number of iterations corresponding to this exit, or NULL if it cannot be - determined. */ - tree niter; -}; - -/* Hash function for nfe_cache_elt E. */ - -static hashval_t -nfe_hash (const void *e) -{ - const struct nfe_cache_elt *elt = e; - - return htab_hash_pointer (elt->exit); -} - -/* Equality function for nfe_cache_elt E1 and edge E2. */ - -static int -nfe_eq (const void *e1, const void *e2) -{ - const struct nfe_cache_elt *elt1 = e1; - - return elt1->exit == e2; -} - /* Returns tree describing number of iterations determined from EXIT of DATA->current_loop, or NULL if something goes wrong. */ static tree niter_for_exit (struct ivopts_data *data, edge exit) { - struct nfe_cache_elt *nfe_desc; struct tree_niter_desc desc; - PTR *slot; - - slot = htab_find_slot_with_hash (data->niters, exit, - htab_hash_pointer (exit), - INSERT); + tree niter; + void **slot; - if (!*slot) + if (!data->niters) { - nfe_desc = xmalloc (sizeof (struct nfe_cache_elt)); - nfe_desc->exit = exit; + data->niters = pointer_map_create (); + slot = NULL; + } + else + slot = pointer_map_contains (data->niters, exit); + if (!slot) + { /* Try to determine number of iterations. We must know it unconditionally (i.e., without possibility of # of iterations being zero). Also, we cannot safely work with ssa names that @@ -734,14 +703,16 @@ niter_for_exit (struct ivopts_data *data, edge exit) exit, &desc, true) && integer_zerop (desc.may_be_zero) && !contains_abnormal_ssa_name_p (desc.niter)) - nfe_desc->niter = desc.niter; + niter = desc.niter; else - nfe_desc->niter = NULL_TREE; + niter = NULL_TREE; + + *pointer_map_insert (data->niters, exit) = niter; } else - nfe_desc = *slot; + niter = *slot; - return nfe_desc->niter; + return niter; } /* Returns tree describing number of iterations determined from @@ -770,7 +741,7 @@ tree_ssa_iv_optimize_init (struct ivopts_data *data) data->relevant = BITMAP_ALLOC (NULL); data->important_candidates = BITMAP_ALLOC (NULL); data->max_inv_id = 0; - data->niters = htab_create (10, nfe_hash, nfe_eq, free); + data->niters = NULL; data->iv_uses = VEC_alloc (iv_use_p, heap, 20); data->iv_candidates = VEC_alloc (iv_cand_p, heap, 20); decl_rtl_to_reset = VEC_alloc (tree, heap, 20); @@ -5236,7 +5207,11 @@ free_loop_data (struct ivopts_data *data) bitmap_iterator bi; tree obj; - htab_empty (data->niters); + if (data->niters) + { + pointer_map_destroy (data->niters); + data->niters = NULL; + } EXECUTE_IF_SET_IN_BITMAP (data->relevant, 0, i, bi) { @@ -5304,7 +5279,6 @@ tree_ssa_iv_optimize_finalize (struct ivopts_data *data) free (data->version_info); BITMAP_FREE (data->relevant); BITMAP_FREE (data->important_candidates); - htab_delete (data->niters); VEC_free (tree, heap, decl_rtl_to_reset); VEC_free (iv_use_p, heap, data->iv_uses); @@ -5320,6 +5294,7 @@ tree_ssa_iv_optimize_loop (struct ivopts_data *data, struct loop *loop) struct iv_ca *iv_ca; edge exit; + gcc_assert (!data->niters); data->current_loop = loop; if (dump_file && (dump_flags & TDF_DETAILS)) |