On Thu, Aug 27, 2026 at 1:31 AM Andrea Pinski <[email protected]> wrote: > > So when I wrote this code I limited the middle store to only > be a SSA name. This is too limited and we reject constants which the full > cselim can handle just fine. This extends the check to support gimple > min invariants too. > > Also the check for clobber is changed to be instead to be ssa name/min > invariant > instead. This will still reject clobbers correctly and support what we can > support > here. > > This was found while looking into std::optional code generation in some cases.
Note this includes stores from STRING_CST - I think you basically want is_gimple_reg_type () instead? > Bootstrapped and tested on x86_64-linux-gnu. > > PR tree-optimization/127052 > > gcc/ChangeLog: > > * tree-ssa-phiopt.cc (cond_store_replacement_limited): Extend check > to support gimple min invariants. > Change check for non clobbers to be ssa name or min invariant. > > gcc/testsuite/ChangeLog: > > * gcc.dg/tree-ssa/cselim-6.c: New test. > * gcc.dg/tree-ssa/cselim-7.c: New test. > > Signed-off-by: Andrea Pinski <[email protected]> > --- > gcc/testsuite/gcc.dg/tree-ssa/cselim-6.c | 17 +++++++++++++++++ > gcc/testsuite/gcc.dg/tree-ssa/cselim-7.c | 18 ++++++++++++++++++ > gcc/tree-ssa-phiopt.cc | 10 ++++++---- > 3 files changed, 41 insertions(+), 4 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/cselim-6.c > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/cselim-7.c > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/cselim-6.c > b/gcc/testsuite/gcc.dg/tree-ssa/cselim-6.c > new file mode 100644 > index 00000000000..54d1446ecd7 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/cselim-6.c > @@ -0,0 +1,17 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -ftree-cselim -fdump-tree-phiopt1-details" } */ > +/* PR tree-optimization/127052 */ > + > +int *sink(int*); > +void f(int a, int c, int d, int *e) > +{ > + e = sink(&a); > + a = d; > + c = *e; > + c += a; > + if (c) > + a = 0; > + sink(&a); > +} > + > +/* { dg-final { scan-tree-dump "Conditional store replacement" "phiopt1" } } > */ > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/cselim-7.c > b/gcc/testsuite/gcc.dg/tree-ssa/cselim-7.c > new file mode 100644 > index 00000000000..8db89c24b56 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/cselim-7.c > @@ -0,0 +1,18 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -ftree-cselim -fdump-tree-phiopt1-details" } */ > +/* PR tree-optimization/127052 */ > + > +void sink(int*); > + > +int f(int b) > +{ > + int a; > + sink(&a); > + a = b; > + if (a) > + a = 0; > + return a; > +} > + > + > +/* { dg-final { scan-tree-dump "Conditional store replacement" "phiopt1" } } > */ > diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc > index f8dbd26abc1..ddb2e353cf4 100644 > --- a/gcc/tree-ssa-phiopt.cc > +++ b/gcc/tree-ssa-phiopt.cc > @@ -3655,7 +3655,8 @@ cond_store_replacement_limited (basic_block middle_bb, > basic_block join_bb, > && !DECL_P (lhs)) > || !is_gimple_reg_type (TREE_TYPE (lhs))) > return false; > - if (TREE_CODE (rhs) != SSA_NAME) > + if (TREE_CODE (rhs) != SSA_NAME > + && !is_gimple_min_invariant (rhs)) > return false; > > /* Three cases that can be handled: > @@ -3678,11 +3679,12 @@ cond_store_replacement_limited (basic_block > middle_bb, basic_block join_bb, > tree beforelhs = gimple_assign_lhs (vdef_before); > /* Only allow the store to be right before the condition. */ > if (gimple_bb (vdef_before) == cond_bb > - /* This can't be a clobber */ > - && !gimple_clobber_p (vdef_before) > /* An exact match is only supported. > FIXME: Allow for clique/base mismatch? */ > - && operand_equal_p (lhs, beforelhs)) > + && operand_equal_p (lhs, beforelhs) > + // The rhs needs to be a ssa name or a min invariant. > + && (TREE_CODE (gimple_assign_rhs1 (vdef_before)) == SSA_NAME > + || is_gimple_min_invariant (gimple_assign_rhs1 (vdef_before)))) > { > /* The vuse of the of store in the middle should be also > the entry in the phi for the other edge. */ > -- > 2.43.0 >
