diff options
author | Richard Biener <rguenther@suse.de> | 2015-11-10 10:14:02 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2015-11-10 10:14:02 +0000 |
commit | 94852c8ec4eef2ad17846c714e469ea000127dec (patch) | |
tree | 2f3eeb73d87f9579075107f54e3e02459357ff78 /gcc/tree-ssa-sccvn.c | |
parent | ef785d9f193c035350a2f01223ccd87391226323 (diff) | |
download | gcc-94852c8ec4eef2ad17846c714e469ea000127dec.zip gcc-94852c8ec4eef2ad17846c714e469ea000127dec.tar.gz gcc-94852c8ec4eef2ad17846c714e469ea000127dec.tar.bz2 |
re PR tree-optimization/68240 (compilation hangs on valid code at -O1 and above on x86_64-linux-gnu)
2015-11-10 Richard Biener <rguenther@suse.de>
PR tree-optimization/68240
* tree-ssa-sccvn.c (cond_stmts_equal_p): Handle commutative compares
properly.
(visit_phi): For PHIs with just a single executable edge
take its value directly.
(expressions_equal_p): Handle VN_TOP properly.
* gcc.dg/torture/pr68240.c: New testcase.
From-SVN: r230095
Diffstat (limited to 'gcc/tree-ssa-sccvn.c')
-rw-r--r-- | gcc/tree-ssa-sccvn.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 9585f90..2ac3828 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -2760,11 +2760,15 @@ cond_stmts_equal_p (gcond *cond1, gcond *cond2, bool *inverted_p) else return false; - if (! expressions_equal_p (vn_valueize (lhs1), vn_valueize (lhs2)) - || ! expressions_equal_p (vn_valueize (rhs1), vn_valueize (rhs2))) - return false; - - return true; + lhs1 = vn_valueize (lhs1); + rhs1 = vn_valueize (rhs1); + lhs2 = vn_valueize (lhs2); + rhs2 = vn_valueize (rhs2); + return ((expressions_equal_p (lhs1, lhs2) + && expressions_equal_p (rhs1, rhs2)) + || (commutative_tree_code (code1) + && expressions_equal_p (lhs1, rhs2) + && expressions_equal_p (rhs1, lhs2))); } /* Compare two phi entries for equality, ignoring VN_TOP arguments. */ @@ -3379,6 +3383,7 @@ visit_phi (gimple *phi) tree result; tree sameval = VN_TOP; bool allsame = true; + unsigned n_executable = 0; /* TODO: We could check for this in init_sccvn, and replace this with a gcc_assert. */ @@ -3394,6 +3399,7 @@ visit_phi (gimple *phi) { tree def = PHI_ARG_DEF_FROM_EDGE (phi, e); + ++n_executable; if (TREE_CODE (def) == SSA_NAME) def = SSA_VAL (def); if (def == VN_TOP) @@ -3408,9 +3414,11 @@ visit_phi (gimple *phi) } /* If none of the edges was executable or all incoming values are - undefined keep the value-number at VN_TOP. */ - if (sameval == VN_TOP) - return set_ssa_val_to (PHI_RESULT (phi), VN_TOP); + undefined keep the value-number at VN_TOP. If only a single edge + is exectuable use its value. */ + if (sameval == VN_TOP + || n_executable == 1) + return set_ssa_val_to (PHI_RESULT (phi), sameval); /* First see if it is equivalent to a phi node in this block. We prefer this as it allows IV elimination - see PRs 66502 and 67167. */ @@ -4610,6 +4618,10 @@ expressions_equal_p (tree e1, tree e2) if (e1 == e2) return true; + /* If either one is VN_TOP consider them equal. */ + if (e1 == VN_TOP || e2 == VN_TOP) + return true; + /* If only one of them is null, they cannot be equal. */ if (!e1 || !e2) return false; |