On Wed, Nov 01, 2017 at 02:32:02PM +0100, Eric Botcazou wrote:
> > 2017-10-31  Jakub Jelinek  <ja...@redhat.com>
> > 
> >     PR rtl-optimization/82778
> >     PR rtl-optimization/82597
> >     * compare-elim.c (struct comparison): Add in_a_setter field.
> >     (find_comparison_dom_walker::before_dom_children): Remove killed
> >     bitmap and df_simulate_find_defs call, instead walk the defs.
> >     Compute last_setter and initialize in_a_setter.  Merge definitions
> >     with first initialization for a few variables.
> >     (try_validate_parallel): Use insn_invalid_p instead of
> >     recog_memoized.  Return insn rather than just the pattern.
> >     (try_merge_compare): Fix up comment.  Don't uselessly test if
> >     in_a is a REG_P.  Use cmp->in_a_setter instead of walking UD
> >     chains.
> > 
> >     * g++.dg/opt/pr82778.C: New test.
> > 
> > 2017-10-31  Michael Collison  <michael.colli...@arm.com>
> > 
> >     PR rtl-optimization/82597
> >     * gcc.dg/pr82597.c: New test.
> 
> That's a clear progress, but the patch doesn't fully get rid of use-def and 
> def-use chains, does it?

I believe it does fully get rid of use-def and def-use chains in
compare-elim.c.  The DU and UD chains are still in ree.c and haifa-sched.c
and UD chains only in dce.c, loop-invariant.c, loop-iv.c and web.c.

At least, the only spot that used to mention df_link in compare-elim.c was:
  struct df_link *ref_chain;
  ref_chain = DF_REF_CHAIN (use);
  if (!ref_chain || !ref_chain->ref
      || !DF_REF_INSN_INFO (ref_chain->ref) || ref_chain->next != NULL)
    return false;

  rtx_insn *def_insn = DF_REF_INSN (ref_chain->ref);
and
  df_chain_add_problem (DF_UD_CHAIN + DF_DU_CHAIN);
that ensured it is computed, but the former is replaced with the patch by
  rtx_insn *def_insn = cmp->in_a_setter;
which is computed during the bb walking using the last_setter array
and the latter is dropped.

        Jakub

Reply via email to