https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116374
Michael Matz <matz at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |matz at gcc dot gnu.org --- Comment #1 from Michael Matz <matz at gcc dot gnu.org> --- Try the below. m68k has the property that sometimes the initial elimination offset between %sp and argptr is zero. But zero is also the initialization value of the elimation table offsets, and it's _changes_ in those offsets that trigger various state tracking. And if the initial "change" is ignored everything goes downhill from there: in the first_p lra_eliminate() pass insns_with_changed_offsets will remain empty because "nothing changed", and hence the initial setup via process_insn_for_elimination() (with first_p==true) is never carried out. I guess also -1 is not a very good value (though probably acceptable for all targets with stack-downwards or wordsize!=1) and should rather be replaced with some proper "this is the first init" flag. But ... well. Hack. diff --git a/gcc/lra-eliminations.cc b/gcc/lra-eliminations.cc index 5bed259cffe..86741aa5a92 100644 --- a/gcc/lra-eliminations.cc +++ b/gcc/lra-eliminations.cc @@ -1283,7 +1283,7 @@ init_elim_table (void) for (ep = reg_eliminate, ep1 = reg_eliminate_1; ep < ®_eliminate[NUM_ELIMINABLE_REGS]; ep++, ep1++) { - ep->offset = ep->previous_offset = 0; + ep->offset = ep->previous_offset = -1; ep->from = ep1->from; ep->to = ep1->to; value_p = (targetm.can_eliminate (ep->from, ep->to)