]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
late-combine: Honor targetm.cannot_copy_insn_p
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 25 Jun 2024 17:02:35 +0000 (18:02 +0100)
committerRichard Sandiford <richard.sandiford@arm.com>
Tue, 25 Jun 2024 17:02:35 +0000 (18:02 +0100)
late-combine was failing to take targetm.cannot_copy_insn_p into
account, which led to multiple definitions of PIC symbols on
arm*-*-* targets.

gcc/
* late-combine.cc (insn_combination::substitute_nondebug_use):
Reject second and subsequent uses if targetm.cannot_copy_insn_p
disallows copying.

gcc/late-combine.cc

index fc75d1c56d76d6abe264daed9cb4614f131937d4..b7c0bc07a8b7ebfddfb7e3dab661c90881ad8fcc 100644 (file)
@@ -179,6 +179,18 @@ insn_combination::substitute_nondebug_use (use_info *use)
   if (dump_file && (dump_flags & TDF_DETAILS))
     dump_insn_slim (dump_file, use->insn ()->rtl ());
 
+  // Reject second and subsequent uses if the target does not allow
+  // the defining instruction to be copied.
+  if (targetm.cannot_copy_insn_p
+      && m_nondebug_changes.length () >= 2
+      && targetm.cannot_copy_insn_p (m_def_insn->rtl ()))
+    {
+      if (dump_file && (dump_flags & TDF_DETAILS))
+       fprintf (dump_file, "-- The target does not allow multiple"
+                " copies of insn %d\n", m_def_insn->uid ());
+      return false;
+    }
+
   // Check that we can change the instruction pattern.  Leave recognition
   // of the result till later.
   insn_propagation prop (use_rtl, m_dest, m_src);