This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Special Memory Constraint [was Re: Indirect memory addresses vs. lra]


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'


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]