The following simplifies SLP scheduling insert iteration computation.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

        * tree-vect-slp.cc (vect_schedule_slp_node): Simplify scheduling.
---
 gcc/tree-vect-slp.cc | 47 +++++++++++++++++++++-----------------------
 1 file changed, 22 insertions(+), 25 deletions(-)

diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index 7cb0c749fa3..9e9325f6c64 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -11906,7 +11906,6 @@ vect_schedule_slp_node (vec_info *vinfo,
       /* Emit other stmts after the children vectorized defs which is
         earliest possible.  */
       gimple *last_stmt = NULL;
-      bool seen_vector_def = false;
       FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), i, child)
        if (SLP_TREE_DEF_TYPE (child) == vect_internal_def)
          {
@@ -11976,7 +11975,7 @@ vect_schedule_slp_node (vec_info *vinfo,
               we do not insert before the region boundary.  */
            if (SLP_TREE_SCALAR_OPS (child).is_empty ()
                && !vinfo->lookup_def (SLP_TREE_VEC_DEFS (child)[0]))
-             seen_vector_def = true;
+             ;
            else
              {
                unsigned j;
@@ -11997,26 +11996,17 @@ vect_schedule_slp_node (vec_info *vinfo,
                    }
              }
          }
-      /* This can happen when all children are pre-existing vectors or
-        constants.  */
-      if (!last_stmt)
-       last_stmt = vect_find_first_scalar_stmt_in_slp (node)->stmt;
-      if (!last_stmt)
-       {
-         gcc_assert (seen_vector_def);
-         si = gsi_after_labels (vinfo->bbs[0]);
-       }
-      else if (is_ctrl_altering_stmt (last_stmt))
-       {
-         /* We split regions to vectorize at control altering stmts
-            with a definition so this must be an external which
-            we can insert at the start of the region.  */
-         si = gsi_after_labels (vinfo->bbs[0]);
-       }
-      else if (is_a <bb_vec_info> (vinfo)
-              && !SLP_TREE_PERMUTE_P (node)
-              && gimple_bb (last_stmt) != gimple_bb (stmt_info->stmt)
-              && gimple_could_trap_p (stmt_info->stmt))
+
+      /* We split regions to vectorize at control altering stmts
+        with a definition so this can only be an external.  */
+      gcc_checking_assert (!last_stmt
+                          || !is_ctrl_altering_stmt (last_stmt));
+
+      if (is_a <bb_vec_info> (vinfo)
+         && !SLP_TREE_PERMUTE_P (node)
+         && (!last_stmt
+             || gimple_bb (last_stmt) != gimple_bb (stmt_info->stmt))
+         && gimple_could_trap_p (stmt_info->stmt))
        {
          /* We've constrained possibly trapping operations to all come
             from the same basic-block, if vectorized defs would allow earlier
@@ -12024,16 +12014,23 @@ vect_schedule_slp_node (vec_info *vinfo,
             This is only necessary for BB vectorization since for loop vect
             all operations are in a single BB and scalar stmt based
             placement doesn't play well with epilogue vectorization.  */
-         gcc_assert (dominated_by_p (CDI_DOMINATORS,
-                                     gimple_bb (stmt_info->stmt),
-                                     gimple_bb (last_stmt)));
+         gcc_assert (!last_stmt
+                     || dominated_by_p (CDI_DOMINATORS,
+                                        gimple_bb (stmt_info->stmt),
+                                        gimple_bb (last_stmt)));
          si = gsi_after_labels (gimple_bb (stmt_info->stmt));
        }
+      /* When there is no in-region child def to guide placement, insert
+        at region boundary.  */
+      else if (!last_stmt)
+       si = gsi_after_labels (vinfo->bbs[0]);
       else if (is_a <gphi *> (last_stmt))
        si = gsi_after_labels (gimple_bb (last_stmt));
       else
        {
          si = gsi_for_stmt (last_stmt);
+         /* We use gsi_insert_before, so when last_stmt is a vector
+            def we have to advance (or use gsi_insert_after).  */
          gsi_next (&si);
 
          if (auto loop_vinfo = dyn_cast <loop_vec_info> (vinfo))
-- 
2.51.0

Reply via email to