aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@linaro.org>2017-09-18 15:03:29 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2017-09-18 15:03:29 +0000
commit68a0f2ffff4fdb05cfe110b3828124bcbe6d611f (patch)
treedc340ca7b00feb67a6b05f07d6c960fb3af00019 /gcc
parentf64b12bd152735aacb948424766b33303bbeb5f8 (diff)
downloadgcc-68a0f2ffff4fdb05cfe110b3828124bcbe6d611f.zip
gcc-68a0f2ffff4fdb05cfe110b3828124bcbe6d611f.tar.gz
gcc-68a0f2ffff4fdb05cfe110b3828124bcbe6d611f.tar.bz2
Invoke vectorizable_live_operation in a consistent way
vect_transform_stmt calls vectorizable_live_operation for each live statement in an SLP node, but vect_analyze_stmt only called it the once. This patch makes vect_analyze_stmt consistent with vect_transform_stmt, which should be a bit more robust, and also means that a later patch can use slp_index when deciding validity. 2017-09-18 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * tree-vect-stmts.c (can_vectorize_live_stmts): New function, split out from... (vect_transform_stmt): ...here. (vect_analyze_stmt): Use it instead of calling vectorizable_live_operation directly. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r252929
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog10
-rw-r--r--gcc/tree-vect-stmts.c60
2 files changed, 44 insertions, 26 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index eb02801..9292748 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,13 @@
+2017-09-18 Richard Sandiford <richard.sandiford@linaro.org>
+ Alan Hayward <alan.hayward@arm.com>
+ David Sherwood <david.sherwood@arm.com>
+
+ * tree-vect-stmts.c (can_vectorize_live_stmts): New function,
+ split out from...
+ (vect_transform_stmt): ...here.
+ (vect_analyze_stmt): Use it instead of calling
+ vectorizable_live_operation directly.
+
2017-09-18 Cesar Philippidis <cesar@codesourcery.com>
* omp-offload.c (oacc_xform_loop): Enable SIMD vectorization on
diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c
index 74ffb64..852e5cd 100644
--- a/gcc/tree-vect-stmts.c
+++ b/gcc/tree-vect-stmts.c
@@ -8479,6 +8479,35 @@ vectorizable_comparison (gimple *stmt, gimple_stmt_iterator *gsi,
return true;
}
+/* If SLP_NODE is nonnull, return true if vectorizable_live_operation
+ can handle all live statements in the node. Otherwise return true
+ if STMT is not live or if vectorizable_live_operation can handle it.
+ GSI and VEC_STMT are as for vectorizable_live_operation. */
+
+static bool
+can_vectorize_live_stmts (gimple *stmt, gimple_stmt_iterator *gsi,
+ slp_tree slp_node, gimple **vec_stmt)
+{
+ if (slp_node)
+ {
+ gimple *slp_stmt;
+ unsigned int i;
+ FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (slp_node), i, slp_stmt)
+ {
+ stmt_vec_info slp_stmt_info = vinfo_for_stmt (slp_stmt);
+ if (STMT_VINFO_LIVE_P (slp_stmt_info)
+ && !vectorizable_live_operation (slp_stmt, gsi, slp_node, i,
+ vec_stmt))
+ return false;
+ }
+ }
+ else if (STMT_VINFO_LIVE_P (vinfo_for_stmt (stmt))
+ && !vectorizable_live_operation (stmt, gsi, slp_node, -1, vec_stmt))
+ return false;
+
+ return true;
+}
+
/* Make sure the statement is vectorizable. */
bool
@@ -8685,17 +8714,13 @@ vect_analyze_stmt (gimple *stmt, bool *need_to_vectorize, slp_tree node,
/* Stmts that are (also) "live" (i.e. - that are used out of the loop)
need extra handling, except for vectorizable reductions. */
- if (STMT_VINFO_LIVE_P (stmt_info)
- && STMT_VINFO_TYPE (stmt_info) != reduc_vec_info_type)
- ok = vectorizable_live_operation (stmt, NULL, node, -1, NULL);
-
- if (!ok)
+ if (STMT_VINFO_TYPE (stmt_info) != reduc_vec_info_type
+ && !can_vectorize_live_stmts (stmt, NULL, node, NULL))
{
if (dump_enabled_p ())
{
dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location,
- "not vectorized: live stmt not ");
- dump_printf (MSG_MISSED_OPTIMIZATION, "supported: ");
+ "not vectorized: live stmt not supported: ");
dump_gimple_stmt (MSG_MISSED_OPTIMIZATION, TDF_SLIM, stmt, 0);
}
@@ -8861,26 +8886,9 @@ vect_transform_stmt (gimple *stmt, gimple_stmt_iterator *gsi,
/* Handle stmts whose DEF is used outside the loop-nest that is
being vectorized. */
- if (slp_node)
- {
- gimple *slp_stmt;
- int i;
- if (STMT_VINFO_TYPE (stmt_info) != reduc_vec_info_type)
- FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (slp_node), i, slp_stmt)
- {
- stmt_vec_info slp_stmt_info = vinfo_for_stmt (slp_stmt);
- if (STMT_VINFO_LIVE_P (slp_stmt_info))
- {
- done = vectorizable_live_operation (slp_stmt, gsi, slp_node, i,
- &vec_stmt);
- gcc_assert (done);
- }
- }
- }
- else if (STMT_VINFO_LIVE_P (stmt_info)
- && STMT_VINFO_TYPE (stmt_info) != reduc_vec_info_type)
+ if (STMT_VINFO_TYPE (stmt_info) != reduc_vec_info_type)
{
- done = vectorizable_live_operation (stmt, gsi, slp_node, -1, &vec_stmt);
+ done = can_vectorize_live_stmts (stmt, gsi, slp_node, &vec_stmt);
gcc_assert (done);
}