[PR81611] accept copies in simple_iv_increment_p
authorAlexandre Oliva <aoliva@redhat.com>
Tue, 30 Jan 2018 17:40:50 +0000 (17:40 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Tue, 30 Jan 2018 17:40:50 +0000 (17:40 +0000)
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

gcc/ChangeLog
gcc/tree-ssa-dom.c

index 5e9801a8e99c12053cd7379094a3eb6dda14ca3c..c9068360d01a2ba4459f3ed9181aab594b2c530b 100644 (file)
@@ -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
index 2b371667253a3a9058ac1cf830d90137c2a19d77..a6f176c5def054339a2bd08280de93ad64c35e8c 100644 (file)
@@ -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)