Alexandre Oliva <ol...@adacore.com> writes: > On Jun 6, 2025, Alexandre Oliva <ol...@adacore.com> wrote: > >> Now, since lra_update_fp2sp_elimination checks that >> !elimination_fp2sp_occured_p, we *could* disable the fp2sp elimination, >> if it's selected, right away, so that it is not applied after we've >> disabled it, and then we don't have to worry about disabling it half-way >> or reversing it later. > > [lra] inactivate disabled fp2sp elimination > > Even after we disable the fp2sp elimination when it is the active > elimination for the fp, spilling might use it before > update_reg_eliminate runs and inactivates it for good. If it is used, > update_reg_eliminate will fail the check that fp2sp was not used. > > Since we keep track of uses of this specific elimination, and > lra_update_fp2sp_elimination checks it before disabling it, we know it > hasn't been used, so we can inactivate it without any ill effects. > > This fixes the pr118591-1.c avr-none regression exposed by the > PR120424 fix. > > Regstrapped on x86_64-linux-gnu. Also testing with gcc-14 on > arm-vx7r2. Ok to install? > > > for gcc/ChangeLog > > * lra-eliminations.cc (lra_update_fp2sp_elimination): > Inactivate the unused fp2sp elimination right away.
Thank you. The patch fixes PR118591. Denis > --- > gcc/lra-eliminations.cc | 15 ++++++++++++--- > 1 file changed, 12 insertions(+), 3 deletions(-) > > diff --git a/gcc/lra-eliminations.cc b/gcc/lra-eliminations.cc > index bb708b007a4ee..6c8c91086f323 100644 > --- a/gcc/lra-eliminations.cc > +++ b/gcc/lra-eliminations.cc > @@ -1415,6 +1415,14 @@ lra_update_fp2sp_elimination (int *spilled_pseudos) > if (frame_pointer_needed || !targetm.frame_pointer_required ()) > return 0; > gcc_assert (!elimination_fp2sp_occured_p); > + ep = elimination_map[FRAME_POINTER_REGNUM]; > + if (ep->to == STACK_POINTER_REGNUM) > + { > + elimination_map[FRAME_POINTER_REGNUM] = NULL; > + setup_can_eliminate (ep, false); > + } > + else > + ep = NULL; > if (lra_dump_file != NULL) > fprintf (lra_dump_file, > " Frame pointer can not be eliminated anymore\n"); > @@ -1422,9 +1430,10 @@ lra_update_fp2sp_elimination (int *spilled_pseudos) > CLEAR_HARD_REG_SET (set); > add_to_hard_reg_set (&set, Pmode, HARD_FRAME_POINTER_REGNUM); > n = spill_pseudos (set, spilled_pseudos); > - for (ep = reg_eliminate; ep < ®_eliminate[NUM_ELIMINABLE_REGS]; ep++) > - if (ep->from == FRAME_POINTER_REGNUM && ep->to == STACK_POINTER_REGNUM) > - setup_can_eliminate (ep, false); > + if (!ep) > + for (ep = reg_eliminate; ep < ®_eliminate[NUM_ELIMINABLE_REGS]; ep++) > + if (ep->from == FRAME_POINTER_REGNUM && ep->to == STACK_POINTER_REGNUM) > + setup_can_eliminate (ep, false); > return n; > }