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 >
