On Fri, Aug 16, 2019 at 10:50:13AM -0400, Vladimir Makarov wrote: No I meant something like that (define_special_memory_constraint "a" ...) (define_predicate "my_special_predicate" ... { if (lra_in_progress_p) return REG_P (op) && REGNO (op) >= FIRST_PSEUDO_REGISTER && reg_renumber[REGNO(op)] < 0; return true if memory with sp addressing; }) I think LRA spills pseudo-register and it will be memory addressed by sp at the end of LRA.
What I've done is this: (define_predicate "my_special_predicate" (match_operand 0 "memory_operand") { debug_rtx (op); gcc_assert (MEM_P (op)); op = XEXP (op, 0); if (GET_CODE (op) == PLUS) op = XEXP (op, 0); if (lra_in_progress) { fprintf (stderr, "%s:%d\n", __FILE__, __LINE__); return REG_P (op) && REGNO (op) >= FIRST_PSEUDO_REGISTER && reg_renumber[REGNO(op)] < 0; } if (REG_P (op)) { int regno = REGNO (op); return (regno == 10); // register is the stack pointer } return true; }) (and many variations) Unfortunately, any moderately complicated input still results in a (mem (reg) ) insn repeatedly entering the lra_in_progress case and returning false, and eventually terminating with "internal compiler error: maximum number of generated reload insns per insn achieved (90)" Any other ideas? J'