On 12/6/23 15:03, DJ Delorie wrote:
Alexandre Oliva <ol...@gnu.org> writes:
This looks like a latent bug in the port.
I'm not surprised, that port was weird.
This was just a plain asm insn in strub.c:
/* Make sure the stack overwrites are not optimized away. */
asm ("" : : "m" (end[0]));
whose constraint passes during reload, rl78_alloc_physical_registers
leaves it alone and clears virt_insns_ok, so when cprog_hardreg attempts
to extract constraints again, rl78_as_legitimate_address rejects r8 as
the address because virt insns are no longer ok.
Some background: the "virtual" registers are memory-mapped registers
that use a common addressing scheme to access non-mapped registers.
When we convert from virtual to physical, we can map that reg to a
physical reg, or we replace the reg with a mem, but then usually have to
split up the insn.
For this insn, "converting" should have mapped or reloaded r8 to a valid
address register. I doubt we have a way to have two patterns for user
asms like we do for, say, addhi3.
Given we don't know the semantics of what goes on inside the MEM I think
rewriting would be extraordinarily difficult. Ultimately all this feels
like a limited reload pass implemented in the rl78 backend. You'd have
to look at all the operands, potentially spill one or more values,
arrange for input/output reloads, deal with clobbers (particularly
reloading the address given (clobber (mem (addr))).
I suspect that something in the virt->phys logic just doesn't know how
to check for mem constraints in user asms.
I looked briefly, it appears the code just punts rewriting all user
asms, but maybe I missed something.
I wouldn't lose any sleep if we had a way to simply disable strub for rl78.
Jeff