On Sun, Nov 16, 2025 at 7:05 PM Andrew Pinski
<[email protected]> wrote:
>
> This moves 2 checks dealing with abnormal and phis earlier
> before going through the walk of the bb stmts. This should provide
> a small compile time performance improvement when doing cfgcleanup in a
> few (maybe not so many) cases.

OK.

> gcc/ChangeLog:
>
>         * tree-cfgcleanup.cc (maybe_remove_forwarder_block): Move a few
>         checks earlier.
>
> Signed-off-by: Andrew Pinski <[email protected]>
> ---
>  gcc/tree-cfgcleanup.cc | 52 ++++++++++++++++++++----------------------
>  1 file changed, 25 insertions(+), 27 deletions(-)
>
> diff --git a/gcc/tree-cfgcleanup.cc b/gcc/tree-cfgcleanup.cc
> index b9384db9f3d..872ded3d15e 100644
> --- a/gcc/tree-cfgcleanup.cc
> +++ b/gcc/tree-cfgcleanup.cc
> @@ -378,7 +378,6 @@ cleanup_control_flow_bb (basic_block bb)
>    return retval;
>  }
>
> -
>  /* If all the PHI nodes in DEST have alternatives for E1 and E2 and
>     those alternatives are equal in each of the PHI nodes, then return
>     true, else return false.  */
> @@ -517,8 +516,32 @@ maybe_remove_forwarder_block (basic_block bb, bool 
> can_split = false)
>        && single_succ_p (single_pred_edge (bb)->src))
>      return false;
>
> +  bool has_phi = !gimple_seq_empty_p (phi_nodes (bb));
>    basic_block dest = single_succ_edge (bb)->dest;
>
> +  /* If there is an abnormal edge to basic block BB, but not into
> +     dest, problems might occur during removal of the phi node at out
> +     of ssa due to overlapping live ranges of registers.
> +
> +     If there is an abnormal edge in DEST, the problems would occur
> +     anyway since cleanup_dead_labels would then merge the labels for
> +     two different eh regions, and rest of exception handling code
> +     does not like it.
> +
> +     So if there is an abnormal edge to BB, proceed only if there is
> +     no abnormal edge to DEST and there are no phi nodes in DEST.
> +     If the BB has phi, we don't want to deal with abnormal edges either. */
> +  if (bb_has_abnormal_pred (bb)
> +      && (bb_has_abnormal_pred (dest)
> +         || !gimple_seq_empty_p (phi_nodes (dest))
> +         || has_phi))
> +    return false;
> +
> +  /* When we have a phi, we have to feed into another
> +     basic block with PHI nodes.  */
> +  if (has_phi && gimple_seq_empty_p (phi_nodes (dest)))
> +    return false;
> +
>    /* Now walk through the statements backward.  We can ignore labels,
>       anything else means this is not a forwarder block.  */
>    for (gsi = gsi_last_bb (bb); !gsi_end_p (gsi); gsi_prev (&gsi))
> @@ -547,8 +570,6 @@ maybe_remove_forwarder_block (basic_block bb, bool 
> can_split = false)
>           return false;
>         }
>      }
> -
> -  bool has_phi = !gimple_seq_empty_p (phi_nodes (bb));
>    /* If BB has PHIs and does not dominate DEST,
>       then the PHI nodes at DEST must be the only
>       users of the results of the PHI nodes at BB.
> @@ -610,7 +631,7 @@ maybe_remove_forwarder_block (basic_block bb, bool 
> can_split = false)
>           /* cleanup_tree_cfg_noloop just created the loop preheader, don't
>              remove it if it has phis.  */
>           else if (bb->loop_father == loop_outer (dest->loop_father)
> -                  && gimple_seq_empty_p (phi_nodes (bb))
> +                  && !has_phi
>                    && !loops_state_satisfies_p (LOOPS_HAVE_PREHEADERS))
>             ;
>           else
> @@ -624,29 +645,6 @@ maybe_remove_forwarder_block (basic_block bb, bool 
> can_split = false)
>    gimple *stmt;
>    gimple_stmt_iterator gsi_to;
>
> -  /* If there is an abnormal edge to basic block BB, but not into
> -     dest, problems might occur during removal of the phi node at out
> -     of ssa due to overlapping live ranges of registers.
> -
> -     If there is an abnormal edge in DEST, the problems would occur
> -     anyway since cleanup_dead_labels would then merge the labels for
> -     two different eh regions, and rest of exception handling code
> -     does not like it.
> -
> -     So if there is an abnormal edge to BB, proceed only if there is
> -     no abnormal edge to DEST and there are no phi nodes in DEST.
> -     If the BB has phi, we don't want to deal with abnormal edges either. */
> -  if (bb_has_abnormal_pred (bb)
> -      && (bb_has_abnormal_pred (dest)
> -         || !gimple_seq_empty_p (phi_nodes (dest))
> -         || has_phi))
> -    return false;
> -
> -  /* When we have a phi, we have to feed into another
> -     basic block with PHI nodes.  */
> -  if (has_phi && gimple_seq_empty_p (phi_nodes (dest)))
> -    return false;
> -
>    /* If there are phi nodes in DEST, and some of the blocks that are
>       predecessors of BB are also predecessors of DEST, check that the
>       phi node arguments match.
> --
> 2.43.0
>

Reply via email to