https://gcc.gnu.org/g:12992edaa96897d4ce26c3d48fa19c142b0aef28
commit r16-3995-g12992edaa96897d4ce26c3d48fa19c142b0aef28 Author: Alexandre Oliva <ol...@adacore.com> Date: Fri Sep 19 16:45:19 2025 -0300 [ira] avoid resetting ira_reg_equiv for function invariants An aarch64 toolchain built with --enable-default-pie fails gcc.target/aarch64/sme/nonlocal_goto_[123].c because the register allocator ends up resetting equivalences, so it concludes it needs to preserve a rematerializable function invariant across a call instead of rematerializing it. Restore the find_reg_equiv_invariant_const logic that was in place before commit 55a2c3226a3e90a6d65f19710bab1ac377054234 rewrote it and added a (spurious?) requirement for non-function-invariants to retain an equivalence when other PIC-related conditions didn't apply. That requirement seems either reversed or unnecessary. for gcc/ChangeLog * ira.cc (setup_reg_equiv): Retain function invariant equivalences. Diff: --- gcc/ira.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/gcc/ira.cc b/gcc/ira.cc index 4eebc9c4c50f..3e15966558ed 100644 --- a/gcc/ira.cc +++ b/gcc/ira.cc @@ -4233,12 +4233,14 @@ setup_reg_equiv (void) && REGNO (SET_SRC (set)) == (unsigned int) i); x = SET_DEST (set); } - if (! function_invariant_p (x) + /* If PIC is enabled and the equiv is not a LEGITIMATE_PIC_OPERAND, + we can't use it. */ + if (! CONSTANT_P (x) || ! flag_pic /* A function invariant is often CONSTANT_P but may include a register. We promise to only pass CONSTANT_P objects to LEGITIMATE_PIC_OPERAND_P. */ - || (CONSTANT_P (x) && LEGITIMATE_PIC_OPERAND_P (x))) + || LEGITIMATE_PIC_OPERAND_P (x)) { /* It can happen that a REG_EQUIV note contains a MEM that is not a legitimate memory operand. As later