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.

Reply via email to