[2/2] passes: Move early pass_sccopy right after evrp [PR103221]

Message ID 20260603020635.2641527-2-andrew.pinski@oss.qualcomm.com
State Committed
Headers
Series [1/2] sccopy: Handle ssa info for copies in sccopy |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gcc_build--master-arm success Build passed
linaro-tcwg-bot/tcwg_simplebootstrap_build--master-aarch64-bootstrap success Build passed
linaro-tcwg-bot/tcwg_gcc_check--master-arm success Test passed
linaro-tcwg-bot/tcwg_gcc_build--master-aarch64 fail Patch failed to apply
linaro-tcwg-bot/tcwg_simplebootstrap_build--master-arm-bootstrap fail Patch failed to apply

Commit Message

Andrew Pinski June 3, 2026, 2:06 a.m. UTC
  EVRP changes some statements into copies but then does
not do copy prop during its handling. This causes in some
cases where phiopt could have optimized the phi not to be
done. So we should move the copy prop pass (sccopy) right
after evrp instead of after phiopt.

Notes on the testsuite changes:
dse-points-to.c needs to disable sccopy1 for the same
reason why it disables all other copyprop passes.
pr45397.c had an xfail for specifically PR 103221.
pr81981.c is about a missing warning, in this case moving
sccopy swaps around which uses is first in the list.

Bootstrapped and tested on x86_64-linux-gnu.

	PR tree-optimization/103221
gcc/ChangeLog:

	* passes.def (early_optimizations): Move sccopy
	to after evrp.

gcc/testsuite/ChangeLog:

	* gcc.dg/tree-ssa/dse-points-to.c: Disable sccopy1.
	* gcc.dg/tree-ssa/pr45397.c: Remove the xfail.
	* gcc.dg/ubsan/pr81981.c: Swap around which one is xfailed.

Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
---
 gcc/passes.def                                | 2 +-
 gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c | 2 +-
 gcc/testsuite/gcc.dg/tree-ssa/pr45397.c       | 8 +++-----
 gcc/testsuite/gcc.dg/ubsan/pr81981.c          | 4 ++--
 4 files changed, 7 insertions(+), 9 deletions(-)
  

Comments

Richard Biener June 3, 2026, 11:43 a.m. UTC | #1
On Wed, Jun 3, 2026 at 4:07 AM Andrew Pinski
<andrew.pinski@oss.qualcomm.com> wrote:
>
> EVRP changes some statements into copies but then does
> not do copy prop during its handling. This causes in some
> cases where phiopt could have optimized the phi not to be
> done. So we should move the copy prop pass (sccopy) right
> after evrp instead of after phiopt.
>
> Notes on the testsuite changes:
> dse-points-to.c needs to disable sccopy1 for the same
> reason why it disables all other copyprop passes.
> pr45397.c had an xfail for specifically PR 103221.
> pr81981.c is about a missing warning, in this case moving
> sccopy swaps around which uses is first in the list.

OK.  I guess EVRP copies are more common than tail-recursion
introduced ones.

