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.

        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

Reply via email to