OSDN Git Service

PR 21584
authordnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Jul 2005 03:55:28 +0000 (03:55 +0000)
committerdnovillo <dnovillo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 1 Jul 2005 03:55:28 +0000 (03:55 +0000)
PR 22219
* tree-ssa-alias.c (create_name_tags): Also process
non-dereferenced pointers.
Remove argument 'ai'.  Update all callers.

testsuite/ChangeLog

PR 21584
PR 22219
* g++.dg/tree-ssa/pr21584-1.C: New test.
* g++.dg/tree-ssa/pr21584-2.C: New test.

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/tree-ssa/pr21584-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/tree-ssa/pr21584-2.C [new file with mode: 0644]
gcc/tree-ssa-alias.c

index 39107ae..89f189c 100644 (file)
@@ -1,3 +1,11 @@
+2005-06-30  Diego Novillo  <dnovillo@redhat.com>
+
+       PR 21584
+       PR 22219
+       * tree-ssa-alias.c (create_name_tags): Also process
+       non-dereferenced pointers.
+       Remove argument 'ai'.  Update all callers.
+
 2005-06-30  Andrew Pinski  <pinskia@physics.uc.edu>
 
        * config/rs6000/darwin.h (STARTING_FRAME_OFFSET):
index fe7a632..47001d3 100644 (file)
@@ -1,3 +1,10 @@
+2005-06-30  Diego Novillo  <dnovillo@redhat.com>
+
+       PR 21584
+       PR 22219
+       * g++.dg/tree-ssa/pr21584-1.C: New test.
+       * g++.dg/tree-ssa/pr21584-2.C: New test.
+
 2005-06-30  Ziemowit Laski  <zlaski@apple.com>
 
        * obj-c++.dg/try-catch-11.mm: New.
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr21584-1.C b/gcc/testsuite/g++.dg/tree-ssa/pr21584-1.C
new file mode 100644 (file)
index 0000000..2c96d10
--- /dev/null
@@ -0,0 +1,38 @@
+extern "C" {
+
+extern char *strcpy (char *__restrict __dest, __const char *__restrict __src)
+     throw () __attribute__ ((__nonnull__ (1, 2)));
+
+extern char *foo (char *__restrict __s) throw ();
+}
+
+class cset {
+public:
+  cset();
+  int operator()(unsigned char) const;
+private:
+  char v[(127 * 2 + 1)+1];
+};
+
+inline int cset::operator()(unsigned char c) const
+{
+  return v[c];
+}
+
+extern cset csspace;
+
+void baz()
+{
+  char *vec;
+  char buf[512];
+
+  char *p = buf;
+  while (csspace(*p))
+    p++;
+
+  if (*p != '#' && (p = foo(buf)) != 0) {
+    vec = new char[10+ 1];
+    strcpy(vec, p);
+  }
+}
+
diff --git a/gcc/testsuite/g++.dg/tree-ssa/pr21584-2.C b/gcc/testsuite/g++.dg/tree-ssa/pr21584-2.C
new file mode 100644 (file)
index 0000000..6246e8d
--- /dev/null
@@ -0,0 +1,22 @@
+extern char *strcpy (char *__restrict __dest, __const char *__restrict __src);
+
+extern char *foo (void);
+extern void *malloc(__SIZE_TYPE__) __attribute__((malloc));
+
+char v[100];
+
+void baz()
+{
+  char *vec;
+  char buf[512];
+
+  char *p = buf;
+  while (v[(*p)])
+    p++;
+
+  if (*p != '#' && (p = foo()) != 0) {
+    strcpy ((char*)malloc(10), p);
+  }
+}
+
+
index 91a01d2..39d9fde 100644 (file)
@@ -791,14 +791,21 @@ compute_points_to_and_addr_escape (struct alias_info *ai)
    are assigned the same name tag.  */
 
 static void
-create_name_tags (struct alias_info *ai)
+create_name_tags (void)
 {
   size_t i;
 
-  for (i = 0; i < VARRAY_ACTIVE_SIZE (ai->processed_ptrs); i++)
+  for (i = 1; i < num_ssa_names; i++)
     {
-      tree ptr = VARRAY_TREE (ai->processed_ptrs, i);
-      struct ptr_info_def *pi = SSA_NAME_PTR_INFO (ptr);
+      tree ptr = ssa_name (i);
+      struct ptr_info_def *pi;
+
+      if (!ptr
+         || !POINTER_TYPE_P (TREE_TYPE (ptr))
+         || !SSA_NAME_PTR_INFO (ptr))
+       continue;
+
+      pi = SSA_NAME_PTR_INFO (ptr);
 
       if (pi->pt_anything || !pi->is_dereferenced)
        {
@@ -824,10 +831,15 @@ create_name_tags (struct alias_info *ai)
             problems if they both had different name tags because
             they would have different SSA version numbers (which
             would force us to take the name tags in and out of SSA).  */
-         for (j = 0; j < i; j++)
+         for (j = 1; j < i; j++)
            {
-             tree q = VARRAY_TREE (ai->processed_ptrs, j);
-             struct ptr_info_def *qi = SSA_NAME_PTR_INFO (q);
+             tree q = ssa_name (j);
+             struct ptr_info_def *qi;
+
+             if (!q || !POINTER_TYPE_P (TREE_TYPE (q)))
+               continue;
+
+             qi = SSA_NAME_PTR_INFO (q);
 
              if (qi
                  && qi->pt_vars
@@ -896,7 +908,8 @@ compute_flow_sensitive_aliasing (struct alias_info *ai)
          find_what_p_points_to (ptr);
        }
     }
-  create_name_tags (ai);
+
+  create_name_tags ();
 
   for (i = 0; i < VARRAY_ACTIVE_SIZE (ai->processed_ptrs); i++)
     {