This patch makes vect_model_store_cost take a vec_load_store_type instead of a vect_def_type. It's a wash on its own, but it helps with later patches.
Richard 2017-11-17 Richard Sandiford <richard.sandif...@linaro.org> gcc/ * tree-vectorizer.h (vec_load_store_type): Moved from tree-vec-stmts.c (vect_model_store_cost): Take a vec_load_store_type instead of a vect_def_type. * tree-vect-stmts.c (vec_load_store_type): Move to tree-vectorizer.h. (vect_model_store_cost): Take a vec_load_store_type instead of a vect_def_type. (vectorizable_mask_load_store): Update accordingly. (vectorizable_store): Likewise. * tree-vect-slp.c (vect_analyze_slp_cost_1): Update accordingly. Index: gcc/tree-vectorizer.h =================================================================== --- gcc/tree-vectorizer.h 2017-11-17 09:06:36.818836579 +0000 +++ gcc/tree-vectorizer.h 2017-11-17 09:06:46.238323981 +0000 @@ -520,6 +520,14 @@ enum slp_vect_type { hybrid }; +/* Says whether a statement is a load, a store of a vectorized statement + result, or a store of an invariant value. */ +enum vec_load_store_type { + VLS_LOAD, + VLS_STORE, + VLS_STORE_INVARIANT +}; + /* Describes how we're going to vectorize an individual load or store, or a group of loads or stores. */ enum vect_memory_access_type { @@ -1220,7 +1228,7 @@ extern void vect_model_simple_cost (stmt int, stmt_vector_for_cost *, stmt_vector_for_cost *); extern void vect_model_store_cost (stmt_vec_info, int, vect_memory_access_type, - enum vect_def_type, slp_tree, + vec_load_store_type, slp_tree, stmt_vector_for_cost *, stmt_vector_for_cost *); extern void vect_model_load_cost (stmt_vec_info, int, vect_memory_access_type, Index: gcc/tree-vect-stmts.c =================================================================== --- gcc/tree-vect-stmts.c 2017-11-17 09:06:42.553230162 +0000 +++ gcc/tree-vect-stmts.c 2017-11-17 09:06:46.238323981 +0000 @@ -52,14 +52,6 @@ Software Foundation; either version 3, o /* For lang_hooks.types.type_for_mode. */ #include "langhooks.h" -/* Says whether a statement is a load, a store of a vectorized statement - result, or a store of an invariant value. */ -enum vec_load_store_type { - VLS_LOAD, - VLS_STORE, - VLS_STORE_INVARIANT -}; - /* Return the vectorized type for the given statement. */ tree @@ -906,7 +898,7 @@ vect_model_promotion_demotion_cost (stmt void vect_model_store_cost (stmt_vec_info stmt_info, int ncopies, vect_memory_access_type memory_access_type, - enum vect_def_type dt, slp_tree slp_node, + vec_load_store_type vls_type, slp_tree slp_node, stmt_vector_for_cost *prologue_cost_vec, stmt_vector_for_cost *body_cost_vec) { @@ -915,7 +907,7 @@ vect_model_store_cost (stmt_vec_info stm gimple *first_stmt = STMT_VINFO_STMT (stmt_info); bool grouped_access_p = STMT_VINFO_GROUPED_ACCESS (stmt_info); - if (dt == vect_constant_def || dt == vect_external_def) + if (vls_type == VLS_STORE_INVARIANT) prologue_cost += record_stmt_cost (prologue_cost_vec, 1, scalar_to_vec, stmt_info, 0, vect_prologue); @@ -2169,7 +2161,7 @@ vectorizable_mask_load_store (gimple *st NULL, NULL, NULL); else vect_model_store_cost (stmt_info, ncopies, memory_access_type, - dt, NULL, NULL, NULL); + vls_type, NULL, NULL, NULL); return true; } gcc_assert (memory_access_type == STMT_VINFO_MEMORY_ACCESS_TYPE (stmt_info)); @@ -5797,8 +5789,8 @@ vectorizable_store (gimple *stmt, gimple STMT_VINFO_TYPE (stmt_info) = store_vec_info_type; /* The SLP costs are calculated during SLP analysis. */ if (!PURE_SLP_STMT (stmt_info)) - vect_model_store_cost (stmt_info, ncopies, memory_access_type, dt, - NULL, NULL, NULL); + vect_model_store_cost (stmt_info, ncopies, memory_access_type, + vls_type, NULL, NULL, NULL); return true; } gcc_assert (memory_access_type == STMT_VINFO_MEMORY_ACCESS_TYPE (stmt_info)); Index: gcc/tree-vect-slp.c =================================================================== --- gcc/tree-vect-slp.c 2017-11-17 09:06:36.818836579 +0000 +++ gcc/tree-vect-slp.c 2017-11-17 09:06:46.237364571 +0000 @@ -1724,7 +1724,7 @@ vect_analyze_slp_cost_1 (slp_instance in : VMAT_CONTIGUOUS); if (DR_IS_WRITE (STMT_VINFO_DATA_REF (stmt_info))) vect_model_store_cost (stmt_info, ncopies_for_cost, - memory_access_type, vect_uninitialized_def, + memory_access_type, VLS_STORE, node, prologue_cost_vec, body_cost_vec); else {