OSDN Git Service

2010-04-20 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Apr 2010 12:39:45 +0000 (12:39 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 20 Apr 2010 12:39:45 +0000 (12:39 +0000)
* tree-ssa-structalias.c (do_structure_copy): Properly handle
DEREF.
(dump_sa_points_to_info): Remove asserts.
(init_base_vars): nothing_id isn't an escape point nor does it
have pointers.

* gcc.dg/ipa/ipa-pta-14.c: New testcase.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158553 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/ipa/ipa-pta-14.c [new file with mode: 0644]
gcc/tree-ssa-structalias.c

index 05eec88..c52ca2b 100644 (file)
@@ -1,3 +1,11 @@
+2010-04-20  Richard Guenther  <rguenther@suse.de>
+
+       * tree-ssa-structalias.c (do_structure_copy): Properly handle
+       DEREF.
+       (dump_sa_points_to_info): Remove asserts.
+       (init_base_vars): nothing_id isn't an escape point nor does it
+       have pointers.
+
 2010-04-20  Jakub Jelinek  <jakub@redhat.com>
 
        * tree.h (TYPE_REF_IS_RVALUE): Define.
index f479782..08619da 100644 (file)
@@ -1,3 +1,7 @@
+2010-04-20  Richard Guenther  <rguenther@suse.de>
+
+       * gcc.dg/ipa/ipa-pta-14.c: New testcase.
+
 2010-04-20  Jakub Jelinek  <jakub@redhat.com>
 
        * g++.dg/debug/dwarf2/rv1.C: New test.
diff --git a/gcc/testsuite/gcc.dg/ipa/ipa-pta-14.c b/gcc/testsuite/gcc.dg/ipa/ipa-pta-14.c
new file mode 100644 (file)
index 0000000..ffe16cc
--- /dev/null
@@ -0,0 +1,32 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -fipa-pta -fno-tree-sra -fdump-ipa-pta-details" } */
+
+struct X {
+    int i;
+    void *p;
+};
+
+static void * __attribute__((noinline,noclone))
+foo(struct X *q, void *p)
+{
+  struct X b;
+  b.p = p;
+  *q = b;
+  return q->p;
+}
+extern void abort (void);
+int main()
+{
+  struct X a, c;
+  void *p;
+  a.p = (void *)&c;
+  p = foo(&a, &a);
+  /* { dg-final { scan-ipa-dump "foo.result = { NULL a c }" "pta" { xfail *-*-* } } } */
+  /* { dg-final { scan-ipa-dump "foo.result = { NULL a a\[^ \]* c }" "pta" } } */
+  ((struct X *)p)->p = (void *)0;
+  if (a.p != (void *)0)
+    abort ();
+  return 0;
+}
+
+/* { dg-final { cleanup-ipa-dump "pta" } } */
index ad4c10d..781eff3 100644 (file)
@@ -3403,7 +3403,19 @@ do_structure_copy (tree lhsop, tree rhsop)
   if (lhsp->type == DEREF
       || (lhsp->type == ADDRESSOF && lhsp->var == anything_id)
       || rhsp->type == DEREF)
-    process_all_all_constraints (lhsc, rhsc);
+    {
+      if (lhsp->type == DEREF)
+       {
+         gcc_assert (VEC_length (ce_s, lhsc) == 1);
+         lhsp->offset = UNKNOWN_OFFSET;
+       }
+      if (rhsp->type == DEREF)
+       {
+         gcc_assert (VEC_length (ce_s, rhsc) == 1);
+         rhsp->offset = UNKNOWN_OFFSET;
+       }
+      process_all_all_constraints (lhsc, rhsc);
+    }
   else if (lhsp->type == SCALAR
           && (rhsp->type == SCALAR
               || rhsp->type == ADDRESSOF))
@@ -5910,13 +5922,7 @@ dump_sa_points_to_info (FILE *outfile)
     {
       varinfo_t vi = get_varinfo (i);
       if (!vi->may_have_pointers)
-       {
-         gcc_assert (find (i) == i
-                     || !(vi = get_varinfo (find (i)))->may_have_pointers);
-         /* ???  See create_variable_info_for.
-            gcc_assert (bitmap_empty_p (vi->solution));  */
-         continue;
-       }
+       continue;
       dump_solution_for_var (outfile, i);
     }
 }
@@ -5955,6 +5961,8 @@ init_base_vars (void)
   var_nothing->size = ~0;
   var_nothing->fullsize = ~0;
   var_nothing->is_special_var = 1;
+  var_nothing->may_have_pointers = 0;
+  var_nothing->is_global_var = 0;
 
   /* Create the ANYTHING variable, used to represent that a variable
      points to some unknown piece of memory.  */