https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116321

            Bug ID: 116321
           Summary: [lra][avr] internal compiler error: in
                    avr_out_lpm_no_lpmx, at config/avr/avr.cc:4572
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: rtl-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: gjl at gcc dot gnu.org
  Target Milestone: ---

typedef __UINT64_TYPE__ uint64_t;

uint64_t fun64 (const __flash uint64_t *p)
{
  return *p;
}

runs into an ICE:

$ avr-gcc lra-bug.c -S -Os -da -mlra
during RTL pass: shorten
dump file: lra-bug.c.354r.shorten
lra-bug.c: In function 'fun64':
lra-bug.c:6:1: internal compiler error: in avr_out_lpm_no_lpmx, at
config/avr/avr.cc:4572
    6 | }
      | ^

The respective line in avr.cc reads:

      gcc_assert (REG_Z == REGNO (addr));

because the only addressing modes for AS1 __flash are REG and POST_INC of REG_Z
(reg:HI 30).  However, the insn fed into the function as produced by LRA is
like found in lra-bug.c.317r.reload:

(insn 48 47 49 2 (set (reg:QI 25 r25 [+7 ])
        (mem:QI (reg/f:HI 28 r28 [60]) [1 *p_2(D)+7 S1 A8 AS1]))
"lra-bug.c":6:1 86 {movqi_insn_split}
     (nil))

This insn clearly violates avr.cc's REGNO_MODE_CODE_OK_FOR_BASE_P which only
allows REG_Z (regno 30) as register for non-generic address-spaces like AS1.
And avr.cc'c MODE_CODE_BASE_REG_CLASS has:

  if (!ADDR_SPACE_GENERIC_P (as))
    {
      return POINTER_Z_REGS;
    }

but reg:HI 28 in insn 48 is not an element of POINTER_Z_REGS.


Target: avr
Configured with: ../../source/gcc-master/configure --target=avr --disable-nls
--with-dwarf2 --with-gnu-as --with-gnu-ld --disable-shared
--with-long-double=64 --enable-languages=c,c++

Reply via email to