diff mbox series

combine: Don't combine if I2 does not change

Message ID 839bc42772ba7af66af3bd16efed4a69511312ae.1711555355.git.segher@kernel.crashing.org
State New
Headers show
Series combine: Don't combine if I2 does not change | expand

Commit Message

Segher Boessenkool March 27, 2024, 4:11 p.m. UTC
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.

Committed to trunk.


Segher


2024-03-27  Segher Boessenkool  <segher@kernel.crashing.org>

	PR rtl-optimization/101523
	* combine.cc (try_combine): Don't do a 2-insn combination if
	it does not in fact change I2.
---
 gcc/combine.cc | 11 +++++++++++
 1 file changed, 11 insertions(+)
diff mbox series

Patch

diff --git a/gcc/combine.cc b/gcc/combine.cc
index a4479f8d8364..745391016d04 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,
       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.  */
+  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;
+    }
+
   /* We now know that we can do this combination.  Merge the insns and
      update the status of registers and LOG_LINKS.  */