diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/torture/pr46398.c | 24 | ||||
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 17 |
4 files changed, 50 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 939e03a..ff1ef62 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-11-10 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/46398 + * tree-ssa-sccvn.c (process_scc): Iterate for all PHIs. + 2010-11-10 Joern Rennecke <amylaar@spamcop.net> PR target/44760 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 52e7693..e4ae2ac 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,10 +1,16 @@ +2010-11-10 Richard Guenther <rguenther@suse.de> + + PR tree-optimization/46398 + * gcc.dg/torture/pr46398.c: New testcase. + 2010-11-09 Jerry DeLisle <jvdelisle@gcc.gnu.org> * gfortran.dg/open_dev_null.f90: New test. 2010-11-09 Jan Hubicka <jh@suse.cz> - * testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c: Update for loop unrolling. + * testsuite/gcc.target/i386/recip-vec-sqrtf-avx.c: Update for loop + unrolling. 2010-11-09 Joseph Myers <joseph@codesourcery.com> diff --git a/gcc/testsuite/gcc.dg/torture/pr46398.c b/gcc/testsuite/gcc.dg/torture/pr46398.c new file mode 100644 index 0000000..9110bbbb --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr46398.c @@ -0,0 +1,24 @@ +/* { dg-do run } */ + +int __attribute__((noinline)) +test (int token) +{ + int done = 0; + int virtual_p = 0; + while (!done) + { + if (token == 42) + virtual_p = 1; + else + done = 1; + } + return virtual_p; +} +extern void abort (void); +int +main() +{ + if (test (0) != 0) + abort (); + return 0; +} diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 02613aa..994e945 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -3108,9 +3108,20 @@ process_scc (VEC (tree, heap) *scc) if (VEC_length (tree, scc) == 1) { tree use = VEC_index (tree, scc, 0); - if (!VN_INFO (use)->use_processed) - visit_use (use); - return; + if (VN_INFO (use)->use_processed) + return; + /* We need to make sure it doesn't form a cycle itself, which can + happen for self-referential PHI nodes. In that case we would + end up inserting an expression with VN_TOP operands into the + valid table which makes us derive bogus equivalences later. + The cheapest way to check this is to assume it for all PHI nodes. */ + if (gimple_code (SSA_NAME_DEF_STMT (use)) == GIMPLE_PHI) + /* Fallthru to iteration. */ ; + else + { + visit_use (use); + return; + } } /* Iterate over the SCC with the optimistic table until it stops |