diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-04-11 05:52:45 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2006-04-11 05:52:45 +0000 |
commit | e27ef4689fd2b241e7b9cefd0e69cf923fbf148a (patch) | |
tree | 8f3fb1be74c0d398df2d5f881cf972cd746e2d0b | |
parent | a01acf144a59efd26dca417d2a16e5a7e1a9f87b (diff) | |
download | gcc-e27ef4689fd2b241e7b9cefd0e69cf923fbf148a.tar.gz |
PR/27087
* tree-ssa-copy.c (may_propagate_copy): Test flow sensitive
alias information too.
* gcc.c-torture/compile/pr27087.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@112849 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr27087.c | 23 | ||||
-rw-r--r-- | gcc/tree-ssa-copy.c | 15 |
4 files changed, 49 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c5aa369f7f4..0588113f048 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-04-03 Jeff Law <law@redhat.com> + + PR/27087 + * tree-ssa-copy.c (may_propagate_copy): Test flow sensitive + alias information too. + 2006-04-10 Mike Frysinger <vapier@gentoo.org> * gcc/Makefile.in (gcc-cross): Add $(exeext) to target name. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 237a690b657..f71c86bc6c2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-04-10 Jeff Law <law@redhat.com> + + PR/27087 + * gcc.c-torture/compile/pr27087.c: New test. + 2006-04-10 Aldy Hernandez <aldyh@redhat.com> PR/21391 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr27087.c b/gcc/testsuite/gcc.c-torture/compile/pr27087.c new file mode 100644 index 00000000000..3add13bcbeb --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr27087.c @@ -0,0 +1,23 @@ +extern int ptbl[4]; +extern int ctbl[4]; + +void doViews(void) { + int *c = ctbl, *p = ptbl; + while (1) + { + p++; + c++; + if (*p) + { + if (c == p) + { + if (*c) + return; + } + else + return; + } + } + + g(); +} diff --git a/gcc/tree-ssa-copy.c b/gcc/tree-ssa-copy.c index fca44d76c05..f1b67b5bf2a 100644 --- a/gcc/tree-ssa-copy.c +++ b/gcc/tree-ssa-copy.c @@ -117,6 +117,21 @@ may_propagate_copy (tree dest, tree orig) else if (get_alias_set (TREE_TYPE (type_d)) != get_alias_set (TREE_TYPE (type_o))) return false; + + /* Also verify flow-sensitive information is compatible. */ + if (SSA_NAME_PTR_INFO (orig) && SSA_NAME_PTR_INFO (dest)) + { + struct ptr_info_def *orig_ptr_info = SSA_NAME_PTR_INFO (orig); + struct ptr_info_def *dest_ptr_info = SSA_NAME_PTR_INFO (dest); + + if (orig_ptr_info->name_mem_tag + && dest_ptr_info->name_mem_tag + && orig_ptr_info->pt_vars + && dest_ptr_info->pt_vars + && !bitmap_intersect_p (dest_ptr_info->pt_vars, + orig_ptr_info->pt_vars)) + return false; + } } /* If the destination is a SSA_NAME for a virtual operand, then we have |