This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH]: Change fix for 23382
- From: Daniel Berlin <dberlin at dberlin dot org>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>, Diego Novillo <dnovillo at redhat dot com>
- Date: Wed, 09 Nov 2005 22:04:32 -0500
- Subject: [PATCH]: Change fix for 23382
Diego, is this one better for you?
2005-11-09 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.
Index: tree-ssa-alias.c
===================================================================
--- tree-ssa-alias.c (revision 106643)
+++ tree-ssa-alias.c (working copy)
@@ -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 ();
Index: tree-dfa.c
===================================================================
--- tree-dfa.c (revision 106643)
+++ tree-dfa.c (working copy)
@@ -609,18 +609,6 @@ referenced_var_insert (unsigned int uid,
*(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
Index: tree-ssa.c
===================================================================
--- tree-ssa.c (revision 106643)
+++ tree-ssa.c (working copy)
@@ -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 ());
}
Index: tree-flow.h
===================================================================
--- tree-flow.h (revision 106643)
+++ tree-flow.h (working copy)
@@ -423,7 +423,6 @@ extern GTY((param_is (struct int_tree_ma
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, V
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 */
Index: Makefile.in
===================================================================
--- Makefile.in (revision 106592)
+++ Makefile.in (working copy)
@@ -1743,7 +1743,8 @@ stor-layout.o : stor-layout.c $(CONFIG_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)/co
$(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
Index: tree-ssa-structalias.c
===================================================================
--- tree-ssa-structalias.c (revision 106643)
+++ tree-ssa-structalias.c (working copy)
@@ -159,9 +159,8 @@ Foundation, Inc., 51 Franklin Street, Fi
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_a
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));
@@ -3460,6 +3495,7 @@ static void
init_alias_vars (void)
{
bitmap_obstack_initialize (&ptabitmap_obstack);
+
}
@@ -3768,45 +3804,18 @@ delete_points_to_sets (void)
have_alias_info = false;
}
-/* Delete old heap vars, since nothing else will remove them for
- us. */
+/* Initialize the heapvar for statement mapping. */
+void
+init_alias_heapvars (void)
+{
+ heapvar_for_stmt = htab_create_ggc (11, tree_map_hash, tree_map_eq, NULL);
+}
+
void
-delete_old_heap_vars (void)
+delete_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. */
-
- 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;
- }
+ htab_delete (heapvar_for_stmt);
}
+
+
+#include "gt-tree-ssa-structalias.h"