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]>
---
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