On 09/09/2016 09:51 AM, Segher Boessenkool wrote:
On Thu, Sep 08, 2016 at 11:50:56AM -0600, Jeff Law wrote:
On 07/31/2016 07:42 PM, Segher Boessenkool wrote:
Deleting restores (before a noreturn) that are dead confuses dwarf2cfi.

2016-06-07  Segher Boessenkool  <seg...@kernel.crashing.org>

        * dce.c (delete_unmarked_insns): Don't delete instructions with
        a REG_CFA_RESTORE note.
I don't really understand this one.  Why is the restore marked dead and
why doesn't that happen for normal epilogues?  Something wonky seems to
be going on here.

Because it's not behind a NOTE_INSN_EPILOGUE_BEGIN it is not treated
specially by DCE, like insns in "normal" epilogues are.
Ohhhhh! While I don't see the special handling of things after NOTE_INSN_EPILOGUE_BEG, I do see this in df-scan.c:

  if (targetm.have_epilogue () && epilogue_completed)
    {
      /* Mark all call-saved registers that we actually used.  */
      for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
        if (df_regs_ever_live_p (i) && !LOCAL_REGNO (i)
            && !TEST_HARD_REG_BIT (regs_invalidated_by_call, i))
          bitmap_set_bit (exit_block_uses, i);
    }

Which then presumably gets used elsewhere when solving problems.

I wonder if we need some kind of similar mechanism to make those registers appear to be live at the component epilogues.

Jeff


Reply via email to