https://gcc.gnu.org/g:f8796015aa884d0310bf4252bdf844f6d1a27f52

commit f8796015aa884d0310bf4252bdf844f6d1a27f52
Author: Alexandre Oliva <ol...@adacore.com>
Date:   Sun Jun 22 16:19:51 2025 -0300

    [lra] apply elimination offsets to MEM in autoinc address [PR120424]
    
    When attempting to bootstrap arm-linux-gnueabihf with
    {BOOT_C,T}FLAGS='-g -O2 -fnon-call-exceptions
    -fstack-clash-protection', gmp fails to build in stage2: gen-fac's
    mpz_and gets miscompiled.
    
    A pseudo is initialized before a loop and used in a PRE_INC load
    inside a loop.  It gets spilled just as the fp2sp elimination is
    disabled, and only the initialization gets adjusted with elimination
    offsets.  The unadjusted stack slot within the PRE_INC load ends up
    reloaded later, but only when the FP offset has already missed its
    chance to be adjusted.
    
    Arrange for lra_eliminate_regs_1 to adjust autoinc addresses that are
    MEMs themselves.
    
    
    for  gcc/ChangeLog
    
            PR rtl-optimization/120424
            * lra_eliminations.cc (lra_eliminate_regs_1): Adjust autoinc
            addresses that are MEMs.

Diff:
---
 gcc/lra-eliminations.cc | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/gcc/lra-eliminations.cc b/gcc/lra-eliminations.cc
index 5713a9680523..9cdd0c5ff53a 100644
--- a/gcc/lra-eliminations.cc
+++ b/gcc/lra-eliminations.cc
@@ -571,6 +571,9 @@ lra_eliminate_regs_1 (rtx_insn *insn, rtx x, machine_mode 
mem_mode,
     case POST_INC:
     case PRE_DEC:
     case POST_DEC:
+      /* Recurse to adjust elimination offsets in a spilled pseudo.  */
+      if (GET_CODE (XEXP (x, 0)) == MEM)
+       break;
       /* We do not support elimination of a register that is modified.
         elimination_effects has already make sure that this does not
         happen.  */
@@ -578,6 +581,9 @@ lra_eliminate_regs_1 (rtx_insn *insn, rtx x, machine_mode 
mem_mode,
 
     case PRE_MODIFY:
     case POST_MODIFY:
+      /* Recurse to adjust elimination offsets in a spilled pseudo.  */
+      if (GET_CODE (XEXP (x, 0)) == MEM)
+       break;
       /* We do not support elimination of a hard register that is
         modified.  LRA has already make sure that this does not
         happen. The only remaining case we need to consider here is

Reply via email to