https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90007
--- Comment #11 from Vladimir Makarov <vmakarov at gcc dot gnu.org> --- (In reply to Alexander Monakov from comment #4) > Well, often sel-sched just does not discriminate hardregs and pseudos when > checking if renaming/substitution may be applied. Sure, as a matter of > efficiency we should probably disallow substitution through such mixed > pseudo=hardreg assignments. > > Nevertheless, if it's not only a matter of optimization, but also of > internal consistency, then I'd like to understand it better. Hence the > question in comment #2. Alexander, it is a legitimate question. LRA changed actively during many years and LRA now can reload hard register as pseudo register into memory. Unfortunately, recog.c was not adapted to these changes. I think the following patch will reflect the LRA changes: Index: recog.c =================================================================== --- recog.c (revision 278413) +++ recog.c (working copy) @@ -2757,10 +2757,9 @@ constrain_operands (int strict, alternat /* Before reload, accept what reload can turn into a mem. */ || (strict < 0 && CONSTANT_P (op)) - /* Before reload, accept a pseudo, + /* Before reload, accept a pseudo or hard register, since LRA can turn it into a mem. */ - || (strict < 0 && targetm.lra_p () && REG_P (op) - && REGNO (op) >= FIRST_PSEUDO_REGISTER) + || (strict < 0 && targetm.lra_p () && REG_P (op)) /* During reload, accept a pseudo */ || (reload_in_progress && REG_P (op) && REGNO (op) >= FIRST_PSEUDO_REGISTER))) I've checked the patch. It solves the problem. I'll submit it for approval after testing, probably tomorrow.