https://gcc.gnu.org/bugzilla/show_bug.cgi?id=121198
--- Comment #3 from Stefan Schulze Frielinghaus <stefansf at gcc dot gnu.org>
---
During constraint processing we have
7: {r45:SI=asm_operands;clobber cc:CC;}
REG_DEAD r47:HI
REG_UNUSED cc:CC
Alt 0: (0) ={r22} (1) {r22}
Final costs after insn 7 (freq=1000)
...
Creating newreg=49 from oldreg=45, assigning class SIMPLE_LD_REGS to r49
This is not satisfiable since for an SImode value we need four registers and
r24/r25 are not in SIMPLE_LD_REGS. The register class is determined via
REGNO_REG_CLASS(regno) which returns the smallest class containing REGNO which
is in this case SIMPLE_LD_REGS. This, does not guarantee that a register pair
fits.
Since we already select via a filter the hard register, we could set the class
to ALL_REGS. Could you give the following a try:
diff --git a/gcc/lra-constraints.cc b/gcc/lra-constraints.cc
index 83f8fda3b52..18298e14586 100644
--- a/gcc/lra-constraints.cc
+++ b/gcc/lra-constraints.cc
@@ -2551,7 +2551,7 @@ process_alt_operands (int only_alternative)
{
int regno = decode_hard_reg_constraint (p);
gcc_assert (regno >= 0);
- cl = REGNO_REG_CLASS (regno);
+ cl = ALL_REGS;
CLEAR_HARD_REG_SET (hard_reg_constraint);
SET_HARD_REG_BIT (hard_reg_constraint, regno);
cl_filter = &hard_reg_constraint;
It works for me in a cross compiler.