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.

Reply via email to