https://gcc.gnu.org/g:bf864b450e8eff4e0fab30da2e6b69ee42d04e6f

commit r16-3310-gbf864b450e8eff4e0fab30da2e6b69ee42d04e6f
Author: Richard Biener <rguent...@suse.de>
Date:   Wed Aug 20 14:07:34 2025 +0200

    Merge BB and loop path in vect_analyze_stmt
    
    We have now common patterns for most of the vectorizable_* calls, so
    merge.  This also avoids calling vectorizable_early_exit for BB
    vect and clarifies signatures of it and vectorizable_phi.
    
            * tree-vectorizer.h (vectorizable_phi): Take bb_vec_info.
            (vectorizable_early_exit): Take loop_vec_info.
            * tree-vect-loop.cc (vectorizable_phi): Adjust.
            * tree-vect-slp.cc (vect_slp_analyze_operations): Likewise.
            (vectorize_slp_instance_root_stmt): Likewise.
            * tree-vect-stmts.cc (vectorizable_early_exit): Likewise.
            (vect_transform_stmt): Likewise.
            (vect_analyze_stmt): Merge the sequences of vectorizable_*
            where common.

Diff:
---
 gcc/tree-vect-loop.cc  |  2 +-
 gcc/tree-vect-slp.cc   |  6 ++--
 gcc/tree-vect-stmts.cc | 89 ++++++++++++++++++--------------------------------
 gcc/tree-vectorizer.h  |  4 +--
 4 files changed, 37 insertions(+), 64 deletions(-)

diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 91c3237e58b9..483b2e38816e 100644
--- a/gcc/tree-vect-loop.cc
+++ b/gcc/tree-vect-loop.cc
@@ -8627,7 +8627,7 @@ vect_transform_lc_phi (loop_vec_info loop_vinfo,
 /* Vectorizes PHIs.  */
 
 bool
-vectorizable_phi (vec_info *,
+vectorizable_phi (bb_vec_info,
                  stmt_vec_info stmt_info,
                  slp_tree slp_node, stmt_vector_for_cost *cost_vec)
 {
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index 2eac9d56522d..3081251eba8a 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -8689,7 +8689,7 @@ vect_slp_analyze_operations (vec_info *vinfo)
              && !vectorizable_bb_reduc_epilogue (instance, &cost_vec))
          /* Check we can vectorize the gcond.  */
          || (SLP_INSTANCE_KIND (instance) == slp_inst_kind_gcond
-             && !vectorizable_early_exit (vinfo,
+             && !vectorizable_early_exit (as_a <loop_vec_info> (vinfo),
                                           SLP_INSTANCE_ROOT_STMTS 
(instance)[0],
                                           NULL,
                                           SLP_INSTANCE_TREE (instance),
@@ -11721,8 +11721,8 @@ vectorize_slp_instance_root_stmt (vec_info *vinfo, 
slp_tree node, slp_instance i
       auto last_stmt = STMT_VINFO_STMT (vect_orig_stmt (root_stmt_info));
       gimple_stmt_iterator rgsi = gsi_for_stmt (last_stmt);
       gcc_assert (!SLP_TREE_VEC_DEFS (node).is_empty ());
-      bool res = vectorizable_early_exit (vinfo, root_stmt_info, &rgsi,
-                                         node, NULL);
+      bool res = vectorizable_early_exit (as_a <loop_vec_info> (vinfo),
+                                         root_stmt_info, &rgsi, node, NULL);
       gcc_assert (res);
       return;
     }
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 73c15e67cdde..3c0a40f940ab 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -12231,13 +12231,11 @@ vectorizable_comparison (vec_info *vinfo,
    vectorization.  */
 
 bool
-vectorizable_early_exit (vec_info *vinfo, stmt_vec_info stmt_info,
+vectorizable_early_exit (loop_vec_info loop_vinfo, stmt_vec_info stmt_info,
                         gimple_stmt_iterator *gsi,
                         slp_tree slp_node, stmt_vector_for_cost *cost_vec)
 {
-  loop_vec_info loop_vinfo = dyn_cast <loop_vec_info> (vinfo);
-  if (!loop_vinfo
-      || !is_a <gcond *> (STMT_VINFO_STMT (stmt_info)))
+  if (!is_a <gcond *> (STMT_VINFO_STMT (stmt_info)))
     return false;
 
   if (STMT_VINFO_DEF_TYPE (stmt_info) != vect_condition_def)
@@ -12302,7 +12300,7 @@ vectorizable_early_exit (vec_info *vinfo, stmt_vec_info 
stmt_info,
          return false;
        }
 
-      if (!vectorizable_comparison_1 (vinfo, vectype, stmt_info, code, gsi,
+      if (!vectorizable_comparison_1 (loop_vinfo, vectype, stmt_info, code, 
gsi,
                                      slp_node, cost_vec))
        return false;
 
@@ -12552,8 +12550,8 @@ vect_analyze_stmt (vec_info *vinfo,
     }
 
   ok = true;
-  if (!bb_vinfo
-      && (STMT_VINFO_RELEVANT_P (stmt_info)
+  if (bb_vinfo
+      || (STMT_VINFO_RELEVANT_P (stmt_info)
          || STMT_VINFO_DEF_TYPE (stmt_info) == vect_reduction_def))
     /* Prefer vectorizable_call over vectorizable_simd_clone_call so
        -mveclibabi= takes preference over library functions with
@@ -12561,58 +12559,31 @@ vect_analyze_stmt (vec_info *vinfo,
     ok = (vectorizable_call (vinfo, stmt_info, NULL, node, cost_vec)
          || vectorizable_simd_clone_call (vinfo, stmt_info, NULL, node,
                                           cost_vec)
-         || vectorizable_conversion (vinfo, stmt_info,
-                                     NULL, node, cost_vec)
-         || vectorizable_operation (vinfo, stmt_info,
-                                    NULL, node, cost_vec)
-         || vectorizable_assignment (vinfo, stmt_info,
-                                     NULL, node, cost_vec)
+         || vectorizable_conversion (vinfo, stmt_info, NULL, node, cost_vec)
+         || vectorizable_operation (vinfo, stmt_info, NULL, node, cost_vec)
+         || vectorizable_assignment (vinfo, stmt_info, NULL, node, cost_vec)
          || vectorizable_load (vinfo, stmt_info, NULL, node, cost_vec)
          || vectorizable_store (vinfo, stmt_info, NULL, node, cost_vec)
-         || vectorizable_lane_reducing (as_a <loop_vec_info> (vinfo),
-                                        stmt_info, node, cost_vec)
-         || vectorizable_reduction (as_a <loop_vec_info> (vinfo), stmt_info,
-                                    node, node_instance, cost_vec)
-         || vectorizable_induction (as_a <loop_vec_info> (vinfo), stmt_info,
-                                    node, cost_vec)
          || vectorizable_shift (vinfo, stmt_info, NULL, node, cost_vec)
-         || vectorizable_condition (vinfo, stmt_info,
-                                    NULL, node, cost_vec)
-         || vectorizable_comparison (vinfo, stmt_info, NULL, node,
-                                     cost_vec)
-         || vectorizable_lc_phi (as_a <loop_vec_info> (vinfo),
-                                 stmt_info, node)
-         || vectorizable_recurr (as_a <loop_vec_info> (vinfo),
-                                  stmt_info, node, cost_vec)
-         || vectorizable_early_exit (vinfo, stmt_info, NULL, node,
-                                     cost_vec));
-  else
-    {
-      if (bb_vinfo)
-       ok = (vectorizable_call (vinfo, stmt_info, NULL, node, cost_vec)
-             || vectorizable_simd_clone_call (vinfo, stmt_info,
-                                              NULL, node, cost_vec)
-             || vectorizable_conversion (vinfo, stmt_info, NULL, node,
-                                         cost_vec)
-             || vectorizable_shift (vinfo, stmt_info,
-                                    NULL, node, cost_vec)
-             || vectorizable_operation (vinfo, stmt_info,
-                                        NULL, node, cost_vec)
-             || vectorizable_assignment (vinfo, stmt_info, NULL, node,
-                                         cost_vec)
-             || vectorizable_load (vinfo, stmt_info,
-                                   NULL, node, cost_vec)
-             || vectorizable_store (vinfo, stmt_info,
-                                    NULL, node, cost_vec)
-             || vectorizable_condition (vinfo, stmt_info,
-                                        NULL, node, cost_vec)
-             || vectorizable_comparison (vinfo, stmt_info, NULL, node,
-                                         cost_vec)
-             || vectorizable_phi (vinfo, stmt_info, node, cost_vec)
-             || vectorizable_early_exit (vinfo, stmt_info, NULL, node,
-                                         cost_vec));
-
-    }
+         || vectorizable_condition (vinfo, stmt_info, NULL, node, cost_vec)
+         || vectorizable_comparison (vinfo, stmt_info, NULL, node, cost_vec)
+         || (bb_vinfo
+             && vectorizable_phi (bb_vinfo, stmt_info, node, cost_vec))
+         || (is_a <loop_vec_info> (vinfo)
+             && (vectorizable_lane_reducing (as_a <loop_vec_info> (vinfo),
+                                             stmt_info, node, cost_vec)
+                 || vectorizable_reduction (as_a <loop_vec_info> (vinfo),
+                                            stmt_info,
+                                            node, node_instance, cost_vec)
+                 || vectorizable_induction (as_a <loop_vec_info> (vinfo),
+                                            stmt_info, node, cost_vec)
+                 || vectorizable_lc_phi (as_a <loop_vec_info> (vinfo),
+                                         stmt_info, node)
+                 || vectorizable_recurr (as_a <loop_vec_info> (vinfo),
+                                         stmt_info, node, cost_vec)
+                 || vectorizable_early_exit (as_a <loop_vec_info> (vinfo),
+                                             stmt_info, NULL, node,
+                                             cost_vec))));
 
   if (!ok)
     return opt_result::failure_at (stmt_info->stmt,
@@ -12759,12 +12730,14 @@ vect_transform_stmt (vec_info *vinfo,
       break;
 
     case phi_info_type:
-      done = vectorizable_phi (vinfo, stmt_info, slp_node, NULL);
+      done = vectorizable_phi (as_a <bb_vec_info> (vinfo),
+                              stmt_info, slp_node, NULL);
       gcc_assert (done);
       break;
 
     case loop_exit_ctrl_vec_info_type:
-      done = vectorizable_early_exit (vinfo, stmt_info, gsi, slp_node, NULL);
+      done = vectorizable_early_exit (as_a <loop_vec_info> (vinfo),
+                                     stmt_info, gsi, slp_node, NULL);
       gcc_assert (done);
       break;
 
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index b4229713b2cf..729fa8227753 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -2695,11 +2695,11 @@ extern bool vect_transform_cycle_phi (loop_vec_info, 
stmt_vec_info,
                                      slp_tree, slp_instance);
 extern bool vectorizable_lc_phi (loop_vec_info, stmt_vec_info, slp_tree);
 extern bool vect_transform_lc_phi (loop_vec_info, stmt_vec_info, slp_tree);
-extern bool vectorizable_phi (vec_info *, stmt_vec_info, slp_tree,
+extern bool vectorizable_phi (bb_vec_info, stmt_vec_info, slp_tree,
                              stmt_vector_for_cost *);
 extern bool vectorizable_recurr (loop_vec_info, stmt_vec_info,
                                  slp_tree, stmt_vector_for_cost *);
-extern bool vectorizable_early_exit (vec_info *, stmt_vec_info,
+extern bool vectorizable_early_exit (loop_vec_info, stmt_vec_info,
                                     gimple_stmt_iterator *,
                                     slp_tree, stmt_vector_for_cost *);
 extern bool vect_emulated_vector_p (tree);

Reply via email to