From 72a07d9b66fd77ddbd1cfc12501e0722d67d509a Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Wed, 10 Nov 2010 10:59:20 +0000 Subject: [PATCH] re PR tree-optimization/46398 (early FRE miscompiles simple testcase) 2010-11-10 Richard Guenther PR tree-optimization/46398 * tree-ssa-sccvn.c (process_scc): Iterate for all PHIs. * gcc.dg/torture/pr46398.c: New testcase. From-SVN: r166527 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 8 +++++++- gcc/testsuite/gcc.dg/torture/pr46398.c | 24 ++++++++++++++++++++++++ gcc/tree-ssa-sccvn.c | 17 ++++++++++++++--- 4 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr46398.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 939e03ad500..ff1ef623e9d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-11-10 Richard Guenther + + PR tree-optimization/46398 + * tree-ssa-sccvn.c (process_scc): Iterate for all PHIs. + 2010-11-10 Joern Rennecke PR target/44760 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 52e7693e447..e4ae2acf849 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,10 +1,16 @@ +2010-11-10 Richard Guenther + + PR tree-optimization/46398 + * gcc.dg/torture/pr46398.c: New testcase. + 2010-11-09 Jerry DeLisle * gfortran.dg/open_dev_null.f90: New test. 2010-11-09 Jan Hubicka - * 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 diff --git a/gcc/testsuite/gcc.dg/torture/pr46398.c b/gcc/testsuite/gcc.dg/torture/pr46398.c new file mode 100644 index 00000000000..9110bbbbe06 --- /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 02613aabda1..994e94596cb 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