]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
phiopt: for non-diamond case, invoke a limited conditional store elimination
authorAndrew Pinski <andrew.pinski@oss.qualcomm.com>
Mon, 22 Jun 2026 23:54:27 +0000 (16:54 -0700)
committerAndrea Pinski <andrew.pinski@oss.qualcomm.com>
Thu, 23 Jul 2026 00:14:06 +0000 (17:14 -0700)
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 <andrew.pinski@oss.qualcomm.com>
12 files changed:
gcc/testsuite/gcc.dg/tree-ssa/pr124405.c
gcc/testsuite/gcc.dg/tree-ssa/pr89430-1.c
gcc/testsuite/gcc.dg/tree-ssa/pr89430-1a.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pr89430-2.c
gcc/testsuite/gcc.dg/tree-ssa/pr89430-5.c
gcc/testsuite/gcc.dg/tree-ssa/pr89430-5a.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pr89430-6.c
gcc/testsuite/gcc.dg/tree-ssa/pr89430-6a.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pr89430-7-comp-ref.c
gcc/testsuite/gcc.dg/tree-ssa/pr99473-1.c
gcc/testsuite/gcc.dg/tree-ssa/ssa-pre-17.c
gcc/tree-ssa-phiopt.cc

index 9ba230d2b56ae20c56ef822578ffed76076b209a..0ece7f0ce5eba1f2ab8763ce1e5ee8cc86738719 100644 (file)
@@ -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"} } */
index d9fb2edf54952d9a2680dc61fc2c023271677b06..518c6b8a0dcee1f2bd00a31e939092e7f3ba75d9 100644 (file)
@@ -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 (file)
index 0000000..52e4b48
--- /dev/null
@@ -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" } } */
index bb39df2be8e1c308e2d9a1d69dc546339fdc398b..23072828ae104453051db70b8041d1b929374dbf 100644 (file)
@@ -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" } } */
index 6a00f54b545824cda0000516a3248432750f9d30..8a054558d5591bbb13139f9950e670dd0c55d667 100644 (file)
@@ -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 (file)
index 0000000..58d3fe3
--- /dev/null
@@ -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" } } */
index ecc083ebebe51e42337632dd2bf691e0de03642d..6022240e1ec03b7c293528ab702dc7790bfe1367 100644 (file)
@@ -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 (file)
index 0000000..74deda5
--- /dev/null
@@ -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" } } */
index 4fad2d1eb132ad650c946590f856902978e86c16..83762162a7215f80eda20f6072fdd90d240508d0 100644 (file)
@@ -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" } } */
index e930389e9c0a1ac7ac92b02efe5370837d19ed98..ed03deabf1790a8103722b100b1dbd608816706c 100644 (file)
@@ -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" } } */
index a06f339f0bb0cb7735325745c8af3ab756156c3b..4190fdf63dde3531211bde2b58208712957c3376 100644 (file)
@@ -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;
index 054c025f8829b11780f4693358362e7665ae1a3c..d48f164c7fbfb047c8e2604734a01b25f899eca5 100644 (file)
@@ -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))
        {