aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2024-06-25 18:02:35 +0100
committerRichard Sandiford <richard.sandiford@arm.com>2024-06-25 18:02:35 +0100
commitb87e19afa349691fdc91173bcf7a9afc7b3b0cb1 (patch)
treedcc564c1f52ee27940e9d5fb6b3643c03651fa7a
parent06ebb7c6f31fe42ffdea6f51ac1ba1f6b058c090 (diff)
downloadgcc-b87e19afa349691fdc91173bcf7a9afc7b3b0cb1.zip
gcc-b87e19afa349691fdc91173bcf7a9afc7b3b0cb1.tar.gz
gcc-b87e19afa349691fdc91173bcf7a9afc7b3b0cb1.tar.bz2
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.
-rw-r--r--gcc/late-combine.cc12
1 files changed, 12 insertions, 0 deletions
diff --git a/gcc/late-combine.cc b/gcc/late-combine.cc
index fc75d1c..b7c0bc0 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);