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

--- Comment #16 from Jim Wilson <wilson at gcc dot gnu.org> ---
(In reply to rguent...@suse.de from comment #15)
> I still don't understand. The rtx are not relocated. The only thing is the
> address of the slot of the regno to rtx map.

I have a debug session in comment 6 that shows that this address is changing. 
But maybe what you are missing here is how combine changes registers modes.  It
uses a call like this
                  SUBST_MODE (regno_reg_rtx[REGNO (i2dest)], split_mode);
and this macro is defined as
#define SUBST_MODE(INTO, NEWVAL)  do_SUBST_MODE (&(INTO), (NEWVAL))
so we are saving an address in the regno_reg_rtx array.

I don't know exactly why it works this way, and I don't care, because I don't
think that fixing this is the right solution for the RISC-V port.  I think the
RISC-V port should stop calling gen_reg_rtx inside splitters.

The patch where this code appeared suggests that it was a rare hard to
reproduce bug that required this fix.
https://gcc.gnu.org/ml/gcc-patches/2006-01/msg00477.html
Maybe SUBST_MODE was just blindly copied from SUBST_INT, and it was missed that
it might work without the & in this case.  This may also depend on how exactly
SUBST_MODE is used, but currently it is only used for regs, which are supposed
to be unique, so dropping the & may work.  This may not work if SUBST_MODE gets
used for otherwise, but currently it isn't.

Reply via email to