aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2025-09-12 13:52:51 +0200
committerRichard Biener <rguenther@suse.de>2025-09-14 11:08:10 +0200
commit21d1bb1922fa7cd98f2a27d002e48b488e772176 (patch)
tree69d67c595bbfecb439bf69f56b998d5f5ea15ac8
parent57c97de978332fa5683393b38a2db77b78bf0e2c (diff)
downloadgcc-21d1bb1922fa7cd98f2a27d002e48b488e772176.zip
gcc-21d1bb1922fa7cd98f2a27d002e48b488e772176.tar.gz
gcc-21d1bb1922fa7cd98f2a27d002e48b488e772176.tar.bz2
Integrate SLP permute transform into vect_transform_stmt
This adds permute_info_type and removes the duplication from vect_schedule_slp_node. * tree-vectorizer.h (stmt_vec_info_type::permute_info_type): Add. (vectorizable_slp_permutation): Declare. * tree-vect-slp.cc (vectorizable_slp_permutation): Export. (vect_slp_analyze_node_operations_1): Set permute_info_type on permute nodes successfully analyzed. (vect_schedule_slp_node): Dispatch to vect_transform_stmt for all nodes. * tree-vect-stmts.cc (vect_transform_stmt): Remove redundant dump, handle permute_info_type. * gcc.dg/vect/vect-reduc-chain-2.c: Adjust. * gcc.dg/vect/vect-reduc-chain-3.c: Likewise.
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-chain-2.c6
-rw-r--r--gcc/testsuite/gcc.dg/vect/vect-reduc-chain-3.c4
-rw-r--r--gcc/tree-vect-slp.cc40
-rw-r--r--gcc/tree-vect-stmts.cc12
-rw-r--r--gcc/tree-vectorizer.h5
5 files changed, 27 insertions, 40 deletions
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-chain-2.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-chain-2.c
index 5bc2686..0d8d012 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-reduc-chain-2.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-chain-2.c
@@ -74,6 +74,6 @@ main (void)
}
/* { dg-final { scan-tree-dump "vect_recog_dot_prod_pattern: detected" "vect" } } */
-/* { dg-final { scan-tree-dump "vectorizing statement: \\S+ = DOT_PROD_EXPR" "vect" { target { vect_sdot_qi } } } } */
-/* { dg-final { scan-tree-dump "vectorizing statement: \\S+ = DOT_PROD_EXPR" "vect" { target { vect_udot_qi } } } } */
-/* { dg-final { scan-tree-dump "vectorizing statement: \\S+ = DOT_PROD_EXPR" "vect" { target { vect_sdot_hi } } } } */
+/* { dg-final { scan-tree-dump "vectorizing SLP node starting from: \\S+ = DOT_PROD_EXPR" "vect" { target { vect_sdot_qi } } } } */
+/* { dg-final { scan-tree-dump "vectorizing SLP node starting from: \\S+ = DOT_PROD_EXPR" "vect" { target { vect_udot_qi } } } } */
+/* { dg-final { scan-tree-dump "vectorizing SLP node starting from: \\S+ = DOT_PROD_EXPR" "vect" { target { vect_sdot_hi } } } } */
diff --git a/gcc/testsuite/gcc.dg/vect/vect-reduc-chain-3.c b/gcc/testsuite/gcc.dg/vect/vect-reduc-chain-3.c
index 6a733fb..1cefbe0 100644
--- a/gcc/testsuite/gcc.dg/vect/vect-reduc-chain-3.c
+++ b/gcc/testsuite/gcc.dg/vect/vect-reduc-chain-3.c
@@ -64,5 +64,5 @@ main (void)
__builtin_abort ();
}
-/* { dg-final { scan-tree-dump "vectorizing statement: \\S+ = SAD_EXPR" "vect" { target vect_udot_qi } } } */
-/* { dg-final { scan-tree-dump "vectorizing statement: \\S+ = DOT_PROD_EXPR" "vect" { target vect_sdot_hi } } } */
+/* { dg-final { scan-tree-dump "vectorizing SLP node starting from: \\S+ = SAD_EXPR" "vect" { target vect_udot_qi } } } */
+/* { dg-final { scan-tree-dump "vectorizing SLP node starting from: \\S+ = DOT_PROD_EXPR" "vect" { target vect_sdot_hi } } } */
diff --git a/gcc/tree-vect-slp.cc b/gcc/tree-vect-slp.cc
index 8187dbc..895fb88 100644
--- a/gcc/tree-vect-slp.cc
+++ b/gcc/tree-vect-slp.cc
@@ -64,8 +64,6 @@ static bool vect_transform_slp_perm_load_1 (vec_info *, slp_tree,
static int vectorizable_slp_permutation_1 (vec_info *, gimple_stmt_iterator *,
slp_tree, lane_permutation_t &,
vec<slp_tree> &, bool);
-static bool vectorizable_slp_permutation (vec_info *, gimple_stmt_iterator *,
- slp_tree, stmt_vector_for_cost *);
static void vect_print_slp_tree (dump_flags_t, dump_location_t, slp_tree);
static bool vect_slp_can_convert_to_external (const vec<stmt_vec_info> &);
@@ -8072,6 +8070,7 @@ vect_slp_analyze_node_operations_1 (vec_info *vinfo, slp_tree node,
false, cost_vec))
return false;
}
+ SLP_TREE_TYPE (node) = permute_info_type;
return true;
}
@@ -11359,7 +11358,7 @@ vectorizable_slp_permutation_1 (vec_info *vinfo, gimple_stmt_iterator *gsi,
[ { 0, 2 }, { 0, 3 } ]
Where currently only a subset is supported by code generating below. */
-static bool
+bool
vectorizable_slp_permutation (vec_info *vinfo, gimple_stmt_iterator *gsi,
slp_tree node, stmt_vector_for_cost *cost_vec)
{
@@ -11596,37 +11595,20 @@ vect_schedule_slp_node (vec_info *vinfo,
}
}
- /* Handle purely internal nodes. */
- if (SLP_TREE_PERMUTE_P (node))
- {
- if (dump_enabled_p ())
- dump_printf_loc (MSG_NOTE, vect_location,
- "------>vectorizing SLP permutation node\n");
- /* ??? the transform kind was stored to STMT_VINFO_TYPE which might
- be shared with different SLP nodes (but usually it's the same
- operation apart from the case the stmt is only there for denoting
- the actual scalar lane defs ...). So do not call vect_transform_stmt
- but open-code it here (partly). */
- bool done = vectorizable_slp_permutation (vinfo, &si, node, NULL);
- gcc_assert (done);
- stmt_vec_info slp_stmt_info;
- unsigned int i;
- FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, slp_stmt_info)
- if (slp_stmt_info && STMT_VINFO_LIVE_P (slp_stmt_info))
- {
- done = vectorizable_live_operation (vinfo, slp_stmt_info, node,
- instance, i, true, NULL);
- gcc_assert (done);
- }
- }
- else
+ if (dump_enabled_p ())
{
- if (dump_enabled_p ())
+ if (stmt_info)
dump_printf_loc (MSG_NOTE, vect_location,
"------>vectorizing SLP node starting from: %G",
stmt_info->stmt);
- vect_transform_stmt (vinfo, stmt_info, &si, node, instance);
+ else
+ {
+ dump_printf_loc (MSG_NOTE, vect_location,
+ "------>vectorizing SLP node:\n");
+ vect_print_slp_tree (MSG_NOTE, vect_location, node);
+ }
}
+ vect_transform_stmt (vinfo, stmt_info, &si, node, instance);
}
/* Replace scalar calls from SLP node NODE with setting of their lhs to zero.
diff --git a/gcc/tree-vect-stmts.cc b/gcc/tree-vect-stmts.cc
index 852bc40..d46c1e3 100644
--- a/gcc/tree-vect-stmts.cc
+++ b/gcc/tree-vect-stmts.cc
@@ -12731,11 +12731,8 @@ vect_transform_stmt (vec_info *vinfo,
gcc_assert (slp_node);
- if (dump_enabled_p ())
- dump_printf_loc (MSG_NOTE, vect_location,
- "------>vectorizing statement: %G", stmt_info->stmt);
-
- STMT_VINFO_VECTYPE (stmt_info) = NULL_TREE;
+ if (stmt_info)
+ STMT_VINFO_VECTYPE (stmt_info) = NULL_TREE;
switch (SLP_TREE_TYPE (slp_node))
{
@@ -12845,6 +12842,11 @@ vect_transform_stmt (vec_info *vinfo,
gcc_assert (done);
break;
+ case permute_info_type:
+ done = vectorizable_slp_permutation (vinfo, gsi, slp_node, NULL);
+ gcc_assert (done);
+ break;
+
default:
if (!STMT_VINFO_LIVE_P (stmt_info))
{
diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h
index 34a3a57..b7c2188 100644
--- a/gcc/tree-vectorizer.h
+++ b/gcc/tree-vectorizer.h
@@ -242,7 +242,8 @@ enum stmt_vec_info_type {
lc_phi_info_type,
phi_info_type,
recurr_info_type,
- loop_exit_ctrl_vec_info_type
+ loop_exit_ctrl_vec_info_type,
+ permute_info_type
};
/************************************************************************
@@ -2755,6 +2756,8 @@ extern bool vect_transform_slp_perm_load (vec_info *, slp_tree, const vec<tree>
gimple_stmt_iterator *, poly_uint64,
bool, unsigned *,
unsigned * = nullptr, bool = false);
+extern bool vectorizable_slp_permutation (vec_info *, gimple_stmt_iterator *,
+ slp_tree, stmt_vector_for_cost *);
extern bool vect_slp_analyze_operations (vec_info *);
extern void vect_schedule_slp (vec_info *, const vec<slp_instance> &);
extern opt_result vect_analyze_slp (vec_info *, unsigned, bool);