diff options
author | Richard Biener <rguenth@gcc.gnu.org> | 2010-11-10 10:59:20 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2010-11-10 10:59:20 +0000 |
commit | 72a07d9b66fd77ddbd1cfc12501e0722d67d509a (patch) | |
tree | f4355ea195f58cfd9e8822fc306980538f7ca6fb /gcc/tree-ssa-sccvn.c | |
parent | d92034f1364e661ea9af0d31df4f23cecfb82094 (diff) | |
download | gcc-72a07d9b66fd77ddbd1cfc12501e0722d67d509a.zip gcc-72a07d9b66fd77ddbd1cfc12501e0722d67d509a.tar.gz gcc-72a07d9b66fd77ddbd1cfc12501e0722d67d509a.tar.bz2 |
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
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 17 |
1 files changed, 14 insertions, 3 deletions
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 |