While moving mergephi's forwarder block removal over to cfgcleanup,
I noticed a few regressions due to removal of a forwarder block (correctly)
but the counts were not updated, instead let these blocks be handled by the 
merge_blocks
cleanup code.

gcc/ChangeLog:

        * tree-cfgcleanup.cc (tree_forwarder_block_p): Reject bb which has a 
single
        predecessor which has a single successor.

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

diff --git a/gcc/tree-cfgcleanup.cc b/gcc/tree-cfgcleanup.cc
index 9f526492b72..cc0838d8c4c 100644
--- a/gcc/tree-cfgcleanup.cc
+++ b/gcc/tree-cfgcleanup.cc
@@ -425,6 +425,13 @@ tree_forwarder_block_p (basic_block bb, bool phi_wanted)
        return false;
   }
 
+  /* If this bb has a single predecessor and that predecssor
+     has a single successor, this bb will be merged with the
+     predecessor so ignore it for removing of the forwarder block. */
+  if (single_pred_p (bb)
+      && single_succ_p (single_pred_edge (bb)->src))
+    return false;
+
   basic_block dest = single_succ_edge (bb)->dest;
 
   /* Now walk through the statements backward.  We can ignore labels,
-- 
2.43.0

Reply via email to