Commit cacb4a79 by Alexandre Oliva Committed by Alexandre Oliva

[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
parent a5d37900
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)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment