aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDiego Novillo <dnovillo@redhat.com>2005-07-01 03:55:28 +0000
committerDiego Novillo <dnovillo@gcc.gnu.org>2005-06-30 23:55:28 -0400
commita4f9129458103e618d0f021a9975db06a9b7abf9 (patch)
tree8ffa65c8288eee005ef263ef8b23ad166acfef7b
parent8ce2456a6da65df38f6538109004bf5fc520eb24 (diff)
downloadgcc-a4f9129458103e618d0f021a9975db06a9b7abf9.zip
gcc-a4f9129458103e618d0f021a9975db06a9b7abf9.tar.gz
gcc-a4f9129458103e618d0f021a9975db06a9b7abf9.tar.bz2
re PR tree-optimization/21584 (ICE: verify_flow_sensitive_alias_info failed.)
PR 21584 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. From-SVN: r101498
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr21584-1.C38
-rw-r--r--gcc/testsuite/g++.dg/tree-ssa/pr21584-2.C22
-rw-r--r--gcc/tree-ssa-alias.c29
5 files changed, 96 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 39107ae..89f189c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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):
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index fe7a632..47001d3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..2c96d10
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr21584-1.C
@@ -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
index 0000000..6246e8d
--- /dev/null
+++ b/gcc/testsuite/g++.dg/tree-ssa/pr21584-2.C
@@ -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);
+ }
+}
+
+
diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
index 91a01d2..39d9fde 100644
--- a/gcc/tree-ssa-alias.c
+++ b/gcc/tree-ssa-alias.c
@@ -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++)
{