> Bootstrapped and tested on x86_64-linux-gnu.
>
>         PR tree-optimization/103221
> gcc/ChangeLog:
>
>         * passes.def (early_optimizations): Move sccopy
>         to after evrp.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/tree-ssa/dse-points-to.c: Disable sccopy1.
>         * gcc.dg/tree-ssa/pr45397.c: Remove the xfail.
>         * gcc.dg/ubsan/pr81981.c: Swap around which one is xfailed.
>
> Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
> ---
>  gcc/passes.def                                | 2 +-
>  gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c | 2 +-
>  gcc/testsuite/gcc.dg/tree-ssa/pr45397.c       | 8 +++-----
>  gcc/testsuite/gcc.dg/ubsan/pr81981.c          | 4 ++--
>  4 files changed, 7 insertions(+), 9 deletions(-)
>
> diff --git a/gcc/passes.def b/gcc/passes.def
> index cdddb87302f..1fc867fae51 100644
> --- a/gcc/passes.def
> +++ b/gcc/passes.def
> @@ -94,6 +94,7 @@ along with GCC; see the file COPYING3.  If not see
>           NEXT_PASS (pass_phiprop);
>           NEXT_PASS (pass_fre, true /* may_iterate */);
>           NEXT_PASS (pass_early_vrp);
> +         NEXT_PASS (pass_sccopy);
>           NEXT_PASS (pass_merge_phi);
>            NEXT_PASS (pass_dse);
>           NEXT_PASS (pass_cd_dce, false /* update_address_taken_p */, true /* remove_unused_locals */);
> @@ -104,7 +105,6 @@ along with GCC; see the file COPYING3.  If not see
>           NEXT_PASS (pass_tail_recursion);
>           NEXT_PASS (pass_if_to_switch);
>           NEXT_PASS (pass_convert_switch);
> -         NEXT_PASS (pass_sccopy);
>           NEXT_PASS (pass_profile);
>           NEXT_PASS (pass_local_pure_const);
>           NEXT_PASS (pass_modref);
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c b/gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c
> index 762d6720143..ff84ba8db13 100644
> --- a/gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "-O2 -fno-tree-ccp -fno-tree-forwprop -fno-tree-fre -fno-tree-vrp -fdump-tree-dse1-details" } */
> +/* { dg-options "-O2 -fno-tree-ccp -fno-tree-forwprop -fno-tree-fre -fno-tree-vrp -fdisable-tree-sccopy1 -fdump-tree-dse1-details" } */
>
>  int
>  f ()
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr45397.c b/gcc/testsuite/gcc.dg/tree-ssa/pr45397.c
> index 8eacb518777..37e57a8996c 100644
> --- a/gcc/testsuite/gcc.dg/tree-ssa/pr45397.c
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr45397.c
> @@ -18,12 +18,10 @@ int foo_mul (const unsigned char *tmp, int i, int val)
>
>  /* All cases should end up using min/max for the saturated operations and
>     have no control flow.  */
> -/* EVRP leaves copies in the IL which confuses phiopt1 so we have
> -   to rely on phiopt2 instead.  */
>  /* { dg-final { scan-tree-dump-not " & 255;" "evrp" } } */
> -/* { dg-final { scan-tree-dump-times "MAX_EXPR" 3 "phiopt1" { xfail *-*-* } } } */
> -/* { dg-final { scan-tree-dump-times "MIN_EXPR" 3 "phiopt1" { xfail *-*-* } } } */
> -/* { dg-final { scan-tree-dump-not "if " "phiopt1" { xfail *-*-* } } } */
> +/* { dg-final { scan-tree-dump-times "MAX_EXPR" 3 "phiopt1"  } } */
> +/* { dg-final { scan-tree-dump-times "MIN_EXPR" 3 "phiopt1"  } } */
> +/* { dg-final { scan-tree-dump-not "if " "phiopt1" } } */
>  /* { dg-final { scan-tree-dump-times "MAX_EXPR" 3 "phiopt2" } } */
>  /* { dg-final { scan-tree-dump-times "MIN_EXPR" 3 "phiopt2" } } */
>  /* { dg-final { scan-tree-dump-not "if " "phiopt2" } } */
> diff --git a/gcc/testsuite/gcc.dg/ubsan/pr81981.c b/gcc/testsuite/gcc.dg/ubsan/pr81981.c
> index d201efb3f65..8aac5ae9725 100644
> --- a/gcc/testsuite/gcc.dg/ubsan/pr81981.c
> +++ b/gcc/testsuite/gcc.dg/ubsan/pr81981.c
> @@ -16,6 +16,6 @@ foo (int i)
>        u[0] = i;
>      }
>
> -  v = u[0];            /* { dg-warning "may be used uninitialized" "" { xfail *-*-* } } */
> -  return t[0];         /* { dg-warning "may be used uninitialized" } */
> +  v = u[0];            /* { dg-warning "may be used uninitialized" } */
> +  return t[0];         /* { dg-warning "may be used uninitialized" "" { xfail *-*-* } } */
>  }
> --
> 2.43.0
>
  
Andrew Pinski June 3, 2026, 4:16 p.m. UTC | #2
On Wed, Jun 3, 2026 at 4:43 AM Richard Biener
<richard.guenther@gmail.com> wrote:
>
> On Wed, Jun 3, 2026 at 4:07 AM Andrew Pinski
> <andrew.pinski@oss.qualcomm.com> wrote:
> >
> > EVRP changes some statements into copies but then does
> > not do copy prop during its handling. This causes in some
> > cases where phiopt could have optimized the phi not to be
> > done. So we should move the copy prop pass (sccopy) right
> > after evrp instead of after phiopt.
> >
> > Notes on the testsuite changes:
> > dse-points-to.c needs to disable sccopy1 for the same
> > reason why it disables all other copyprop passes.
> > pr45397.c had an xfail for specifically PR 103221.
> > pr81981.c is about a missing warning, in this case moving
> > sccopy swaps around which uses is first in the list.
>
> OK.  I guess EVRP copies are more common than tail-recursion
> introduced ones.

Yes, that is correct.
And the inliner will produce more copies. ccp right after inlining
will remove most of those and so will forwprop right before alias
pass.

Thanks,
Andrea


