On 6/25/24 8:07 AM, Richard Sandiford wrote:
late-combine was failing to take targetm.cannot_copy_insn_p into
account, which led to multiple definitions of PIC symbols on
arm*-*-* targets.
Currently bootstrapping & regression testing on arm-linux-gnueabihf
and aarch64-linus-gnu. It should fix the bootstrap-lto problem
reported by Linaro's CI. OK to install if testing passes?
Richard
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 | 12 ++++++++++++
1 file changed, 12 insertions(+)
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;
+ }
OK
jeff