On Wed, Jul 9, 2025 at 4:05 PM Richard Sandiford <richard.sandif...@arm.com> wrote: > > While working on a new testcase that uses the RTL frontend, > I hit a bug where a (reg ...) that spans multiple hard registers > had REG_NREGS set to 1. This caused various things to misbehave. > For example, if the (reg ...) in question was used as crtl->return_rtx, > only the first register in the group would be marked as live on exit. > > Tested on aarch64-linux-gnu and aarch64_be-elf. OK to install?
OK. > Richard > > > gcc/ > * read-rtl-function.cc (function_reader::read_rtx_operand_r): Use > hard_regno_nregs to work out REG_NREGS for hard registers. > --- > gcc/read-rtl-function.cc | 5 ++++- > 1 file changed, 4 insertions(+), 1 deletion(-) > > diff --git a/gcc/read-rtl-function.cc b/gcc/read-rtl-function.cc > index fb9c9554ea3..1f08c50cc12 100644 > --- a/gcc/read-rtl-function.cc > +++ b/gcc/read-rtl-function.cc > @@ -1065,7 +1065,10 @@ function_reader::read_rtx_operand_r (rtx x) > if (regno == -1) > fatal_at (loc, "unrecognized register: '%s'", name.string); > > - set_regno_raw (x, regno, 1); > + int nregs = 1; > + if (HARD_REGISTER_NUM_P (regno)) > + nregs = hard_regno_nregs (regno, GET_MODE (x)); > + set_regno_raw (x, regno, nregs); > > /* Consolidate singletons. */ > x = consolidate_singletons (x); > -- > 2.43.0 >