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
