On Fri, Oct 23, 2026 at 4:38 PM Andrea Pinski
<[email protected]> wrote:
>
> This improves on top of r14-478-gd256dc28f0eadd.  Instead of checking if
> the two middle bbs are empty, we can check if the new phi entry is depends
> on either branch instead.  Since we move the statements in
> match_simplify_replacement, this does not make a difference.  This will
> make a difference when we support multiple stmts though. As we might not 
> remove
> the middles bb even though we could.  I don't have a testcase for that
> but a LLM based review of allowing more than one stmt to be phiopt marked
> as a possibility of wrong code/ICE (neither is true due to the way the code
> is structed as there would be no uses of those statements left behind as we
> would have replaced the phi entry for that case).
> This helps the next patch which is the `allowing more than one stmt to be 
> phiopt`.

OK.

Richard.

> gcc/ChangeLog:
>
>         * tree-ssa-phiopt.cc (replace_phi_edge_with_variable): Handle 
> non-empty
>         middle bbs for diamond case.
>         (match_simplify_replacement): Mark phi args to be maybe dce'd also.
>
> Signed-off-by: Andrea Pinski <[email protected]>
> ---
>  gcc/tree-ssa-phiopt.cc | 14 +++++++++++++-
>  1 file changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc
> index a8c3a94a3f9..53256d1f787 100644
> --- a/gcc/tree-ssa-phiopt.cc
> +++ b/gcc/tree-ssa-phiopt.cc
> @@ -145,9 +145,15 @@ replace_phi_edge_with_variable (basic_block cond_block,
>      {
>        basic_block bb1 = EDGE_SUCC (cond_block, 0)->dest;
>        basic_block bb2 = EDGE_SUCC (cond_block, 1)->dest;
> +      // If the new phi entry does not refer to either of
> +      // the middle bb, then either middle bbs can be deleted
> +      // as long as the middle bbs only reach the phi bb and only
> +      // reachable from the conditional bb.
>        if (single_pred_p (bb1) && single_pred_p (bb2)
>           && single_succ_p (bb1) && single_succ_p (bb2)
> -         && empty_block_p (bb1) && empty_block_p (bb2))
> +         && (TREE_CODE (new_tree) != SSA_NAME
> +             || (gimple_bb (SSA_NAME_DEF_STMT (new_tree)) != bb1
> +                 && gimple_bb (SSA_NAME_DEF_STMT (new_tree)) != bb2)))
>         deleteboth = true;
>      }
>    else
> @@ -1250,6 +1256,12 @@ match_simplify_replacement (basic_block cond_bb, 
> basic_block middle_bb,
>        && !SSA_NAME_IS_DEFAULT_DEF (gimple_cond_rhs (stmt)))
>      bitmap_set_bit (exprs_maybe_dce,
>                     SSA_NAME_VERSION (gimple_cond_rhs (stmt)));
> +  if (TREE_CODE (arg_true) == SSA_NAME
> +      && !SSA_NAME_IS_DEFAULT_DEF (arg_true))
> +    bitmap_set_bit (exprs_maybe_dce, SSA_NAME_VERSION (arg_true));
> +  if (TREE_CODE (arg_false) == SSA_NAME
> +      && !SSA_NAME_IS_DEFAULT_DEF (arg_false))
> +    bitmap_set_bit (exprs_maybe_dce, SSA_NAME_VERSION (arg_false));
>
>    gsi = gsi_last_bb (cond_bb);
>    /* Insert the sequence generated from gimple_simplify_phiopt.  */
> --
> 2.43.0
>

Reply via email to