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]

Fix darwin bootstrap


Fixes the bootstrap problem reported by Andrew Pinski.  We can't
propagate pointers that don't have the same alias sets as they will
receive different type tags if they are ever dereferenced.

Also, when creating name tags, we need to clear previous name tags if
the pointer hasn't been dereferenced (caught by the verifier).

Bootstrapped and tested x86, x86-64, alpha and ppc.  Andrew tells me the
patch fixes the regression.

Mainline is currently broken so I won't commit until it's fixed.


Diego.


	* tree-ssa-alias.c (create_name_tags): Ignore pointers that
	don't have PT_VARS nor PT_MALLOC set.
	Clear name tag from pointers that have not been dereferenced.
	(set_pt_anything, set_pt_malloc): Forward declare.
	* tree-ssa-copy.c (may_propagate_copy): Compare alias sets if
	the two pointers have no type tags.


testsuite/ChangeLog


	* gcc.c-torture/compile/20040726-2.c: New test.


Index: tree-ssa-alias.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-alias.c,v
retrieving revision 2.16
diff -d -c -p -u -r2.16 tree-ssa-alias.c
--- tree-ssa-alias.c	24 Jul 2004 01:05:44 -0000	2.16
+++ tree-ssa-alias.c	27 Jul 2004 02:28:05 -0000
@@ -157,6 +157,8 @@ static bool ptr_is_dereferenced_by (tree
 static void maybe_create_global_var (struct alias_info *ai);
 static void group_aliases (struct alias_info *);
 static struct ptr_info_def *get_ptr_info (tree t);
+static void set_pt_anything (tree ptr);
+static void set_pt_malloc (tree ptr);
 
 /* Global declarations.  */
 
@@ -773,7 +775,12 @@ create_name_tags (struct alias_info *ai)
       struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
 
       if (!pi->is_dereferenced)
-	continue;
+	{
+	  /* No name tags for pointers that have not been
+	     dereferenced.  */
+	  pi->name_mem_tag = NULL_TREE;
+	  continue;
+	}
 
       if (pi->pt_vars)
 	{
@@ -828,7 +835,8 @@ create_name_tags (struct alias_info *ai)
 	  /* Only pointers that may point to malloc or other variables
 	     may receive a name tag.  If the pointer does not point to
 	     a known spot, we should use type tags.  */
-	  abort ();
+	  set_pt_anything (ptr);
+	  continue;
 	}
 
       /* Mark the new name tag for renaming.  */
Index: tree-ssa-copy.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-ssa-copy.c,v
retrieving revision 2.11
diff -d -c -p -u -r2.11 tree-ssa-copy.c
--- tree-ssa-copy.c	24 Jul 2004 01:05:44 -0000	2.11
+++ tree-ssa-copy.c	27 Jul 2004 02:28:05 -0000
@@ -112,6 +112,9 @@ may_propagate_copy (tree dest, tree orig
 	return false;
       else if (!lang_hooks.types_compatible_p (type_d, type_o))
 	return false;
+      else if (!alias_sets_conflict_p (get_alias_set (type_d),
+				       get_alias_set (type_o)))
+	return false;
     }
 
   /* If the destination is a SSA_NAME for a virtual operand, then we have
Index: testsuite/gcc.c-torture/compile/20040726-2.c
===================================================================
RCS file: testsuite/gcc.c-torture/compile/20040726-2.c
diff -N testsuite/gcc.c-torture/compile/20040726-2.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/gcc.c-torture/compile/20040726-2.c	27 Jul 2004 02:28:08 -0000
@@ -0,0 +1,32 @@
+/* Extracted from boehm-gc/os_dep.c on Darwin.  It caused an ICE when
+   trying to merge alias information from two pointers that had
+   different type memory tags.  */
+typedef int thread_state_flavor_t;
+typedef int exception_behavior_t;
+typedef unsigned int exception_mask_t;
+typedef unsigned int exception_handler_t;
+typedef unsigned int mach_msg_type_number_t;
+static struct {
+   mach_msg_type_number_t count;
+   exception_mask_t masks[16];
+   exception_handler_t ports[16];
+   thread_state_flavor_t flavors[16];
+} GC_old_exc_ports;
+
+typedef exception_handler_t *exception_handler_array_t;
+typedef thread_state_flavor_t *exception_flavor_array_t;
+
+
+int task_get_exception_ports
+(
+  mach_msg_type_number_t *masksCnt,
+  exception_handler_array_t old_handlers,
+  exception_flavor_array_t old_flavors
+);
+
+void GC_dirty_init()
+{
+   task_get_exception_ports(GC_old_exc_ports.masks,
+                           GC_old_exc_ports.ports,
+                           GC_old_exc_ports.flavors);
+}



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