tree-ssa-dom.c (record_equivalences_from_phis): Fix handling of degenerates resulting...
authorJeff Law <law@redhat.com>
Sun, 19 Nov 2017 20:15:45 +0000 (13:15 -0700)
committerJeff Law <law@gcc.gnu.org>
Sun, 19 Nov 2017 20:15:45 +0000 (13:15 -0700)
        * tree-ssa-dom.c (record_equivalences_from_phis): Fix handling
        of degenerates resulting from ignoring an edge.

From-SVN: r254938

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

index ae05dacf791d0217b4118828b29e6ddaccc8aeb7..5ce981d087194102faaa4ed6b07167076ecbe7de 100644 (file)
@@ -1,3 +1,8 @@
+2017-11-19  Jeff Law  <law@redhat.com>
+
+       * tree-ssa-dom.c (record_equivalences_from_phis): Fix handling
+       of degenerates resulting from ignoring an edge.
+
 2017-11-19  Jan Hubicka  <hubicka@ucw.cz>
 
        PR ipa/81360
index eb85b4a09ad763200d840a1c767a4a62d0f90da3..916d66134c38be50ed956fe7815d4b964697e87e 100644 (file)
@@ -1011,6 +1011,7 @@ record_equivalences_from_phis (basic_block bb)
       tree rhs = NULL;
       size_t i;
 
+      bool ignored_phi_arg = false;
       for (i = 0; i < gimple_phi_num_args (phi); i++)
        {
          tree t = gimple_phi_arg_def (phi, i);
@@ -1021,10 +1022,14 @@ record_equivalences_from_phis (basic_block bb)
          if (lhs == t)
            continue;
 
-         /* If the associated edge is not marked as executable, then it
-            can be ignored.  */
+         /* We want to track if we ignored any PHI arguments because
+            their associated edges were not executable.  This impacts
+            whether or not we can use any equivalence we might discover.  */
          if ((gimple_phi_arg_edge (phi, i)->flags & EDGE_EXECUTABLE) == 0)
-           continue;
+           {
+             ignored_phi_arg = true;
+             continue;
+           }
 
          t = dom_valueize (t);
 
@@ -1049,9 +1054,15 @@ record_equivalences_from_phis (basic_block bb)
         a useful equivalence.  We do not need to record unwind data for
         this, since this is a true assignment and not an equivalence
         inferred from a comparison.  All uses of this ssa name are dominated
-        by this assignment, so unwinding just costs time and space.  */
+        by this assignment, so unwinding just costs time and space.
+
+        Note that if we ignored a PHI argument and the resulting equivalence
+        is SSA_NAME = SSA_NAME.  Then we can not use the equivalence as the
+        uses of the LHS SSA_NAME are not necessarily dominated by the
+        assignment of the RHS SSA_NAME.  */
       if (i == gimple_phi_num_args (phi)
-         && may_propagate_copy (lhs, rhs))
+         && may_propagate_copy (lhs, rhs)
+         && (!ignored_phi_arg || TREE_CODE (rhs) != SSA_NAME))
        set_ssa_name_value (lhs, rhs);
     }
 }