Since the worklist was never added to and the anlysis part can benifit
from the work part, we can combine the analayis part with the work part.
This should get a small speedup for this pass

Looking into the history here, remove_forwarder_block used to add to the 
worklist
but remove_forwarder_block_with_phi never did.

This is the first step in moving part of the functionality of mergephi into
cfgcleanup.

gcc/ChangeLog:

        * tree-cfgcleanup.cc (pass_merge_phi::execute): Remove worklist.

Signed-off-by: Andrew Pinski <[email protected]>
---
 gcc/tree-cfgcleanup.cc | 35 ++++++++++++-----------------------
 1 file changed, 12 insertions(+), 23 deletions(-)

diff --git a/gcc/tree-cfgcleanup.cc b/gcc/tree-cfgcleanup.cc
index 58e8af5efcf..2e613df6855 100644
--- a/gcc/tree-cfgcleanup.cc
+++ b/gcc/tree-cfgcleanup.cc
@@ -1456,16 +1456,17 @@ public:
 unsigned int
 pass_merge_phi::execute (function *fun)
 {
-  basic_block *worklist = XNEWVEC (basic_block, n_basic_blocks_for_fn (fun));
-  basic_block *current = worklist;
-  basic_block bb;
-
   calculate_dominance_info (CDI_DOMINATORS);
 
   /* Find all PHI nodes that we may be able to merge.  */
-  FOR_EACH_BB_FN (bb, fun)
+  bool changed = false;
+  unsigned n = last_basic_block_for_fn (fun);
+  for (unsigned i = NUM_FIXED_BLOCKS; i < n; i++)
     {
       basic_block dest;
+      basic_block bb = BASIC_BLOCK_FOR_FN (fun, i);
+      if (!bb)
+       continue;
 
       /* Look for a forwarder block with PHI nodes.  */
       if (!tree_forwarder_block_p (bb, true))
@@ -1481,14 +1482,10 @@ pass_merge_phi::execute (function *fun)
          || bb_has_abnormal_pred (bb))
        continue;
 
-      if (!dominated_by_p (CDI_DOMINATORS, dest, bb))
-       {
-         /* If BB does not dominate DEST, then the PHI nodes at
-            DEST must be the only users of the results of the PHI
-            nodes at BB.  */
-         *current++ = bb;
-       }
-      else
+     /* If BB does not dominate DEST, then the PHI nodes at
+       DEST must be the only users of the results of the PHI
+       nodes at BB. So only check when BB dominates dest.  */
+      if (dominated_by_p (CDI_DOMINATORS, dest, bb))
        {
          gphi_iterator gsi;
          unsigned int dest_idx = single_succ_edge (bb)->dest_idx;
@@ -1521,19 +1518,11 @@ pass_merge_phi::execute (function *fun)
 
          /* If the loop above iterated through all the PHI nodes
             in BB, then we can merge the PHIs from BB into DEST.  */
-         if (gsi_end_p (gsi))
-           *current++ = bb;
+         if (!gsi_end_p (gsi))
+           continue;
        }
-    }
-
-  /* Now let's drain WORKLIST.  */
-  bool changed = false;
-  while (current != worklist)
-    {
-      bb = *--current;
       changed |= remove_forwarder_block_with_phi (bb);
     }
-  free (worklist);
 
   /* Removing forwarder blocks can cause formerly irreducible loops
      to become reducible if we merged two entry blocks.  */
-- 
2.43.0

Reply via email to