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'

Reply via email to