From: Richard Sandiford Date: Tue, 25 Jun 2024 17:02:35 +0000 (+0100) Subject: late-combine: Honor targetm.cannot_copy_insn_p X-Git-Tag: basepoints/gcc-16~7937 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b87e19afa349691fdc91173bcf7a9afc7b3b0cb1;p=thirdparty%2Fgcc.git late-combine: Honor targetm.cannot_copy_insn_p 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. --- diff --git a/gcc/late-combine.cc b/gcc/late-combine.cc index fc75d1c56d7..b7c0bc07a8b 100644 --- a/gcc/late-combine.cc +++ b/gcc/late-combine.cc @@ -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);