On Wed, 2012-09-05 at 08:15 +0200, Jakub Jelinek wrote:
> On Fri, Aug 31, 2012 at 10:58:51AM -0700, Steve Ellcey  wrote:
> > Here is my patch to fix the bootstrap comparision failure (PR 54128) on
> > MIPS.  The reason for the comparision failure was a difference in
> > register usage and I tracked it down to build_insn_chain which checked
> > all instructions for register usage in order to set the dead_or_set
> > and live_relevant_regs bitmaps instead of checking only non-debug
> > instructions.  Changing INSN_P to NONDEBUG_INSN_P in build_insn_chain
> > allowed me to bootstrap and caused no regressions.
> 
> The debug insns generally shouldn't extend the lifetime of pseudos (see the
> valtrack.c stuff), so if you hit this, there is probably some earlier bug
> that didn't reset/adjust the debug insns in question.
> I'm not saying the ira.c patch is absolutely a bad idea, but it would be
> good if you could investigate where those debug insns started extending
> lifetime of pseudos.
> 
> > 2012-08-31  Steve Ellcey  <sell...@mips.com>
> > 
> >     PR bootstrap/54128
> >     * ira.c (build_insn_chain): Check only NONDEBUG instructions for
> >     register usage.
> 
>       Jakub

I think I know where this may be going wrong, though I am having trouble
actually creating a patch.  I think MIPS should define
TARGET_DELAY_VARTRACK and call variable_tracking_main from mips_reorg.

The systems that define TARGET_DELAY_VARTRACK all have this comment:

/* Variable tracking should be run after all optimizations which
   change order of insns.  It also needs a valid CFG.  */
#undef TARGET_DELAY_VARTRACK
#define TARGET_DELAY_VARTRACK true

And I think mips_reorg could change the order of insns.  I have tried
putting a call to variable_tracking_main in mips_df_reorg (and changed
mips_cfg_in_reorg to return true if flag_var_tracking is true but that
didn't fix the problem.  I thought this might be because some of the
mips_reorg code that comes after mips_df_reorg is still changing
insn ordering.  I tried putting a call to variable_tracking_main at the
end of mips_reorg:

  if (flag_var_tracking)
    {
      compute_bb_for_insn ();
      df_analyze ();
      timevar_push (TV_VAR_TRACKING);
      variable_tracking_main ();
      timevar_pop (TV_VAR_TRACKING);
      df_finish_pass (false);
      free_bb_for_insn ();
    }

But I just get a seg fault in compute_bb_for_insn, If I remove
that (and free_bb_for_insn) I get a segfault in df_analyze.  I
am not sure exactly what I need to set up to call variable_tracking_main
at this point in the code.  Is there something else I need to call to
ensure that I have a valid control flow graph?  I don't see other
platforms that call variable_tracking_main from their reorg routines
doing anything else.

Steve Ellcey
sell...@mips.com

Reply via email to