diff --git a/gcc13-pr101523.patch b/gcc13-pr101523.patch index 2c1993e..48731bd 100644 --- a/gcc13-pr101523.patch +++ b/gcc13-pr101523.patch @@ -1,48 +1,46 @@ -From 839bc42772ba7af66af3bd16efed4a69511312ae Mon Sep 17 00:00:00 2001 -From: Segher Boessenkool -Date: Wed, 27 Mar 2024 14:09:52 +0000 -Subject: [PATCH] combine: Don't combine if I2 does not change +From 5729ffad4db78b26f0d1f658a9fd695be5970550 Mon Sep 17 00:00:00 2001 +From: Richard Biener +Date: Wed, 3 Apr 2024 12:58:26 +0200 +Subject: [PATCH] rtl-optimization/101523 - avoid re-combine after noop 2->2 + combination To: gcc-patches@gcc.gnu.org -In some cases combine will "combine" an I2 and I3, but end up putting -exactly the same thing back as I2 as was there before. This is never -progress, so we shouldn't do it, it will lead to oscillating behaviour -and the like. - -If we want to canonicalise things, that's fine, but this is not the -way to do it. - -2024-03-27 Segher Boessenkool +The following avoids re-walking and re-combining the instructions +between i2 and i3 when the pattern of i2 doesn't change. PR rtl-optimization/101523 - * combine.cc (try_combine): Don't do a 2-insn combination if - it does not in fact change I2. + * combine.cc (try_combine): When the pattern of i2 doesn't + change do not re-start combining at i2 or an earlier insn which + had links or notes added. --- - gcc/combine.cc | 11 +++++++++++ - 1 file changed, 11 insertions(+) + gcc/combine.cc | 7 +++++++ + 1 file changed, 7 insertions(+) diff --git a/gcc/combine.cc b/gcc/combine.cc -index a4479f8d836..745391016d0 100644 +index a4479f8d836..ff25752cac4 100644 --- a/gcc/combine.cc +++ b/gcc/combine.cc -@@ -4186,6 +4186,17 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0, +@@ -4186,6 +4186,10 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0, adjust_for_new_dest (i3); } -+ /* If I2 didn't change, this is not a combination (but a simplification or -+ canonicalisation with context), which should not be done here. Doing -+ it here explodes the algorithm. Don't. */ ++ bool i2_unchanged = false; + if (rtx_equal_p (newi2pat, PATTERN (i2))) -+ { -+ if (dump_file) -+ fprintf (dump_file, "i2 didn't change, not doing this\n"); -+ undo_all (); -+ return 0; -+ } ++ i2_unchanged = true; + /* We now know that we can do this combination. Merge the insns and update the status of registers and LOG_LINKS. */ +@@ -4752,6 +4756,9 @@ try_combine (rtx_insn *i3, rtx_insn *i2, rtx_insn *i1, rtx_insn *i0, + combine_successes++; + undo_commit (); + ++ if (i2_unchanged) ++ return i3; ++ + rtx_insn *ret = newi2pat ? i2 : i3; + if (added_links_insn && DF_INSN_LUID (added_links_insn) < DF_INSN_LUID (ret)) + ret = added_links_insn; -- 2.35.3 diff --git a/gcc13.changes b/gcc13.changes index d426b63..51b72d1 100644 --- a/gcc13.changes +++ b/gcc13.changes @@ -1,5 +1,5 @@ ------------------------------------------------------------------- -Thu Mar 28 06:55:18 UTC 2024 - Richard Biener +Thu Apr 4 07:43:17 UTC 2024 - Richard Biener - Add gcc13-pr101523.patch to avoid combine spending too much compile-time and memory doing nothing on s390x. [boo#1188441]