On Mon, Dec 8, 2025 at 1:17 PM Richard Biener <[email protected]> wrote: > > On Sat, Dec 6, 2025 at 8:39 PM Andrew Pinski > <[email protected]> wrote: > > > > This fixes a regression introduced with r16-5258-g1d8e2d51e5c5cb. > > With GCC 12+, we would not merge forwarders (with phis, vops included), > > this meant that after the last cddce, degenerate phis would stay not > > merged which allowed for better expansion. Now after my patch, the forwarder > > block would be removed and get worse expansion. This fixes the problem > > by creating the forwarder blocks in "optimized" and no other cleanupcfg > > is called afterwards. > > > > Oh this also fixes the problem at -O1 which was missed because the agressive > > version of dce was not done at -O1. > > OK for this series. I thought of this at some point but specifically wanted > to look at interaction with uncprop and whether that eventually causes > degenerate constant cases to disappear when different equality compares > feed the values.
Oh, and both things are really out-of-SSA optimizations, so doing those as part of rewrite_out_of_ssa might make sense as well. Richard. > Thanks, > Richard. > > > Bootstrapped and tested on x86_64-linux-gnu. > > > > PR tree-optimization/46555 > > gcc/ChangeLog: > > > > * tree-cfgcleanup.cc (execute_cleanup_cfg_post_optimizing): > > Don't set todo to include cleanupcfg; do it manually. > > Call make_forwarders_with_degenerate_phis if optimizing. > > > > gcc/testsuite/ChangeLog: > > > > * gcc.dg/tree-ssa/pr46555.c: New test. > > > > Signed-off-by: Andrew Pinski <[email protected]> > > --- > > gcc/testsuite/gcc.dg/tree-ssa/pr46555.c | 28 +++++++++++++++++++++++++ > > gcc/tree-cfgcleanup.cc | 9 ++++++-- > > 2 files changed, 35 insertions(+), 2 deletions(-) > > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr46555.c > > > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr46555.c > > b/gcc/testsuite/gcc.dg/tree-ssa/pr46555.c > > new file mode 100644 > > index 00000000000..d4de7c2c170 > > --- /dev/null > > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr46555.c > > @@ -0,0 +1,28 @@ > > +/* { dg-do compile } */ > > +/* { dg-options "-O2 -fdump-tree-optimized-details > > -fdump-rtl-pro_and_epilogue" } */ > > +/* PR tree-optimization/46555 */ > > +/* Here should not remove the forwarder block (or rather recreate it and > > not > > + remove it again). This improves expansion to RTL as there is one less > > copy > > + (or constant formation) in some cases. In this case we also get the > > ability > > + to shrink wrap the function. */ > > + > > +int h(void); > > +int f(int a, int b, int c) > > +{ > > + if (a) > > + return 2; > > + h(); > > + if (b) > > + return 2; > > + h(); > > + if (c) > > + return 2; > > + h(); > > + return 4; > > +} > > + > > +/* { dg-final { scan-tree-dump-times "New forwarder block for edge" 1 > > "optimized" } } */ > > +/* Make sure we only have a PHI with 2 arguments here, 2 and 4. */ > > +/* { dg-final { scan-tree-dump "PHI <2..., 4...>|PHI <4..., 2...>" > > "optimized" } } */ > > +/* Make sure we can shrink wrap the function now too. */ > > +/* { dg-final { scan-rtl-dump "Performing shrink-wrapping" > > "pro_and_epilogue" { target { { { i?86-*-* x86_64-*-* } && { ! ia32 } } || > > { powerpc*-*-* aarch64*-*-* riscv*-*-* arm*-*-* } } } } } */ > > diff --git a/gcc/tree-cfgcleanup.cc b/gcc/tree-cfgcleanup.cc > > index 872ded3d15e..093fde93da6 100644 > > --- a/gcc/tree-cfgcleanup.cc > > +++ b/gcc/tree-cfgcleanup.cc > > @@ -1415,8 +1415,13 @@ execute_cleanup_cfg_post_optimizing (void) > > } > > maybe_remove_unreachable_handlers (); > > cleanup_dead_labels (); > > - if (group_case_labels ()) > > - todo |= TODO_cleanup_cfg; > > + if (group_case_labels () && cleanup_tree_cfg ()) > > + todo |= TODO_update_ssa; > > + > > + /* When optimizing undo the merging of forwarder blocks > > + that phis for better out of ssa expansion. */ > > + if (optimize) > > + make_forwarders_with_degenerate_phis (cfun); > > > > basic_block bb = single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)); > > gimple_stmt_iterator gsi = gsi_start_nondebug_after_labels_bb (bb); > > -- > > 2.43.0 > >
