aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog27
-rw-r--r--gcc/Makefile.in7
-rw-r--r--gcc/tree-dfa.c12
-rw-r--r--gcc/tree-flow.h5
-rw-r--r--gcc/tree-ssa-alias.c2
-rw-r--r--gcc/tree-ssa-structalias.c102
-rw-r--r--gcc/tree-ssa.c3
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 ());
}