While debugging the PR84264 ICE caused by the following test case:

  void _setjmp ();
  void a (unsigned long *);
  void
  b ()
  {
    for (;;)
      {
        _setjmp ();
        unsigned long args[9]{};
        a (args);
      }
  }

I noticed that IRA is spilling all pseudos that are live across the call
to setjmp.  Why is that?  Trying to look through the history of this, I see
Jim committed a patch to reload that removed it spilling everything across
all setjmps:

  https://gcc.gnu.org/ml/gcc-patches/2003-11/msg01667.html

But currently ira-lives.c:process_bb_node_lives() has:

  /* Don't allocate allocnos that cross setjmps or any
     call, if this function receives a nonlocal
     goto.  */
  if (cfun->has_nonlocal_label
      || find_reg_note (insn, REG_SETJMP,
                        NULL_RTX) != NULL_RTX)
    {
      SET_HARD_REG_SET (OBJECT_CONFLICT_HARD_REGS (obj));
      SET_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj));
    }

...which forces us to spill everything live across the setjmp by forcing
the pseudos to interfere all hardregs.  That can't be good for performance.
What am I missing?

Peter


Reply via email to