>
> > Bootstrapped and tested on x86_64-linux-gnu.
> >
> >         PR tree-optimization/103221
> > gcc/ChangeLog:
> >
> >         * passes.def (early_optimizations): Move sccopy
> >         to after evrp.
> >
> > gcc/testsuite/ChangeLog:
> >
> >         * gcc.dg/tree-ssa/dse-points-to.c: Disable sccopy1.
> >         * gcc.dg/tree-ssa/pr45397.c: Remove the xfail.
> >         * gcc.dg/ubsan/pr81981.c: Swap around which one is xfailed.
> >
> > Signed-off-by: Andrew Pinski <andrew.pinski@oss.qualcomm.com>
> > ---
> >  gcc/passes.def                                | 2 +-
> >  gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c | 2 +-
> >  gcc/testsuite/gcc.dg/tree-ssa/pr45397.c       | 8 +++-----
> >  gcc/testsuite/gcc.dg/ubsan/pr81981.c          | 4 ++--
> >  4 files changed, 7 insertions(+), 9 deletions(-)
> >
> > diff --git a/gcc/passes.def b/gcc/passes.def
> > index cdddb87302f..1fc867fae51 100644
> > --- a/gcc/passes.def
> > +++ b/gcc/passes.def
> > @@ -94,6 +94,7 @@ along with GCC; see the file COPYING3.  If not see
> >           NEXT_PASS (pass_phiprop);
> >           NEXT_PASS (pass_fre, true /* may_iterate */);
> >           NEXT_PASS (pass_early_vrp);
> > +         NEXT_PASS (pass_sccopy);
> >           NEXT_PASS (pass_merge_phi);
> >            NEXT_PASS (pass_dse);
> >           NEXT_PASS (pass_cd_dce, false /* update_address_taken_p */, true /* remove_unused_locals */);
> > @@ -104,7 +105,6 @@ along with GCC; see the file COPYING3.  If not see
> >           NEXT_PASS (pass_tail_recursion);
> >           NEXT_PASS (pass_if_to_switch);
> >           NEXT_PASS (pass_convert_switch);
> > -         NEXT_PASS (pass_sccopy);
> >           NEXT_PASS (pass_profile);
> >           NEXT_PASS (pass_local_pure_const);
> >           NEXT_PASS (pass_modref);
> > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c b/gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c
> > index 762d6720143..ff84ba8db13 100644
> > --- a/gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c
> > +++ b/gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c
> > @@ -1,5 +1,5 @@
> >  /* { dg-do compile } */
> > -/* { dg-options "-O2 -fno-tree-ccp -fno-tree-forwprop -fno-tree-fre -fno-tree-vrp -fdump-tree-dse1-details" } */
> > +/* { dg-options "-O2 -fno-tree-ccp -fno-tree-forwprop -fno-tree-fre -fno-tree-vrp -fdisable-tree-sccopy1 -fdump-tree-dse1-details" } */
> >
> >  int
> >  f ()
> > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr45397.c b/gcc/testsuite/gcc.dg/tree-ssa/pr45397.c
> > index 8eacb518777..37e57a8996c 100644
> > --- a/gcc/testsuite/gcc.dg/tree-ssa/pr45397.c
> > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr45397.c
> > @@ -18,12 +18,10 @@ int foo_mul (const unsigned char *tmp, int i, int val)
> >
> >  /* All cases should end up using min/max for the saturated operations and
> >     have no control flow.  */
> > -/* EVRP leaves copies in the IL which confuses phiopt1 so we have
> > -   to rely on phiopt2 instead.  */
> >  /* { dg-final { scan-tree-dump-not " & 255;" "evrp" } } */
> > -/* { dg-final { scan-tree-dump-times "MAX_EXPR" 3 "phiopt1" { xfail *-*-* } } } */
> > -/* { dg-final { scan-tree-dump-times "MIN_EXPR" 3 "phiopt1" { xfail *-*-* } } } */
> > -/* { dg-final { scan-tree-dump-not "if " "phiopt1" { xfail *-*-* } } } */
> > +/* { dg-final { scan-tree-dump-times "MAX_EXPR" 3 "phiopt1"  } } */
> > +/* { dg-final { scan-tree-dump-times "MIN_EXPR" 3 "phiopt1"  } } */
> > +/* { dg-final { scan-tree-dump-not "if " "phiopt1" } } */
> >  /* { dg-final { scan-tree-dump-times "MAX_EXPR" 3 "phiopt2" } } */
> >  /* { dg-final { scan-tree-dump-times "MIN_EXPR" 3 "phiopt2" } } */
> >  /* { dg-final { scan-tree-dump-not "if " "phiopt2" } } */
> > diff --git a/gcc/testsuite/gcc.dg/ubsan/pr81981.c b/gcc/testsuite/gcc.dg/ubsan/pr81981.c
> > index d201efb3f65..8aac5ae9725 100644
> > --- a/gcc/testsuite/gcc.dg/ubsan/pr81981.c
> > +++ b/gcc/testsuite/gcc.dg/ubsan/pr81981.c
> > @@ -16,6 +16,6 @@ foo (int i)
> >        u[0] = i;
> >      }
> >
> > -  v = u[0];            /* { dg-warning "may be used uninitialized" "" { xfail *-*-* } } */
> > -  return t[0];         /* { dg-warning "may be used uninitialized" } */
> > +  v = u[0];            /* { dg-warning "may be used uninitialized" } */
> > +  return t[0];         /* { dg-warning "may be used uninitialized" "" { xfail *-*-* } } */
> >  }
> > --
> > 2.43.0
> >
  

