From e1739422fe54f7bacb937b7194392d5fa6703dd9 Mon Sep 17 00:00:00 2001 From: Paolo Bonzini Date: Tue, 6 Feb 2007 14:34:51 +0000 Subject: 2006-02-06 Paolo Bonzini * 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 --- gcc/tree-ssa-loop-ivopts.c | 75 ++++++++++++++++------------------------------ 1 file changed, 25 insertions(+), 50 deletions(-) (limited to 'gcc/tree-ssa-loop-ivopts.c') 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)) -- cgit v1.2.3