diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c5aa369f7f4c2701a3df59ebdc6f76fe0823c6eb..0588113f0481bc3a69eed445edf1cb1913ef39ae 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 237a690b657802794b959f3ad25e5045cd3620b5..f71c86bc6c2ac516cb4cf6bc61f2e0d91498fd82 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 0000000000000000000000000000000000000000..3add13bcbeb36d7e8d761ccb44a41c1ff8891ba3 --- /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 fca44d76c05572b4189b73797632fe8394647acb..f1b67b5bf2aa12512b1015713f8f24bb0e87c6fd 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