diff options
author | Diego Novillo <dnovillo@redhat.com> | 2005-07-01 03:55:28 +0000 |
---|---|---|
committer | Diego Novillo <dnovillo@gcc.gnu.org> | 2005-06-30 23:55:28 -0400 |
commit | a4f9129458103e618d0f021a9975db06a9b7abf9 (patch) | |
tree | 8ffa65c8288eee005ef263ef8b23ad166acfef7b | |
parent | 8ce2456a6da65df38f6538109004bf5fc520eb24 (diff) | |
download | gcc-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/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/pr21584-1.C | 38 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tree-ssa/pr21584-2.C | 22 | ||||
-rw-r--r-- | gcc/tree-ssa-alias.c | 29 |
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++) { |