[gcc r17-2635] phiopt: for non-diamond case, invoke a limited conditional store elimination
Andrea Pinski via Gcc-cvs <[email protected]>
| Newsgroups | gmane.comp.gcc.cvs |
|---|---|
| Message-ID | <[email protected]> |
https://gcc.gnu.org/g:eb8011467d0ce70cae098a88569a0c8a5b7f5683 commit r17-2635-geb8011467d0ce70cae098a88569a0c8a5b7f5683 Author: Andrew Pinski <[email protected]> Date: Mon Jun 22 16:54:27 2026 -0700 phiopt: for non-diamond case, invoke a limited conditional store elimination 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. 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]> Diff: --- 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/testsuite/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(-) diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr124405.c b/gcc/testsuite/gcc.dg/tree-ssa/pr124405.c index 9ba230d2b56a..0ece7f0ce5eb 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 d9fb2edf5495..518c6b8a0dce 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 000000000000..52e4b4804658 --- /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 bb39df2be8e1..23072828ae10 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 6a00f54b5458..8a054558d559 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 000000000000..58d3fe3f1c43 --- /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 ecc083ebebe5..6022240e1ec0 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 000000000000..74deda5bee6d --- /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 4fad2d1eb132..83762162a721 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 e930389e9c0a..ed03deabf179 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 a06f339f0bb0..4190fdf63dde 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 054c025f8829..d48f164c7fbf 100644 --- a/gcc/tree-ssa-phiopt.cc +++ b/gcc/tree-ssa-phiopt.cc @@ -4168,6 +4168,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)) {