[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))
 	{
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.