[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
This commit is contained in:
parent
a5d37900ad
commit
cacb4a794f
2 changed files with 20 additions and 4 deletions
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue