On 10/13/25 2:46 AM, Stefan Schulze Frielinghaus wrote:
From: Stefan Schulze Frielinghaus <[email protected]>

Currently the register class derived from a hard register constraint is
solely determined from a single register.  This even works for register
pairs if all the required registers are contained in this very register
class and falls apart if not.  For example:

long
test (void)
{
   long x;
   __asm__ ("..." : "={r22}" (x));
   return x;
}

For AVR -mmcu=atmega8, variable `x` requires a register quadruple and
the minimal class for single register r22 is SIMPLE_LD_REGS which itself
entails registers r16 up to r23.  However, variable `x` is bound to
registers r22 up to r25.  Thus, the minimal class containing those is
LD_REGS.  Therefore, compute the least upper bound of all register
classes over all required registers.

        PR 121198

gcc/ChangeLog:

        * lra-constraints.cc (process_alt_operands): Compute least upper
        bound of all register classes over all required registers in
        order to determine register class for a hard register constraint.

gcc/testsuite/ChangeLog:

        * gcc.target/avr/pr121198.c: New test.
---
  Bootstrapped and regtested on s390 and x86_64.  Verified via a cross
  compiler testsuite/gcc.target/avr/pr121198.c.  Ok for mainline?
OK
jeff

Reply via email to