]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Merge BB and loop path in vect_analyze_stmt
authorRichard Biener <rguenther@suse.de>
Wed, 20 Aug 2025 12:07:34 +0000 (14:07 +0200)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 21 Aug 2025 07:25:22 +0000 (09:25 +0200)
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.

gcc/tree-vect-loop.cc
gcc/tree-vect-slp.cc
gcc/tree-vect-stmts.cc
gcc/tree-vectorizer.h

index 91c3237e58b97bc340e51ea3d5da639c3df6e392..483b2e38816ef5bc3bbaba53d9ff3131079bd923 100644 (file)
@@ -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)
 {
index 2eac9d56522da645a890545506b8b5e8ba57d684..3081251eba8add0da934f43d52f517c347d5b847 100644 (file)
@@ -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;
     }
index 73c15e67cdde0c2fc6a8b62e4ed77faffe92b4d3..3c0a40f940abada0ff322dd6dc187db5722abf82 100644 (file)
@@ -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;
 
index b4229713b2cf4bc052fe028553ce143cd1e76549..729fa8227753fc84a81b0a845d6ce6f5f8ba28ed 100644 (file)
@@ -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);