commit:     414a7d1bc292ae359a6c392ff078383d8e69194d
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Tue Apr  1 14:45:36 2025 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Tue Apr  1 14:45:36 2025 +0000
URL:        https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=414a7d1b

15.0.0: drop combine patches

The first one has been merged upstream just now, the other might
be later.

Signed-off-by: Sam James <sam <AT> gentoo.org>

 ...-reg_used_between_p-rather-than-modified_.patch | 196 ---------------------
 ...bine-Special-case-set_noop_p-in-two-spots.patch |  96 ----------
 2 files changed, 292 deletions(-)

diff --git 
a/15.0.0/gentoo/78_all_PR119291-combine-Use-reg_used_between_p-rather-than-modified_.patch
 
b/15.0.0/gentoo/78_all_PR119291-combine-Use-reg_used_between_p-rather-than-modified_.patch
deleted file mode 100644
index 3264869..0000000
--- 
a/15.0.0/gentoo/78_all_PR119291-combine-Use-reg_used_between_p-rather-than-modified_.patch
+++ /dev/null
@@ -1,196 +0,0 @@
-https://inbox.sourceware.org/gcc-patches/Z+aDTloxATzkpTbQ@tucnak/
-
-From 8db4ff073981a554ab5b77f958fa4a333b981b30 Mon Sep 17 00:00:00 2001
-Message-ID: 
<8db4ff073981a554ab5b77f958fa4a333b981b30.1743258660.git....@gentoo.org>
-From: Jakub Jelinek <[email protected]>
-Date: Fri, 28 Mar 2025 12:09:02 +0100
-Subject: [PATCH 1/2] combine: Use reg_used_between_p rather than
- modified_between_p in two spots [PR119291]
-
-Hi!
-
-The following testcase is miscompiled on x86_64-linux at -O2 by the combiner.
-We have from earlier combinations
-(insn 22 21 23 4 (set (reg:SI 104 [ _7 ])
-        (const_int 0 [0])) "pr119291.c":25:15 96 {*movsi_internal}
-     (nil))
-(insn 23 22 24 4 (set (reg/v:SI 117 [ e ])
-        (reg/v:SI 116 [ e ])) 96 {*movsi_internal}
-     (expr_list:REG_DEAD (reg/v:SI 116 [ e ])
-        (nil)))
-(note 24 23 25 4 NOTE_INSN_DELETED)
-(insn 25 24 26 4 (parallel [
-            (set (reg:CCZ 17 flags)
-                (compare:CCZ (neg:SI (reg:SI 104 [ _7 ]))
-                    (const_int 0 [0])))
-            (set (reg/v:SI 116 [ e ])
-                (neg:SI (reg:SI 104 [ _7 ])))
-        ]) "pr119291.c":26:13 977 {*negsi_2}
-     (expr_list:REG_DEAD (reg:SI 104 [ _7 ])
-        (nil)))
-(note 26 25 27 4 NOTE_INSN_DELETED)
-(insn 27 26 28 4 (set (reg:DI 128 [ _9 ])
-        (ne:DI (reg:CCZ 17 flags)
-            (const_int 0 [0]))) "pr119291.c":26:13 1447 {*setcc_di_1}
-     (expr_list:REG_DEAD (reg:CCZ 17 flags)
-        (nil)))
-and try_combine is called on i3 25 and i2 22 (second time)
-and reach the hunk being patched with simplified i3
-(insn 25 24 26 4 (parallel [
-            (set (pc)
-                (pc))
-            (set (reg/v:SI 116 [ e ])
-                (const_int 0 [0]))
-        ]) "pr119291.c":28:13 977 {*negsi_2}
-     (expr_list:REG_DEAD (reg:SI 104 [ _7 ])
-        (nil)))
-and
-(insn 22 21 23 4 (set (reg:SI 104 [ _7 ])
-        (const_int 0 [0])) "pr119291.c":27:15 96 {*movsi_internal}
-     (nil))
-Now, the try_combine code there attempts to split two independent
-sets in newpat by moving one of them to i2.
-And among other tests it checks
-!modified_between_p (SET_DEST (set1), i2, i3)
-which is certainly needed, if there would be say
-(set (reg/v:SI 116 [ e ]) (const_int 42 [0x2a]))
-in between i2 and i3, we couldn't do that, as that set would overwrite
-the value set by set1 we want to move to the i2 position.
-But in this case pseudo 116 isn't set in between i2 and i3, but used
-(and additionally there is a REG_DEAD note for it).
-
-This is equally bad for the move, because while the i3 insn
-and later will see the pseudo value that we set, the insn in between
-which uses the value will see a different value from the one that
-it should see.
-
-As we don't check for that, in the end try_combine succeeds and
-changes the IL to:
-(insn 22 21 23 4 (set (reg/v:SI 116 [ e ])
-        (const_int 0 [0])) "pr119291.c":27:15 96 {*movsi_internal}
-     (nil))
-(insn 23 22 24 4 (set (reg/v:SI 117 [ e ])
-        (reg/v:SI 116 [ e ])) 96 {*movsi_internal}
-     (expr_list:REG_DEAD (reg/v:SI 116 [ e ])
-        (nil)))
-(note 24 23 25 4 NOTE_INSN_DELETED)
-(insn 25 24 26 4 (set (pc)
-        (pc)) "pr119291.c":28:13 2147483647 {NOOP_MOVE}
-     (nil))
-(note 26 25 27 4 NOTE_INSN_DELETED)
-(insn 27 26 28 4 (set (reg:DI 128 [ _9 ])
-        (const_int 0 [0])) "pr119291.c":28:13 95 {*movdi_internal}
-     (nil))
-(note, the i3 got turned into a nop and try_combine also modified insn 27).
-
-The following patch replaces the modified_between_p
-tests with reg_used_between_p, my understanding is that
-modified_between_p is a subset of reg_used_between_p, so one
-doesn't need both.
-
-Bootstrapped/regtested on x86_64-linux, i686-linux, aarch64-linux,
-powerpc64le-linux and s390x-linux, ok for trunk?
-
-Looking at this some more today, I think we should special case
-set_noop_p because that can be put into i2 (except for the JUMP_P
-violations), currently both modified_between_p (pc_rtx, i2, i3)
-and reg_used_between_p (pc_rtx, i2, i3) returns false.
-I'll post a patch incrementally for that (but that feels like
-new optimization, so probably not something that should be backported).
-
-2025-03-28  Jakub Jelinek  <[email protected]>
-
-       PR rtl-optimization/119291
-       * combine.cc (try_combine): For splitting of PARALLEL with
-       2 independent SETs into i2 and i3 sets check reg_used_between_p
-       of the SET_DESTs rather than just modified_between_p.
-
-       * gcc.c-torture/execute/pr119291.c: New test.
----
- gcc/combine.cc                                | 14 ++++----
- .../gcc.c-torture/execute/pr119291.c          | 33 +++++++++++++++++++
- 2 files changed, 40 insertions(+), 7 deletions(-)
- create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr119291.c
-
-diff --git a/gcc/combine.cc b/gcc/combine.cc
-index ef13f5d5e900..e87a9f272f1a 100644
---- a/gcc/combine.cc
-+++ b/gcc/combine.cc
-@@ -4012,18 +4012,18 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, 
rtx_insn *i0,
-       rtx set1 = XVECEXP (newpat, 0, 1);
- 
-       /* Normally, it doesn't matter which of the two is done first, but
--       one which uses any regs/memory set in between i2 and i3 can't
--       be first.  The PARALLEL might also have been pre-existing in i3,
--       so we need to make sure that we won't wrongly hoist a SET to i2
--       that would conflict with a death note present in there, or would
--       have its dest modified between i2 and i3.  */
-+       one which uses any regs/memory set or used in between i2 and i3
-+       can't be first.  The PARALLEL might also have been pre-existing
-+       in i3, so we need to make sure that we won't wrongly hoist a SET
-+       to i2 that would conflict with a death note present in there, or
-+       would have its dest modified or used between i2 and i3.  */
-       if (!modified_between_p (SET_SRC (set1), i2, i3)
-         && !(REG_P (SET_DEST (set1))
-              && find_reg_note (i2, REG_DEAD, SET_DEST (set1)))
-         && !(GET_CODE (SET_DEST (set1)) == SUBREG
-              && find_reg_note (i2, REG_DEAD,
-                                SUBREG_REG (SET_DEST (set1))))
--        && !modified_between_p (SET_DEST (set1), i2, i3)
-+        && !reg_used_between_p (SET_DEST (set1), i2, i3)
-         /* If I3 is a jump, ensure that set0 is a jump so that
-            we do not create invalid RTL.  */
-         && (!JUMP_P (i3) || SET_DEST (set0) == pc_rtx)
-@@ -4038,7 +4038,7 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, 
rtx_insn *i0,
-              && !(GET_CODE (SET_DEST (set0)) == SUBREG
-                   && find_reg_note (i2, REG_DEAD,
-                                     SUBREG_REG (SET_DEST (set0))))
--             && !modified_between_p (SET_DEST (set0), i2, i3)
-+             && !reg_used_between_p (SET_DEST (set0), i2, i3)
-              /* If I3 is a jump, ensure that set1 is a jump so that
-                 we do not create invalid RTL.  */
-              && (!JUMP_P (i3) || SET_DEST (set1) == pc_rtx)
-diff --git a/gcc/testsuite/gcc.c-torture/execute/pr119291.c 
b/gcc/testsuite/gcc.c-torture/execute/pr119291.c
-new file mode 100644
-index 000000000000..41eadf013d7d
---- /dev/null
-+++ b/gcc/testsuite/gcc.c-torture/execute/pr119291.c
-@@ -0,0 +1,33 @@
-+/* PR rtl-optimization/119291 */
-+
-+int a;
-+long c;
-+
-+__attribute__((noipa)) void
-+foo (int x)
-+{
-+  if (x != 0)
-+    __builtin_abort ();
-+  a = 42;
-+}
-+
-+int
-+main ()
-+{
-+  int e = 1;
-+lab:
-+  if (a < 2)
-+    {
-+      int b = e;
-+      _Bool d = a != 0;
-+      _Bool f = b != 0;
-+      unsigned long g = -(d & f);
-+      unsigned long h = c & g;
-+      unsigned long i = ~c;
-+      e = -(i & h);
-+      c = e != 0;
-+      a = ~e + b;
-+      foo (e);
-+      goto lab;
-+    }
-+}
-
-base-commit: 9018336252463ffed28f01badfdea2a3ca3ba5c8
--- 
-2.49.0
-

diff --git 
a/15.0.0/gentoo/79_all_PR119291-combine-Special-case-set_noop_p-in-two-spots.patch
 
b/15.0.0/gentoo/79_all_PR119291-combine-Special-case-set_noop_p-in-two-spots.patch
deleted file mode 100644
index 1cf964d..0000000
--- 
a/15.0.0/gentoo/79_all_PR119291-combine-Special-case-set_noop_p-in-two-spots.patch
+++ /dev/null
@@ -1,96 +0,0 @@
-https://inbox.sourceware.org/gcc-patches/Z+aF8pEePd6K5xKf@tucnak/
-
-From fd39f47728c4e81e75c7150199fa368646cde9c3 Mon Sep 17 00:00:00 2001
-Message-ID: 
<fd39f47728c4e81e75c7150199fa368646cde9c3.1743258660.git....@gentoo.org>
-In-Reply-To: 
<8db4ff073981a554ab5b77f958fa4a333b981b30.1743258660.git....@gentoo.org>
-References: 
<8db4ff073981a554ab5b77f958fa4a333b981b30.1743258660.git....@gentoo.org>
-From: Jakub Jelinek <[email protected]>
-Date: Fri, 28 Mar 2025 12:20:18 +0100
-Subject: [PATCH 2/2] combine: Special case set_noop_p in two spots
-
-Hi!
-
-Here is the incremental patch I was talking about.
-For noop sets, we don't need to test much, they can go to i2
-unless that would violate i3 JUMP condition.
-
-With this the try_combine on the pr119291.c testcase doesn't fail,
-but succeeds and we get
-(insn 22 21 23 4 (set (pc)
-        (pc)) "pr119291.c":27:15 2147483647 {NOOP_MOVE}
-     (nil))
-(insn 23 22 24 4 (set (reg/v:SI 117 [ e ])
-        (reg/v:SI 116 [ e ])) 96 {*movsi_internal}
-     (expr_list:REG_DEAD (reg/v:SI 116 [ e ])
-        (nil)))
-(note 24 23 25 4 NOTE_INSN_DELETED)
-(insn 25 24 26 4 (set (reg/v:SI 116 [ e ])
-        (const_int 0 [0])) "pr119291.c":28:13 96 {*movsi_internal}
-     (nil))
-(note 26 25 27 4 NOTE_INSN_DELETED)
-(insn 27 26 28 4 (set (reg:DI 128 [ _9 ])
-        (const_int 0 [0])) "pr119291.c":28:13 95 {*movdi_internal}
-     (nil))
-after it.
-
-Ok for trunk if this passes bootstrap/regtest?
-
-2025-03-28  Jakub Jelinek  <[email protected]>
-
-       * combine.cc (try_combine): Sets which satisfy set_noop_p can go
-       to i2 unless i3 is a jump and the other set is not.
----
- gcc/combine.cc | 30 ++++++++++++++++--------------
- 1 file changed, 16 insertions(+), 14 deletions(-)
-
-diff --git a/gcc/combine.cc b/gcc/combine.cc
-index e87a9f272f1a..2be563bb018c 100644
---- a/gcc/combine.cc
-+++ b/gcc/combine.cc
-@@ -4017,13 +4017,14 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, 
rtx_insn *i0,
-        in i3, so we need to make sure that we won't wrongly hoist a SET
-        to i2 that would conflict with a death note present in there, or
-        would have its dest modified or used between i2 and i3.  */
--      if (!modified_between_p (SET_SRC (set1), i2, i3)
--        && !(REG_P (SET_DEST (set1))
--             && find_reg_note (i2, REG_DEAD, SET_DEST (set1)))
--        && !(GET_CODE (SET_DEST (set1)) == SUBREG
--             && find_reg_note (i2, REG_DEAD,
--                               SUBREG_REG (SET_DEST (set1))))
--        && !reg_used_between_p (SET_DEST (set1), i2, i3)
-+      if ((set_noop_p (set1)
-+         || (!modified_between_p (SET_SRC (set1), i2, i3)
-+             && !(REG_P (SET_DEST (set1))
-+                  && find_reg_note (i2, REG_DEAD, SET_DEST (set1)))
-+             && !(GET_CODE (SET_DEST (set1)) == SUBREG
-+                  && find_reg_note (i2, REG_DEAD,
-+                                    SUBREG_REG (SET_DEST (set1))))
-+             && !reg_used_between_p (SET_DEST (set1), i2, i3)))
-         /* If I3 is a jump, ensure that set0 is a jump so that
-            we do not create invalid RTL.  */
-         && (!JUMP_P (i3) || SET_DEST (set0) == pc_rtx)
-@@ -4032,13 +4033,14 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, 
rtx_insn *i0,
-         newi2pat = set1;
-         newpat = set0;
-       }
--      else if (!modified_between_p (SET_SRC (set0), i2, i3)
--             && !(REG_P (SET_DEST (set0))
--                  && find_reg_note (i2, REG_DEAD, SET_DEST (set0)))
--             && !(GET_CODE (SET_DEST (set0)) == SUBREG
--                  && find_reg_note (i2, REG_DEAD,
--                                    SUBREG_REG (SET_DEST (set0))))
--             && !reg_used_between_p (SET_DEST (set0), i2, i3)
-+      else if ((set_noop_p (set0)
-+              || (!modified_between_p (SET_SRC (set0), i2, i3)
-+                  && !(REG_P (SET_DEST (set0))
-+                       && find_reg_note (i2, REG_DEAD, SET_DEST (set0)))
-+                  && !(GET_CODE (SET_DEST (set0)) == SUBREG
-+                       && find_reg_note (i2, REG_DEAD,
-+                                         SUBREG_REG (SET_DEST (set0))))
-+                  && !reg_used_between_p (SET_DEST (set0), i2, i3)))
-              /* If I3 is a jump, ensure that set1 is a jump so that
-                 we do not create invalid RTL.  */
-              && (!JUMP_P (i3) || SET_DEST (set1) == pc_rtx)
--- 
-2.49.0
-

Reply via email to