diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2018-01-30 17:40:50 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2018-01-30 17:40:50 +0000 |
commit | cacb4a794f079490a56eb99294947ba5acb4269a (patch) | |
tree | fecd6616032e0c9bded68f1e029a06cf46d8ed5f | |
parent | a5d37900ad8b09446297217a1748920bf58c99cc (diff) | |
download | gcc-cacb4a794f079490a56eb99294947ba5acb4269a.zip gcc-cacb4a794f079490a56eb99294947ba5acb4269a.tar.gz gcc-cacb4a794f079490a56eb99294947ba5acb4269a.tar.bz2 |
[PR81611] accept copies in simple_iv_increment_p
If there are copies between the GIMPLE_PHI at the loop body and the
increment that reaches it (presumably through a back edge), still
regard it as a simple_iv_increment, so that we won't consider the
value in the back edge eligible for forwprop. Doing so would risk
making the phi node and the incremented conflicting value live
within the loop, and the phi node to be preserved for propagated
uses after the loop.
for gcc/ChangeLog
PR tree-optimization/81611
* tree-ssa-dom.c (simple_iv_increment_p): Skip intervening
copies.
From-SVN: r257194
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/tree-ssa-dom.c | 18 |
2 files changed, 20 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5e9801a..c906836 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-01-30 Alexandre Oliva <aoliva@redhat.com> + + PR tree-optimization/81611 + * tree-ssa-dom.c (simple_iv_increment_p): Skip intervening + copies. + 2018-01-30 Aaron Sawdey <acsawdey@linux.vnet.ibm.com> * config/rs6000/rs6000.c (rs6000_internal_arg_pointer): Only return diff --git a/gcc/tree-ssa-dom.c b/gcc/tree-ssa-dom.c index 2b37166..a6f176c 100644 --- a/gcc/tree-ssa-dom.c +++ b/gcc/tree-ssa-dom.c @@ -1276,8 +1276,11 @@ record_equality (tree x, tree y, class const_and_copies *const_and_copies) /* Returns true when STMT is a simple iv increment. It detects the following situation: - i_1 = phi (..., i_2) - i_2 = i_1 +/- ... */ + i_1 = phi (..., i_k) + [...] + i_j = i_{j-1} for each j : 2 <= j <= k-1 + [...] + i_k = i_{k-1} +/- ... */ bool simple_iv_increment_p (gimple *stmt) @@ -1305,8 +1308,15 @@ simple_iv_increment_p (gimple *stmt) return false; phi = SSA_NAME_DEF_STMT (preinc); - if (gimple_code (phi) != GIMPLE_PHI) - return false; + while (gimple_code (phi) != GIMPLE_PHI) + { + /* Follow trivial copies, but not the DEF used in a back edge, + so that we don't prevent coalescing. */ + if (!gimple_assign_ssa_name_copy_p (phi)) + return false; + preinc = gimple_assign_rhs1 (phi); + phi = SSA_NAME_DEF_STMT (preinc); + } for (i = 0; i < gimple_phi_num_args (phi); i++) if (gimple_phi_arg_def (phi, i) == lhs) |