From bd2f172f0b67c88ad3dd6126e8ee6fd4e87b6787 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Fri, 30 Jun 2017 13:19:29 +0000 Subject: [PATCH] tree-vect-slp.c (vect_slp_analyze_node_operations): Only analyze the first scalar stmt. 2017-06-30 Richard Biener * tree-vect-slp.c (vect_slp_analyze_node_operations): Only analyze the first scalar stmt. Move vector type computation for the BB case here from ... * tree-vect-stmts.c (vect_analyze_stmt): ... here. Guard live operation processing in the SLP case properly. From-SVN: r249839 --- gcc/ChangeLog | 8 +++++ gcc/tree-vect-slp.c | 81 ++++++++++++++++++++++++++++++++----------- gcc/tree-vect-stmts.c | 67 +++++++---------------------------- 3 files changed, 81 insertions(+), 75 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f4c435f70a2..a898fd40917 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-06-30 Richard Biener + + * tree-vect-slp.c (vect_slp_analyze_node_operations): Only + analyze the first scalar stmt. Move vector type computation + for the BB case here from ... + * tree-vect-stmts.c (vect_analyze_stmt): ... here. Guard + live operation processing in the SLP case properly. + 2017-06-30 Richard Biener * graph.c (draw_cfg_node_succ_edges): Fix broken dot syntax. diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index 9e7a20dbfe4..dd8658e32f0 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -2437,29 +2437,70 @@ vect_slp_analyze_node_operations (slp_tree node) if (!vect_slp_analyze_node_operations (child)) return false; - bool res = true; - FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, stmt) + stmt = SLP_TREE_SCALAR_STMTS (node)[0]; + stmt_vec_info stmt_info = vinfo_for_stmt (stmt); + gcc_assert (stmt_info); + gcc_assert (STMT_SLP_TYPE (stmt_info) != loop_vect); + + /* For BB vectorization vector types are assigned here. + Memory accesses already got their vector type assigned + in vect_analyze_data_refs. */ + bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info); + if (bb_vinfo + && ! STMT_VINFO_DATA_REF (stmt_info)) { - stmt_vec_info stmt_info = vinfo_for_stmt (stmt); - gcc_assert (stmt_info); - gcc_assert (STMT_SLP_TYPE (stmt_info) != loop_vect); - - /* Push SLP node def-type to stmt operands. */ - FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), j, child) - if (SLP_TREE_DEF_TYPE (child) != vect_internal_def) - STMT_VINFO_DEF_TYPE (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (child)[i])) - = SLP_TREE_DEF_TYPE (child); - res = vect_analyze_stmt (stmt, &dummy, node); - /* Restore def-types. */ - FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), j, child) - if (SLP_TREE_DEF_TYPE (child) != vect_internal_def) - STMT_VINFO_DEF_TYPE (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (child)[i])) - = vect_internal_def; - if (! res) - break; + gcc_assert (PURE_SLP_STMT (stmt_info)); + + tree scalar_type = TREE_TYPE (gimple_get_lhs (stmt)); + if (dump_enabled_p ()) + { + dump_printf_loc (MSG_NOTE, vect_location, + "get vectype for scalar type: "); + dump_generic_expr (MSG_NOTE, TDF_SLIM, scalar_type); + dump_printf (MSG_NOTE, "\n"); + } + + tree vectype = get_vectype_for_scalar_type (scalar_type); + if (!vectype) + { + if (dump_enabled_p ()) + { + dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, + "not SLPed: unsupported data-type "); + dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM, + scalar_type); + dump_printf (MSG_MISSED_OPTIMIZATION, "\n"); + } + return false; + } + + if (dump_enabled_p ()) + { + dump_printf_loc (MSG_NOTE, vect_location, "vectype: "); + dump_generic_expr (MSG_NOTE, TDF_SLIM, vectype); + dump_printf (MSG_NOTE, "\n"); + } + + gimple *sstmt; + FOR_EACH_VEC_ELT (SLP_TREE_SCALAR_STMTS (node), i, sstmt) + STMT_VINFO_VECTYPE (vinfo_for_stmt (sstmt)) = vectype; } - return res; + /* Push SLP node def-type to stmt operands. */ + FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), j, child) + if (SLP_TREE_DEF_TYPE (child) != vect_internal_def) + STMT_VINFO_DEF_TYPE (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (child)[0])) + = SLP_TREE_DEF_TYPE (child); + bool res = vect_analyze_stmt (stmt, &dummy, node); + /* Restore def-types. */ + FOR_EACH_VEC_ELT (SLP_TREE_CHILDREN (node), j, child) + if (SLP_TREE_DEF_TYPE (child) != vect_internal_def) + STMT_VINFO_DEF_TYPE (vinfo_for_stmt (SLP_TREE_SCALAR_STMTS (child)[0])) + = vect_internal_def; + if (! res) + return false; + + return true; } diff --git a/gcc/tree-vect-stmts.c b/gcc/tree-vect-stmts.c index e04390ec4b0..9647c111d65 100644 --- a/gcc/tree-vect-stmts.c +++ b/gcc/tree-vect-stmts.c @@ -8398,7 +8398,6 @@ vect_analyze_stmt (gimple *stmt, bool *need_to_vectorize, slp_tree node) bb_vec_info bb_vinfo = STMT_VINFO_BB_VINFO (stmt_info); enum vect_relevant relevance = STMT_VINFO_RELEVANT (stmt_info); bool ok; - tree scalar_type, vectype; gimple *pattern_stmt; gimple_seq pattern_def_seq; @@ -8529,48 +8528,6 @@ vect_analyze_stmt (gimple *stmt, bool *need_to_vectorize, slp_tree node) gcc_unreachable (); } - if (bb_vinfo) - { - gcc_assert (PURE_SLP_STMT (stmt_info)); - - /* Memory accesses already got their vector type assigned - in vect_analyze_data_refs. */ - if (! STMT_VINFO_DATA_REF (stmt_info)) - { - scalar_type = TREE_TYPE (gimple_get_lhs (stmt)); - if (dump_enabled_p ()) - { - dump_printf_loc (MSG_NOTE, vect_location, - "get vectype for scalar type: "); - dump_generic_expr (MSG_NOTE, TDF_SLIM, scalar_type); - dump_printf (MSG_NOTE, "\n"); - } - - vectype = get_vectype_for_scalar_type (scalar_type); - if (!vectype) - { - if (dump_enabled_p ()) - { - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "not SLPed: unsupported data-type "); - dump_generic_expr (MSG_MISSED_OPTIMIZATION, TDF_SLIM, - scalar_type); - dump_printf (MSG_MISSED_OPTIMIZATION, "\n"); - } - return false; - } - - if (dump_enabled_p ()) - { - dump_printf_loc (MSG_NOTE, vect_location, "vectype: "); - dump_generic_expr (MSG_NOTE, TDF_SLIM, vectype); - dump_printf (MSG_NOTE, "\n"); - } - - STMT_VINFO_VECTYPE (stmt_info) = vectype; - } - } - if (STMT_VINFO_RELEVANT_P (stmt_info)) { gcc_assert (!VECTOR_MODE_P (TYPE_MODE (gimple_expr_type (stmt)))); @@ -8815,20 +8772,20 @@ vect_transform_stmt (gimple *stmt, gimple_stmt_iterator *gsi, { gimple *slp_stmt; 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) - && STMT_VINFO_TYPE (slp_stmt_info) != reduc_vec_info_type) - { - done = vectorizable_live_operation (slp_stmt, gsi, slp_node, i, - &vec_stmt); - gcc_assert (done); - } - } + 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) + && STMT_VINFO_TYPE (stmt_info) != reduc_vec_info_type) { done = vectorizable_live_operation (stmt, gsi, slp_node, -1, &vec_stmt); gcc_assert (done); -- 2.30.2