https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116244
Jeffrey A. Law <law at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |ASSIGNED
--- Comment #2 from Jeffrey A. Law <law at gcc dot gnu.org> ---
Looks like another path using subreg_regno_offset without verifying it's
actually a subreg expression that can be simplified. Like the prior m68k bug
we have
(subreg:DI (reg:SI d0) 0)
So a paradoxical reference to register 0. This time it's reload calling
alter_subreg. alter_subreg calls subreg_regno which looks like:
/* Return the final regno that a subreg expression refers to. */
unsigned int
subreg_regno (const_rtx x)
{
unsigned int ret;
rtx subreg = SUBREG_REG (x);
int regno = REGNO (subreg);
ret = regno + subreg_regno_offset (regno,
GET_MODE (subreg),
SUBREG_BYTE (x),
GET_MODE (x));
return ret;
}
Which is going to return -1 for the case above. So we install -1 as the
register number and all hell breaks loose after that.
I think the sensible thing to do with a subreg we're not going to simplify is
to just return the original register #. But I need to put that through the
testsuite on a few targets to ensure no fallout. subreg_regno isn't a heavily
used API thankfully.