On Fri, 3 May 2019, Richard Biener wrote: > > I am testing the following patch to remove the code determining > the target virtual operand to walk to and instead compute it > based on the immediate dominator which we will reach anyways > (or a dominating block) during maybe_skip_until. > > More simplifying might be possible but I'm trying to keep the > patch small and suitable for backporting up to the GCC 8 branch > where this regressed. > > Note this will handle even more CFG shapes now and seems to > expose some uninit warnings in dwarf2out.c (at least).
I can't seem to find an initializer that would "trap" on use so I'm going to do Index: gcc/dwarf2out.c =================================================================== --- gcc/dwarf2out.c (revision 270849) +++ gcc/dwarf2out.c (working copy) @@ -15461,7 +15461,7 @@ mem_loc_descriptor (rtx rtl, machine_mod if (mode != GET_MODE (rtl) && GET_MODE (rtl) != VOIDmode) return NULL; - scalar_int_mode int_mode, inner_mode, op1_mode; + scalar_int_mode int_mode = SImode, inner_mode, op1_mode; switch (GET_CODE (rtl)) { case POST_INC: unless somebody comes up with something clever over the weekend... Richard. > Bootstrap & regtest running on x86_64-unknown-linux-gnu. > > Richard. > > 2019-05-03 Richard Biener <rguent...@suse.de> > > PR tree-optimization/90316 > * tree-ssa-alias.c (maybe_skip_until): Pass in target BB, > compute target on demand. > (get_continuation_for_phi): Remove code walking stmts to > get to a target virtual operand which could end up being > quadratic. > > Index: gcc/tree-ssa-alias.c > =================================================================== > --- gcc/tree-ssa-alias.c (revision 270847) > +++ gcc/tree-ssa-alias.c (working copy) > @@ -2598,8 +2598,8 @@ stmt_kills_ref_p (gimple *stmt, tree ref > case false is returned. The walk starts with VUSE, one argument of PHI. > */ > > static bool > -maybe_skip_until (gimple *phi, tree target, ao_ref *ref, > - tree vuse, unsigned int *cnt, bitmap *visited, > +maybe_skip_until (gimple *phi, tree &target, basic_block target_bb, > + ao_ref *ref, tree vuse, unsigned int *cnt, bitmap *visited, > bool abort_on_visited, > void *(*translate)(ao_ref *, tree, void *, bool *), > void *data) > @@ -2615,6 +2615,19 @@ maybe_skip_until (gimple *phi, tree targ > while (vuse != target) > { > gimple *def_stmt = SSA_NAME_DEF_STMT (vuse); > + /* If we are searching for the target VUSE by walking up to > + TARGET_BB dominating the original PHI we are finished once > + we reach a default def or a definition in a block dominating > + that block. Update TARGET and return. */ > + if (!target > + && (gimple_nop_p (def_stmt) > + || dominated_by_p (CDI_DOMINATORS, > + target_bb, gimple_bb (def_stmt)))) > + { > + target = vuse; > + return true; > + } > + > /* Recurse for PHI nodes. */ > if (gimple_code (def_stmt) == GIMPLE_PHI) > { > @@ -2698,49 +2711,17 @@ get_continuation_for_phi (gimple *phi, a > arg0 = NULL_TREE; > } > /* If not, look if we can reach such candidate by walking defs > - of a PHI arg without crossing other PHIs. */ > - if (! arg0) > - for (i = 0; i < nargs; ++i) > - { > - arg0 = PHI_ARG_DEF (phi, i); > - gimple *def = SSA_NAME_DEF_STMT (arg0); > - /* Backedges can't work. */ > - if (dominated_by_p (CDI_DOMINATORS, > - gimple_bb (def), phi_bb)) > - continue; > - /* See below. */ > - if (gimple_code (def) == GIMPLE_PHI) > - continue; > - while (! dominated_by_p (CDI_DOMINATORS, > - phi_bb, gimple_bb (def))) > - { > - arg0 = gimple_vuse (def); > - if (SSA_NAME_IS_DEFAULT_DEF (arg0)) > - break; > - def = SSA_NAME_DEF_STMT (arg0); > - if (gimple_code (def) == GIMPLE_PHI) > - { > - /* Do not try to look through arbitrarily complicated > - CFGs. For those looking for the first VUSE starting > - from the end of the immediate dominator of phi_bb > - is likely faster. */ > - arg0 = NULL_TREE; > - goto next; > - } > - } > - break; > -next:; > - } > - if (! arg0) > - return NULL_TREE; > + until we hit the immediate dominator. maybe_skip_until will > + do that for us. */ > + basic_block dom = get_immediate_dominator (CDI_DOMINATORS, phi_bb); > > - /* Then check against the found candidate. */ > + /* Then check against the (to be) found candidate. */ > for (i = 0; i < nargs; ++i) > { > arg1 = PHI_ARG_DEF (phi, i); > if (arg1 == arg0) > ; > - else if (! maybe_skip_until (phi, arg0, ref, arg1, cnt, visited, > + else if (! maybe_skip_until (phi, arg0, dom, ref, arg1, cnt, visited, > abort_on_visited, > /* Do not translate when walking over > backedges. */ > -- Richard Biener <rguent...@suse.de> SUSE Linux GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer, Mary Higgins, Sri Rasiah; HRB 21284 (AG Nürnberg)