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.

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.

Signed-off-by: Andrew Pinski <[email protected]>
---
 gcc/testsuite/gcc.dg/tree-ssa/pr124405.c           | 4 ++--
 gcc/testsuite/gcc.dg/tree-ssa/pr89430-2.c          | 4 ++--
 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                             | 7 +++++++
 6 files changed, 16 insertions(+), 9 deletions(-)

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-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-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 27f1d60aa46..0749ced9f0d 100644
--- a/gcc/tree-ssa-phiopt.cc
+++ b/gcc/tree-ssa-phiopt.cc
@@ -4078,6 +4078,13 @@ 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))
+       {
+         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