From: Alexandre Oliva Date: Fri, 19 Sep 2025 19:45:19 +0000 (-0300) Subject: [ira] avoid resetting ira_reg_equiv for function invariants X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=12992edaa96897d4ce26c3d48fa19c142b0aef28;p=thirdparty%2Fgcc.git [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 --git a/gcc/ira.cc b/gcc/ira.cc index 4eebc9c4c50..3e15966558e 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