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.