While looking at PR90018 I figured DR_GROUP_SAME_DR_STMT is never set since GCC 4.9. The following removes it to confuse the occasional reader of the vectorizer code less.
Bootstrap / regtest in progress on x86_64-unknown-linux-gnu. Richard. 2019-04-09 Richard Biener <rguent...@suse.de> * tree-vectorizer.h (_stmt_vec_info): Remove same_dr_stmt member. (DR_GROUP_SAME_DR_STMT): Remove. * tree-vect-stmts.c (vectorizable_load): Remove unreachable code. * tree-vect-data-refs.c (vect_analyze_group_access_1): Likewise, replace with assert. (vect_record_grouped_load_vectors): Remove unreachable code. Index: gcc/tree-vectorizer.h =================================================================== --- gcc/tree-vectorizer.h (revision 270223) +++ gcc/tree-vectorizer.h (working copy) @@ -872,9 +872,6 @@ struct _stmt_vec_info { stmt_vec_info first_element; /* Pointer to the next element in the group. */ stmt_vec_info next_element; - /* For data-refs, in case that two or more stmts share data-ref, this is the - pointer to the previously detected stmt with the same dr. */ - stmt_vec_info same_dr_stmt; /* The size of the group. */ unsigned int size; /* For stores, number of stores from this group seen. We vectorize the last @@ -1044,8 +1041,6 @@ STMT_VINFO_BB_VINFO (stmt_vec_info stmt_ (gcc_checking_assert ((S)->dr_aux.dr), (S)->store_count) #define DR_GROUP_GAP(S) \ (gcc_checking_assert ((S)->dr_aux.dr), (S)->gap) -#define DR_GROUP_SAME_DR_STMT(S) \ - (gcc_checking_assert ((S)->dr_aux.dr), (S)->same_dr_stmt) #define REDUC_GROUP_FIRST_ELEMENT(S) \ (gcc_checking_assert (!(S)->dr_aux.dr), (S)->first_element) Index: gcc/tree-vect-stmts.c =================================================================== --- gcc/tree-vect-stmts.c (revision 270223) +++ gcc/tree-vect-stmts.c (working copy) @@ -7704,19 +7727,6 @@ vectorizable_load (stmt_vec_info stmt_in "group loads with negative dependence distance\n"); return false; } - - /* Similarly when the stmt is a load that is both part of a SLP - instance and a loop vectorized stmt via the same-dr mechanism - we have to give up. */ - if (DR_GROUP_SAME_DR_STMT (stmt_info) - && (STMT_SLP_TYPE (stmt_info) - != STMT_SLP_TYPE (DR_GROUP_SAME_DR_STMT (stmt_info)))) - { - if (dump_enabled_p ()) - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "conflicting SLP types for CSEd load\n"); - return false; - } } else group_size = 1; Index: gcc/tree-vect-data-refs.c =================================================================== --- gcc/tree-vect-data-refs.c (revision 270223) +++ gcc/tree-vect-data-refs.c (working copy) @@ -2529,32 +2529,9 @@ vect_analyze_group_access_1 (dr_vec_info /* By construction, all group members have INTEGER_CST DR_INITs. */ while (next) { - /* Skip same data-refs. In case that two or more stmts share - data-ref (supported only for loads), we vectorize only the first - stmt, and the rest get their vectorized loads from the first - one. */ - if (!tree_int_cst_compare (DR_INIT (data_ref), - DR_INIT (STMT_VINFO_DATA_REF (next)))) - { - if (DR_IS_WRITE (data_ref)) - { - if (dump_enabled_p ()) - dump_printf_loc (MSG_MISSED_OPTIMIZATION, vect_location, - "Two store stmts share the same dr.\n"); - return false; - } - - if (dump_enabled_p ()) - dump_printf_loc (MSG_NOTE, vect_location, - "Two or more load stmts share the same dr.\n"); - - /* For load use the same data-ref load. */ - DR_GROUP_SAME_DR_STMT (next) = prev; - - prev = next; - next = DR_GROUP_NEXT_ELEMENT (next); - continue; - } + /* We never have the same DR multiple times. */ + gcc_assert (tree_int_cst_compare (DR_INIT (data_ref), + DR_INIT (STMT_VINFO_DATA_REF (next))) != 0); prev = next; data_ref = STMT_VINFO_DATA_REF (next); @@ -6329,12 +6306,14 @@ vect_record_grouped_load_vectors (stmt_v correspond to the gaps. */ if (next_stmt_info != first_stmt_info && gap_count < DR_GROUP_GAP (next_stmt_info)) - { - gap_count++; - continue; - } + { + gap_count++; + continue; + } - while (next_stmt_info) + /* ??? The following needs cleanup after the removal of + DR_GROUP_SAME_DR_STMT. */ + if (next_stmt_info) { stmt_vec_info new_stmt_info = vinfo->lookup_def (tmp_data_ref); /* We assume that if VEC_STMT is not NULL, this is a case of multiple @@ -6344,29 +6323,21 @@ vect_record_grouped_load_vectors (stmt_v STMT_VINFO_VEC_STMT (next_stmt_info) = new_stmt_info; else { - if (!DR_GROUP_SAME_DR_STMT (next_stmt_info)) - { - stmt_vec_info prev_stmt_info - = STMT_VINFO_VEC_STMT (next_stmt_info); - stmt_vec_info rel_stmt_info - = STMT_VINFO_RELATED_STMT (prev_stmt_info); - while (rel_stmt_info) - { - prev_stmt_info = rel_stmt_info; - rel_stmt_info = STMT_VINFO_RELATED_STMT (rel_stmt_info); - } + stmt_vec_info prev_stmt_info + = STMT_VINFO_VEC_STMT (next_stmt_info); + stmt_vec_info rel_stmt_info + = STMT_VINFO_RELATED_STMT (prev_stmt_info); + while (rel_stmt_info) + { + prev_stmt_info = rel_stmt_info; + rel_stmt_info = STMT_VINFO_RELATED_STMT (rel_stmt_info); + } - STMT_VINFO_RELATED_STMT (prev_stmt_info) = new_stmt_info; - } + STMT_VINFO_RELATED_STMT (prev_stmt_info) = new_stmt_info; } next_stmt_info = DR_GROUP_NEXT_ELEMENT (next_stmt_info); gap_count = 1; - /* If NEXT_STMT_INFO accesses the same DR as the previous statement, - put the same TMP_DATA_REF as its vectorized statement; otherwise - get the next data-ref from RESULT_CHAIN. */ - if (!next_stmt_info || !DR_GROUP_SAME_DR_STMT (next_stmt_info)) - break; } } }