aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2025-08-20 14:07:34 +0200
committerRichard Biener <rguenth@gcc.gnu.org>2025-08-21 09:25:22 +0200
commitbf864b450e8eff4e0fab30da2e6b69ee42d04e6f (patch)
treeeb07a3646ed871190d76bdccec497b985a7faab5
parente56e05bca4fb52ffafec749582e3464035693ce7 (diff)
downloadgcc-bf864b450e8eff4e0fab30da2e6b69ee42d04e6f.zip
gcc-bf864b450e8eff4e0fab30da2e6b69ee42d04e6f.tar.gz
gcc-bf864b450e8eff4e0fab30da2e6b69ee42d04e6f.tar.bz2
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.
-rw-r--r--gcc/tree-vect-loop.cc2
-rw-r--r--gcc/tree-vect-slp.cc6
-rw-r--r--gcc/tree-vect-stmts.cc89
-rw-r--r--gcc/tree-vectorizer.h4
4 files changed, 37 insertions, 64 deletions
diff --git a/gcc/tree-vect-loop.cc b/gcc/tree-vect-loop.cc
index 91c3237..483b2e3 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 2eac9d5..3081251 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 73c15e6..3c0a40f 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 b422971..729fa82 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);