Patchwork Fix fallout from fix for PR49651

login
register
mail settings
Submitter Richard Guenther
Date Jan. 3, 2012, 2:03 p.m.
Message ID <alpine.LNX.2.00.1201031501560.4999@zhemvz.fhfr.qr>
Download mbox | patch
Permalink /patch/134006/
State New
Headers show

Comments

Richard Guenther - Jan. 3, 2012, 2:03 p.m.
The fix for PR49651 was too conservative as I noticed when trying
to backport it to the 4.5 branch.  The following adjusts it to
preserve the optimization cases we have in the tree-ssa testsuite.

Bootstrap / regtest pending on x86_64-unknown-linux-gnu.

Richard.

2012-01-03  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/49651
	* tree-ssa-structalias.c (type_can_have_subvars): New function.
	(var_can_have_subvars): Use it.
	(get_constraint_for_1): Only consider subfields if there
	can be any.

	* gcc.dg/tree-ssa/pta-ptrarith-1.c: Adjust.
	* gcc.dg/tree-ssa/pta-ptrarith-2.c: Likewise.

Patch

Index: gcc/tree-ssa-structalias.c
===================================================================
--- gcc/tree-ssa-structalias.c	(revision 182838)
+++ gcc/tree-ssa-structalias.c	(working copy)
@@ -303,6 +303,7 @@  static varinfo_t first_vi_for_offset (va
 static varinfo_t first_or_preceding_vi_for_offset (varinfo_t,
 						   unsigned HOST_WIDE_INT);
 static varinfo_t lookup_vi_for_tree (tree);
+static inline bool type_can_have_subvars (const_tree);
 
 /* Pool of variable info structures.  */
 static alloc_pool variable_info_pool;
@@ -3275,7 +3276,8 @@  get_constraint_for_1 (tree t, VEC (ce_s,
 		return;
 
 	      cs = *VEC_last (ce_s, *results);
-	      if (cs.type == DEREF)
+	      if (cs.type == DEREF
+		  && type_can_have_subvars (TREE_TYPE (t)))
 		{
 		  /* For dereferences this means we have to defer it
 		     to solving time.  */
@@ -5043,6 +5045,15 @@  sort_fieldstack (VEC(fieldoff_s,heap) *f
   VEC_qsort (fieldoff_s, fieldstack, fieldoff_compare);
 }
 
+/* Return true if T is a type that can have subvars.  */
+
+static inline bool
+type_can_have_subvars (const_tree t)
+{
+  /* Aggregates without overlapping fields can have subvars.  */
+  return TREE_CODE (t) == RECORD_TYPE;
+}
+
 /* Return true if V is a tree that we can have subvars for.
    Normally, this is any aggregate type.  Also complex
    types which are not gimple registers can have subvars.  */
@@ -5058,11 +5069,7 @@  var_can_have_subvars (const_tree v)
   if (!DECL_P (v))
     return false;
 
-  /* Aggregates without overlapping fields can have subvars.  */
-  if (TREE_CODE (TREE_TYPE (v)) == RECORD_TYPE)
-    return true;
-
-  return false;
+  return type_can_have_subvars (TREE_TYPE (v));
 }
 
 /* Return true if T is a type that does contain pointers.  */
Index: gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-1.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-1.c	(revision 182838)
+++ gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-1.c	(working copy)
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-ealias" } */
+/* { dg-options "-O2 -fno-tree-forwprop -fno-tree-ccp -fdump-tree-ealias" } */
 
 extern void abort (void);
 struct X {
Index: gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c
===================================================================
--- gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c	(revision 182838)
+++ gcc/testsuite/gcc.dg/tree-ssa/pta-ptrarith-2.c	(working copy)
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-ealias" } */
+/* { dg-options "-O2 -fno-tree-forwprop -fno-tree-ccp -fdump-tree-ealias" } */
 
 extern void abort (void);
 struct X {