re PR tree-optimization/46398 (early FRE miscompiles simple testcase)

2010-11-10  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/46398
	* tree-ssa-sccvn.c (process_scc): Iterate for all PHIs.

	* gcc.dg/torture/pr46398.c: New testcase.

From-SVN: r166527
This commit is contained in:
Richard Biener 2010-11-10 10:59:20 +00:00
parent d92034f136
commit 72a07d9b66
4 changed files with 50 additions and 4 deletions

View file

@ -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

View file

@ -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>

View file

@ -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;
}

View file

@ -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