On Thu, Sep 26, 2024 at 5:11 PM Andrew Pinski <quic_apin...@quicinc.com> wrote: > > The ondemand maybe_undef that follows phis was added in > r7-6427-g8b670f93ab1136 > but then later ssa_name_maybe_undef_p/mark_ssa_maybe_undefs was added in > r13-972-gbe2861fe8c527a. This moves the ondemand one to use > mark_ssa_maybe_undefs/ssa_name_maybe_undef_p instead. Which itself will be > faster since the mark_ssa_maybe_undefs is a walk based on the uses of > undefined names (and only once) rather than a walk based on the def of > ones which are more likely defined (and on demand). > > Even though the ondemand maybe_undef had some extra special cases, those > won't make > a big difference in most code. > > Bootstrapped and tested on x86_64-linux-gnu.
OK. Thanks, Richard. > PR tree-optimization/116848 > > gcc/ChangeLog: > > * tree-ssa-loop-unswitch.cc (tree_ssa_unswitch_loops): Call > mark_ssa_maybe_undefs. > (is_maybe_undefined): Call ssa_name_maybe_undef_p instead of ondemand > undef. > > Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> > --- > gcc/tree-ssa-loop-unswitch.cc | 61 ++--------------------------------- > 1 file changed, 2 insertions(+), 59 deletions(-) > > diff --git a/gcc/tree-ssa-loop-unswitch.cc b/gcc/tree-ssa-loop-unswitch.cc > index 7601d91e807..847f7ac739f 100644 > --- a/gcc/tree-ssa-loop-unswitch.cc > +++ b/gcc/tree-ssa-loop-unswitch.cc > @@ -329,6 +329,7 @@ tree_ssa_unswitch_loops (function *fun) > bool changed_unswitch = false; > bool changed_hoist = false; > auto_edge_flag ignored_edge_flag (fun); > + mark_ssa_maybe_undefs (); > > ranger = enable_ranger (fun); > > @@ -427,65 +428,7 @@ is_maybe_undefined (const tree name, gimple *stmt, class > loop *loop) > if (gimple_bb (stmt) == loop->header) > return false; > > - auto_bitmap visited_ssa; > - auto_vec<tree> worklist; > - worklist.safe_push (name); > - bitmap_set_bit (visited_ssa, SSA_NAME_VERSION (name)); > - while (!worklist.is_empty ()) > - { > - tree t = worklist.pop (); > - > - /* If it's obviously undefined, avoid further computations. */ > - if (ssa_undefined_value_p (t, true)) > - return true; > - > - if (ssa_defined_default_def_p (t)) > - continue; > - > - gimple *def = SSA_NAME_DEF_STMT (t); > - > - /* Check that all the PHI args are fully defined. */ > - if (gphi *phi = dyn_cast <gphi *> (def)) > - { > - for (unsigned i = 0; i < gimple_phi_num_args (phi); ++i) > - { > - tree t = gimple_phi_arg_def (phi, i); > - /* If an SSA has already been seen, it may be a loop, > - but we can continue and ignore this use. Otherwise, > - add the SSA_NAME to the queue and visit it later. */ > - if (TREE_CODE (t) == SSA_NAME > - && bitmap_set_bit (visited_ssa, SSA_NAME_VERSION (t))) > - worklist.safe_push (t); > - } > - continue; > - } > - > - /* Uses in stmts always executed when the region header executes > - are fine. */ > - if (dominated_by_p (CDI_DOMINATORS, loop->header, gimple_bb (def))) > - continue; > - > - /* Handle calls and memory loads conservatively. */ > - if (!is_gimple_assign (def) > - || (gimple_assign_single_p (def) > - && gimple_vuse (def))) > - return true; > - > - /* Check that any SSA names used to define NAME are also fully > - defined. */ > - use_operand_p use_p; > - ssa_op_iter iter; > - FOR_EACH_SSA_USE_OPERAND (use_p, def, iter, SSA_OP_USE) > - { > - tree t = USE_FROM_PTR (use_p); > - /* If an SSA has already been seen, it may be a loop, > - but we can continue and ignore this use. Otherwise, > - add the SSA_NAME to the queue and visit it later. */ > - if (bitmap_set_bit (visited_ssa, SSA_NAME_VERSION (t))) > - worklist.safe_push (t); > - } > - } > - return false; > + return ssa_name_maybe_undef_p (name); > } > > /* Checks whether we can unswitch LOOP on condition at end of BB -- one of > its > -- > 2.34.1 >