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