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  <rguent...@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.

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 {

Reply via email to