https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113933
--- Comment #24 from John David Anglin <danglin at gcc dot gnu.org> ---
There are a couple of issues. The pa backend only supports memory
accesses that load to a register or store from a register. LRA was
creating insns like the following:
(insn 387 386 35 2 (set (subreg:SI (reg/v:OI 132 [ e ]) 28)
(subreg:SI (reg/v:OI 452 [orig:132 e ] [132]) 28))
"/home/dave/gnu/gcc/gcc/gcc/testsuite/gcc.c-torture/compile/pr92618.c":18:15 42
{*pa.md:2195}
(nil))
LRA can not handle spill for reg/v:OI 132.
The code in pa_emit_move_sequence to handle subreg spills doesn't
work with LRA.
if (scratch_reg
&& reload_in_progress
&& GET_CODE (operand0) == REG
&& REGNO (operand0) >= FIRST_PSEUDO_REGISTER)
operand0 = reg_equiv_mem (REGNO (operand0));
else if (scratch_reg
&& reload_in_progress
&& GET_CODE (operand0) == SUBREG
&& GET_CODE (SUBREG_REG (operand0)) == REG
&& REGNO (SUBREG_REG (operand0)) >= FIRST_PSEUDO_REGISTER)
{
/* We must not alter SUBREG_BYTE (operand0) since that would confuse
the code which tracks sets/uses for delete_output_reload. */
rtx temp = gen_rtx_SUBREG (GET_MODE (operand0),
reg_equiv_mem (REGNO (SUBREG_REG (operand0))),
SUBREG_BYTE (operand0));
operand0 = alter_subreg (&temp, true);
}
As far as I can tell, reg_equiv_mem always return NULL_RTX when LRA
is used. Thus, LRA has to handle spills itself.
There doesn't seem to be any good reason to allow register modes that
aren't supported in pa.md. I debated whether to allow complex 16-byte
modes in the general registers. There's one test that fails if I disallow
16-byte modes in the general registers. It uses an asm to load a complex
long long value to a register. It is xfailed on a number of targets
because they don't have enough registers.