diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 27 | ||||
-rw-r--r-- | gcc/Makefile.in | 7 | ||||
-rw-r--r-- | gcc/tree-dfa.c | 12 | ||||
-rw-r--r-- | gcc/tree-flow.h | 5 | ||||
-rw-r--r-- | gcc/tree-ssa-alias.c | 2 | ||||
-rw-r--r-- | gcc/tree-ssa-structalias.c | 102 | ||||
-rw-r--r-- | gcc/tree-ssa.c | 3 |
7 files changed, 92 insertions, 66 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9465d80..3a0cbc6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,30 @@ +2005-11-10 Daniel Berlin <dberlin@dberlin.org> + + * tree-ssa-alias.c (compute_may_aliases): Remove call to + delete_old_heap_vars. + * tree-dfa.c (referenced_var_remove): Remove function. + * tree-ssa.c (init_tree_ssa): Call init_alias_heapvars. + (delete_tree_ssa): Remove call to delete_old_heapvars. + Add call to delete_alias_heapvars. + * tree-flow.h (referenced_var_remove): Remove prototype + (init_alias_heapvars): New prototype. + (delete_alias_heapvars): Ditto. + * Makefile.in (tree-ssa-structalias.o): Add + gt-tree-ssa-structalias.o + (GTFILES): Add tree-ssa-structalias.h and + tree-ssa-structalias.c. + (s-gtype): Add gt-tree-ssa-structalias.h. + * tree-ssa-structalias.c (heapvars): Remove. + (oldheapvars): Remove. + (heapvar_for_stmt): New variable. + (heapvar_lookup): New function. + (heapvar_insert): Ditto. + (get_constraint_for): See if we have an old heapvar + to reuse. + (init_alias_heapvars): New function. + (delete_alias_heapvars): Ditto. + Add include of gt-tree-ssa-structalias.h. + 2005-11-10 Eric Botcazou <ebotcazou@libertysurf.fr> PR middle-end/22127 diff --git a/gcc/Makefile.in b/gcc/Makefile.in index 4fbbd6c..934d439 100644 --- a/gcc/Makefile.in +++ b/gcc/Makefile.in @@ -1743,7 +1743,8 @@ stor-layout.o : stor-layout.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ toplev.h tree-ssa-structalias.o: tree-ssa-structalias.c tree-ssa-structalias.h \ $(SYSTEM_H) $(CONFIG_H) $(GGC_H) $(TREE_H) $(TREE_FLOW_H) \ - $(TM_H) coretypes.h cgraph.h tree-pass.h $(TIMEVAR_H) + $(TM_H) coretypes.h cgraph.h tree-pass.h $(TIMEVAR_H) \ + gt-tree-ssa-structalias.h tree-ssa.o : tree-ssa.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \ $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) output.h $(DIAGNOSTIC_H) \ toplev.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h \ @@ -2756,7 +2757,8 @@ GTFILES = $(srcdir)/input.h $(srcdir)/coretypes.h \ $(srcdir)/tree-chrec.h $(srcdir)/tree-vect-generic.c \ $(srcdir)/tree-ssa-operands.h $(srcdir)/tree-ssa-operands.c \ $(srcdir)/tree-profile.c $(srcdir)/tree-nested.c \ - $(srcdir)/ipa-reference.c \ + $(srcdir)/ipa-reference.c $(srcdir)/tree-ssa-structalias.h \ + $(srcdir)/tree-ssa-structalias.c \ $(srcdir)/targhooks.c $(out_file) \ @all_gtfiles@ @@ -2778,6 +2780,7 @@ gt-tree-profile.h gt-tree-ssa-address.h \ gt-tree-ssanames.h gt-tree-iterator.h gt-gimplify.h \ gt-tree-phinodes.h gt-tree-nested.h \ gt-tree-ssa-operands.h gt-tree-ssa-propagate.h \ +gt-tree-ssa-structalias.h \ gt-stringpool.h gt-targhooks.h : s-gtype ; @true define echo_quoted_to_gtyp diff --git a/gcc/tree-dfa.c b/gcc/tree-dfa.c index 2ede8e6..9fc48d5 100644 --- a/gcc/tree-dfa.c +++ b/gcc/tree-dfa.c @@ -609,18 +609,6 @@ referenced_var_insert (unsigned int uid, tree to) *(struct int_tree_map **) loc = h; } -/* Remove the pair DECL_UID (TO), TO from the referenced vars - hashtable. */ - -void -referenced_var_remove (tree to) -{ - struct int_tree_map in; - in.uid = DECL_UID (to); - in.to = to; - htab_remove_elt_with_hash (referenced_vars, &in, in.uid); -} - /* Add VAR to the list of dereferenced variables. WALK_STATE contains a hash table used to avoid adding the same diff --git a/gcc/tree-flow.h b/gcc/tree-flow.h index b61b357..8b01f8b 100644 --- a/gcc/tree-flow.h +++ b/gcc/tree-flow.h @@ -423,7 +423,6 @@ extern GTY((param_is (struct int_tree_map))) htab_t referenced_vars; extern tree referenced_var_lookup (unsigned int); extern tree referenced_var_lookup_if_exists (unsigned int); -extern void referenced_var_remove (tree); #define num_referenced_vars htab_elements (referenced_vars) #define referenced_var(i) referenced_var_lookup (i) @@ -892,7 +891,9 @@ int push_fields_onto_fieldstack (tree, VEC(fieldoff_s,heap) **, HOST_WIDE_INT, bool *); void sort_fieldstack (VEC(fieldoff_s,heap) *); -void delete_old_heap_vars (void); +void init_alias_heapvars (void); +void delete_alias_heapvars (void); + #include "tree-flow-inline.h" #endif /* _TREE_FLOW_H */ diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c index 5397894..84c5225 100644 --- a/gcc/tree-ssa-alias.c +++ b/gcc/tree-ssa-alias.c @@ -252,8 +252,6 @@ compute_may_aliases (void) memset (&alias_stats, 0, sizeof (alias_stats)); - delete_old_heap_vars (); - /* Initialize aliasing information. */ ai = init_alias_info (); diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c index 67e872a..db230af 100644 --- a/gcc/tree-ssa-structalias.c +++ b/gcc/tree-ssa-structalias.c @@ -159,9 +159,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA TODO: We could handle unions, but to be honest, it's probably not worth the pain or slowdown. */ -static VEC(tree, heap) *heapvars = NULL; -static VEC(tree, heap) *oldheapvars = NULL; - +static GTY ((if_marked ("tree_map_marked_p"), param_is (struct tree_map))) + htab_t heapvar_for_stmt; static bool use_field_sensitive = true; static unsigned int create_variable_info_for (tree, const char *); static struct constraint_expr get_constraint_for (tree, bool *); @@ -311,6 +310,38 @@ static varinfo_t var_anyoffset; static tree anyoffset_tree; static unsigned int anyoffset_id; + +/* Lookup a heap var for STMT, and return it if we find one. */ + +static tree +heapvar_lookup (tree stmt) +{ + struct tree_map *h, in; + in.from = from; + + h = htab_find_with_hash (heapvar_for_stmt, &in, htab_hash_pointer (from)); + if (h) + return h->to; + return NULL_TREE; +} + +/* Insert a mapping FROM->TO in the heap var for statement + hashtable. */ + +static void +heapvar_insert (tree from, tree to) +{ + struct tree_map *h; + void **loc; + + h = ggc_alloc (sizeof (struct tree_map)); + h->hash = htab_hash_pointer (from); + h->from = from; + h->to = to; + loc = htab_find_slot_with_hash (heapvar_for_stmt, h, h->hash, INSERT); + *(struct tree_map **) loc = h; +} + /* Return a new variable info structure consisting for a variable named NAME, and using constraint graph node NODE. */ @@ -2213,12 +2244,16 @@ get_constraint_for (tree t, bool *need_anyoffset) if (call_expr_flags (t) & (ECF_MALLOC | ECF_MAY_BE_ALLOCA)) { varinfo_t vi; - tree heapvar; + tree heapvar = heapvar_lookup (t); - heapvar = create_tmp_var_raw (ptr_type_node, "HEAP"); - VEC_safe_push (tree, heap, heapvars, heapvar); - DECL_EXTERNAL (heapvar) = 1; - add_referenced_tmp_var (heapvar); + if (heapvar == NULL) + { + heapvar = create_tmp_var_raw (ptr_type_node, "HEAP"); + DECL_EXTERNAL (heapvar) = 1; + add_referenced_tmp_var (heapvar); + heapvar_insert (t, heapvar); + } + temp.var = create_variable_info_for (heapvar, alias_get_name (heapvar)); @@ -3768,45 +3803,18 @@ delete_points_to_sets (void) have_alias_info = false; } -/* Delete old heap vars, since nothing else will remove them for - us. */ -void -delete_old_heap_vars (void) +/* Initialize the heapvar for statement mapping. */ +void +init_alias_heapvars (void) { - if (!in_ssa_p) - { - VEC_free (tree, heap, heapvars); - VEC_free (tree, heap, oldheapvars); - heapvars = NULL; - oldheapvars = NULL; - } - /* Why is this complicated? - We can't remove the heapvars from the referenced var array until - they go away from the ssa form, and we can't remove them from the - ssa form until we've renamed it. We can't renamed it if it's not - in the referenced vars array. - Thus, we have to first mark it for renaming, and then the *next* - time after that we call this function, we can remove it from - referenced vars. */ + heapvar_for_stmt = htab_create_ggc (11, tree_map_hash, tree_map_eq, NULL); +} - if (!VEC_empty (tree, heapvars)) - { - int i; - tree heapvar; - for (i = 0; VEC_iterate (tree, heapvars, i, heapvar); i++) - { - if (in_ssa_p) - mark_sym_for_renaming (heapvar); - DECL_EXTERNAL (heapvar) = false; - bitmap_clear_bit (call_clobbered_vars, DECL_UID (heapvar)); - } - if (!VEC_empty (tree, oldheapvars)) - { - for (i = 0; VEC_iterate (tree, oldheapvars, i, heapvar); i++) - referenced_var_remove (heapvar); - } - VEC_free (tree, heap, oldheapvars); - oldheapvars = heapvars; - heapvars = NULL; - } +void +delete_alias_heapvars (void) +{ + htab_delete (heapvar_for_stmt); } + + +#include "gt-tree-ssa-structalias.h" diff --git a/gcc/tree-ssa.c b/gcc/tree-ssa.c index 15af7f3..081d21a 100644 --- a/gcc/tree-ssa.c +++ b/gcc/tree-ssa.c @@ -803,6 +803,7 @@ init_tree_ssa (void) int_tree_map_eq, NULL); call_clobbered_vars = BITMAP_ALLOC (NULL); addressable_vars = BITMAP_ALLOC (NULL); + init_alias_heapvars (); init_ssanames (); init_phinodes (); global_var = NULL_TREE; @@ -848,7 +849,6 @@ delete_tree_ssa (void) set_phi_nodes (bb, NULL); } - delete_old_heap_vars (); /* Remove annotations from every referenced variable. */ FOR_EACH_REFERENCED_VAR (var, rvi) { @@ -868,6 +868,7 @@ delete_tree_ssa (void) addressable_vars = NULL; modified_noreturn_calls = NULL; aliases_computed_p = false; + delete_alias_heapvars (); gcc_assert (!need_ssa_update_p ()); } |