tree-ssa-dom.c (cprop_into_successor_phis): Also propagate edge implied equivalences...
authorJeff Law <law@redhat.com>
Fri, 6 Sep 2013 17:41:48 +0000 (11:41 -0600)
committerJeff Law <law@gcc.gnu.org>
Fri, 6 Sep 2013 17:41:48 +0000 (11:41 -0600)
        * tree-ssa-dom.c (cprop_into_successor_phis): Also propagate
        edge implied equivalences into successor phis.

From-SVN: r202345

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

index 451879429b0236b4e744a323ce6bf455932e753d..67cf9e57a89ba45e19bfe03d56ff4dc255966e7b 100644 (file)
@@ -1,3 +1,8 @@
+2013-09-06  Jeff Law  <law@redhat.com>
+
+       * tree-ssa-dom.c (cprop_into_successor_phis): Also propagate
+       edge implied equivalences into successor phis.
+
 2013-09-06  Joern Rennecke  <joern.rennecke@embecosm.com>
 
        * resource.c (mark_referenced_resources): Handle COND_EXEC.
index 691e6f905a221cf42f3854e9e23f9ff067a042d0..f999a648e26e16225d46dca39b8c09be9d7ed96f 100644 (file)
@@ -1642,6 +1642,28 @@ cprop_into_successor_phis (basic_block bb)
       if (gsi_end_p (gsi))
        continue;
 
+      /* We may have an equivalence associated with this edge.  While
+        we can not propagate it into non-dominated blocks, we can
+        propagate them into PHIs in non-dominated blocks.  */
+
+      /* Push the unwind marker so we can reset the const and copies
+        table back to its original state after processing this edge.  */
+      const_and_copies_stack.safe_push (NULL_TREE);
+
+      /* Extract and record any simple NAME = VALUE equivalences. 
+
+        Don't bother with [01] = COND equivalences, they're not useful
+        here.  */
+      struct edge_info *edge_info = (struct edge_info *) e->aux;
+      if (edge_info)
+       {
+         tree lhs = edge_info->lhs;
+         tree rhs = edge_info->rhs;
+
+         if (lhs && TREE_CODE (lhs) == SSA_NAME)
+           record_const_or_copy (lhs, rhs);
+       }
+
       indx = e->dest_idx;
       for ( ; !gsi_end_p (gsi); gsi_next (&gsi))
        {
@@ -1667,6 +1689,8 @@ cprop_into_successor_phis (basic_block bb)
              && may_propagate_copy (orig_val, new_val))
            propagate_value (orig_p, new_val);
        }
+
+      restore_vars_to_original_value ();
     }
 }