On Sat, Jul 4, 2026 at 5:10 AM Andrew Pinski <[email protected]> wrote: > > After adding a limited store elimination function which is always valid even > without non-trapping code, we can call this from phiopt to optimize earlier > some ifconversion. This should allow for earlier optimizations of say > perlbmk. > Also since the _limited version does not depend on store sinking, to happen, > some cases in loops might be better optimized. > > Changes since v1: > * v2: Add false argument to cond_store_replacement_limited. And add/fixup > testcases.
OK. Richard. > gcc/ChangeLog: > > * tree-ssa-phiopt.cc (factor_out_all): Call > cond_store_replacement_limited too. > > gcc/testsuite/ChangeLog: > > * gcc.dg/tree-ssa/pr124405.c: Look at phiopt1 instead of cselim. > * gcc.dg/tree-ssa/pr89430-2.c: Likewise. > * gcc.dg/tree-ssa/pr89430-7-comp-ref.c: Likewise. > * gcc.dg/tree-ssa/pr99473-1.c: Likewise. > * gcc.dg/tree-ssa/ssa-pre-17.c: Disable phiopt too. > * gcc.dg/tree-ssa/pr89430-1.c: Disable phiopt. > * gcc.dg/tree-ssa/pr89430-5.c: Disable phiopt. > * gcc.dg/tree-ssa/pr89430-6.c: Disable phiopt. > * gcc.dg/tree-ssa/pr89430-1a.c: New test. > * gcc.dg/tree-ssa/pr89430-5a.c: New test. > * gcc.dg/tree-ssa/pr89430-6a.c: New test. > > Signed-off-by: Andrew Pinski <[email protected]> > --- > gcc/testsuite/gcc.dg/tree-ssa/pr124405.c | 4 ++-- > gcc/testsuite/gcc.dg/tree-ssa/pr89430-1.c | 2 +- > gcc/testsuite/gcc.dg/tree-ssa/pr89430-1a.c | 12 ++++++++++++ > gcc/testsuite/gcc.dg/tree-ssa/pr89430-2.c | 4 ++-- > gcc/testsuite/gcc.dg/tree-ssa/pr89430-5.c | 2 +- > gcc/testsuite/gcc.dg/tree-ssa/pr89430-5a.c | 16 ++++++++++++++++ > gcc/testsuite/gcc.dg/tree-ssa/pr89430-6.c | 2 +- > gcc/testsuite/gcc.dg/tree-ssa/pr89430-6a.c | 19 +++++++++++++++++++ > .../gcc.dg/tree-ssa/pr89430-7-comp-ref.c | 4 ++-- > gcc/testsuite/gcc.dg/tree-ssa/pr99473-1.c | 4 ++-- > gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-17.c | 2 +- > gcc/tree-ssa-phiopt.cc | 8 ++++++++ > 12 files changed, 67 insertions(+), 12 deletions(-) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr89430-1a.c > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr89430-5a.c > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr89430-6a.c > > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr124405.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr124405.c > index 9ba230d2b56..0ece7f0ce5e 100644 > --- a/gcc/testsuite/gcc.dg/tree-ssa/pr124405.c > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr124405.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-O1 -fdump-tree-cselim-details" } */ > +/* { dg-options "-O1 -fdump-tree-phiopt1-details" } */ > > void > f (int *a, int b) > @@ -9,4 +9,4 @@ f (int *a, int b) > *a |= 1; > } > > -/* { dg-final { scan-tree-dump-times "Conditional store replacement > happened" 1 "cselim"} } */ > +/* { dg-final { scan-tree-dump-times "Conditional store replacement > happened" 1 "phiopt1"} } */ > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-1.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-1.c > index d9fb2edf549..518c6b8a0dc 100644 > --- a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-1.c > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-1.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-O2 -ftree-cselim -fdump-tree-cselim-details" } */ > +/* { dg-options "-O2 -ftree-cselim -fdump-tree-cselim-details > -fno-ssa-phiopt" } */ > > unsigned test(unsigned k, unsigned b) { > unsigned a[2]; > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-1a.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-1a.c > new file mode 100644 > index 00000000000..52e4b480465 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-1a.c > @@ -0,0 +1,12 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -ftree-cselim -fdump-tree-phiopt1-details" } */ > + > +unsigned test(unsigned k, unsigned b) { > + unsigned a[2]; > + if (b < a[k]) { > + a[k] = b; > + } > + return a[0]+a[1]; > +} > + > +/* { dg-final { scan-tree-dump "Conditional store replacement" "phiopt1" } } > */ > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-2.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-2.c > index bb39df2be8e..23072828ae1 100644 > --- a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-2.c > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-2.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-O2 -ftree-cselim -fdump-tree-cselim-details" } */ > +/* { dg-options "-O2 -ftree-cselim -fdump-tree-phiopt1-details" } */ > > int c; > unsigned test(unsigned k, unsigned b) { > @@ -11,4 +11,4 @@ unsigned test(unsigned k, unsigned b) { > return a[0]+a[1]; > } > > -/* { dg-final { scan-tree-dump "Conditional store replacement" "cselim" } } > */ > +/* { dg-final { scan-tree-dump "Conditional store replacement" "phiopt1" } } > */ > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-5.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-5.c > index 6a00f54b545..8a054558d55 100644 > --- a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-5.c > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-5.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-O2 -ftree-cselim -fdump-tree-cselim-details" } */ > +/* { dg-options "-O2 -ftree-cselim -fdump-tree-cselim-details > -fno-ssa-phiopt" } */ > > int test(int b, int k) { > struct { > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-5a.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-5a.c > new file mode 100644 > index 00000000000..58d3fe3f1c4 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-5a.c > @@ -0,0 +1,16 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -ftree-cselim -fdump-tree-phiopt1-details" } */ > + > +int test(int b, int k) { > + struct { > + int data[2]; > + } a; > + > + if (b < a.data[k]) { > + a.data[k] = b; > + } > + > + return a.data[0] + a.data[1]; > +} > + > +/* { dg-final { scan-tree-dump "Conditional store replacement" "phiopt1" } } > */ > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-6.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-6.c > index ecc083ebebe..6022240e1ec 100644 > --- a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-6.c > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-6.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-O2 -ftree-cselim -fdump-tree-cselim-details" } */ > +/* { dg-options "-O2 -ftree-cselim -fdump-tree-cselim-details > -fno-ssa-phiopt" } */ > > int test(int b, int k) { > typedef struct { > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-6a.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-6a.c > new file mode 100644 > index 00000000000..74deda5bee6 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-6a.c > @@ -0,0 +1,19 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -ftree-cselim -fdump-tree-phiopt1-details" } */ > + > +int test(int b, int k) { > + typedef struct { > + int x; > + } SS; > + struct { > + SS data[2]; > + } a; > + > + if (b < a.data[k].x) { > + a.data[k].x = b; > + } > + > + return a.data[0].x + a.data[1].x; > +} > + > +/* { dg-final { scan-tree-dump "Conditional store replacement" "phiopt1" } } > */ > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-7-comp-ref.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-7-comp-ref.c > index 4fad2d1eb13..83762162a72 100644 > --- a/gcc/testsuite/gcc.dg/tree-ssa/pr89430-7-comp-ref.c > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr89430-7-comp-ref.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-O2 -ftree-cselim -fdump-tree-cselim-details" } */ > +/* { dg-options "-O2 -ftree-cselim -fdump-tree-phiopt1-details" } */ > > typedef union { > int i; > @@ -14,4 +14,4 @@ int foo(U *u, int b, int i) > return u->i; > } > > -/* { dg-final { scan-tree-dump "Conditional store replacement" "cselim" } } > */ > +/* { dg-final { scan-tree-dump "Conditional store replacement" "phiopt1" } } > */ > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr99473-1.c > b/gcc/testsuite/gcc.dg/tree-ssa/pr99473-1.c > index e930389e9c0..ed03deabf17 100644 > --- a/gcc/testsuite/gcc.dg/tree-ssa/pr99473-1.c > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr99473-1.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-O2 -ftree-cselim -fdump-tree-cselim-details" } */ > +/* { dg-options "-O2 -ftree-cselim -fdump-tree-phiopt1-details" } */ > > void f (int*); > > @@ -11,4 +11,4 @@ void g3 (int i) > f (&x); > } > > -/* { dg-final { scan-tree-dump "Conditional store replacement happened" > "cselim" } } */ > +/* { dg-final { scan-tree-dump "Conditional store replacement happened" > "phiopt1" } } */ > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-17.c > b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-17.c > index a06f339f0bb..4190fdf63dd 100644 > --- a/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-17.c > +++ b/gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-17.c > @@ -1,5 +1,5 @@ > /* { dg-do compile } */ > -/* { dg-options "-O2 -fdump-tree-pre-stats -fno-tree-cselim" } */ > +/* { dg-options "-O2 -fdump-tree-pre-stats -fno-tree-cselim -fno-ssa-phiopt" > } */ > > typedef union { > int i; > diff --git a/gcc/tree-ssa-phiopt.cc b/gcc/tree-ssa-phiopt.cc > index 103547d538f..27f410b9309 100644 > --- a/gcc/tree-ssa-phiopt.cc > +++ b/gcc/tree-ssa-phiopt.cc > @@ -4183,6 +4183,14 @@ factor_out_all (edge e1, edge e2, basic_block merge, > } > if (!single_pred_p (bb1)) > break; > + if (!diamond_p && get_virtual_phi (merge) > + && cond_store_replacement_limited (bb1, merge, bb2, > + e1, e2, false)) > + { > + changed = true; > + do_over = true; > + continue; > + } > gphi_iterator gsi; > for (gsi = gsi_start_phis (merge); !gsi_end_p (gsi); gsi_next (&gsi)) > { > -- > 2.43.0 >
