This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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"

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]