Patch

diff --git a/gcc/passes.def b/gcc/passes.def
index cdddb87302f..1fc867fae51 100644
--- a/gcc/passes.def
+++ b/gcc/passes.def
@@ -94,6 +94,7 @@  along with GCC; see the file COPYING3.  If not see
 	  NEXT_PASS (pass_phiprop);
 	  NEXT_PASS (pass_fre, true /* may_iterate */);
 	  NEXT_PASS (pass_early_vrp);
+	  NEXT_PASS (pass_sccopy);
 	  NEXT_PASS (pass_merge_phi);
           NEXT_PASS (pass_dse);
 	  NEXT_PASS (pass_cd_dce, false /* update_address_taken_p */, true /* remove_unused_locals */);
@@ -104,7 +105,6 @@  along with GCC; see the file COPYING3.  If not see
 	  NEXT_PASS (pass_tail_recursion);
 	  NEXT_PASS (pass_if_to_switch);
 	  NEXT_PASS (pass_convert_switch);
-	  NEXT_PASS (pass_sccopy);
 	  NEXT_PASS (pass_profile);
 	  NEXT_PASS (pass_local_pure_const);
 	  NEXT_PASS (pass_modref);
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c b/gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c
index 762d6720143..ff84ba8db13 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/dse-points-to.c
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O2 -fno-tree-ccp -fno-tree-forwprop -fno-tree-fre -fno-tree-vrp -fdump-tree-dse1-details" } */
+/* { dg-options "-O2 -fno-tree-ccp -fno-tree-forwprop -fno-tree-fre -fno-tree-vrp -fdisable-tree-sccopy1 -fdump-tree-dse1-details" } */
 
 int
 f ()
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr45397.c b/gcc/testsuite/gcc.dg/tree-ssa/pr45397.c
index 8eacb518777..37e57a8996c 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/pr45397.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr45397.c
@@ -18,12 +18,10 @@  int foo_mul (const unsigned char *tmp, int i, int val)
 
 /* All cases should end up using min/max for the saturated operations and
    have no control flow.  */
-/* EVRP leaves copies in the IL which confuses phiopt1 so we have
-   to rely on phiopt2 instead.  */
 /* { dg-final { scan-tree-dump-not " & 255;" "evrp" } } */
-/* { dg-final { scan-tree-dump-times "MAX_EXPR" 3 "phiopt1" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-times "MIN_EXPR" 3 "phiopt1" { xfail *-*-* } } } */
-/* { dg-final { scan-tree-dump-not "if " "phiopt1" { xfail *-*-* } } } */
+/* { dg-final { scan-tree-dump-times "MAX_EXPR" 3 "phiopt1"  } } */
+/* { dg-final { scan-tree-dump-times "MIN_EXPR" 3 "phiopt1"  } } */
+/* { dg-final { scan-tree-dump-not "if " "phiopt1" } } */
 /* { dg-final { scan-tree-dump-times "MAX_EXPR" 3 "phiopt2" } } */
 /* { dg-final { scan-tree-dump-times "MIN_EXPR" 3 "phiopt2" } } */
 /* { dg-final { scan-tree-dump-not "if " "phiopt2" } } */
diff --git a/gcc/testsuite/gcc.dg/ubsan/pr81981.c b/gcc/testsuite/gcc.dg/ubsan/pr81981.c
index d201efb3f65..8aac5ae9725 100644
--- a/gcc/testsuite/gcc.dg/ubsan/pr81981.c
+++ b/gcc/testsuite/gcc.dg/ubsan/pr81981.c
@@ -16,6 +16,6 @@  foo (int i)
       u[0] = i;
     }
 
-  v = u[0];		/* { dg-warning "may be used uninitialized" "" { xfail *-*-* } } */
-  return t[0];		/* { dg-warning "may be used uninitialized" } */
+  v = u[0];		/* { dg-warning "may be used uninitialized" } */
+  return t[0];		/* { dg-warning "may be used uninitialized" "" { xfail *-*-* } } */
 }