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
>

Reply via email to