https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87746
--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> --- Actually much simpler and correct like the following but test coverage for peeling seems to be low. diff --git a/gcc/tree-vect-data-refs.c b/gcc/tree-vect-data-refs.c index 9185b1bd1c0..20ecbfb45b7 100644 --- a/gcc/tree-vect-data-refs.c +++ b/gcc/tree-vect-data-refs.c @@ -1010,20 +1010,10 @@ vect_update_misalignment_for_peel (dr_vec_info *dr_info, unsigned int i; vec<dr_p> same_aligned_drs; struct data_reference *current_dr; - int dr_size = vect_get_scalar_dr_size (dr_info); - int dr_peel_size = vect_get_scalar_dr_size (dr_peel_info); - stmt_vec_info stmt_info = dr_info->stmt; stmt_vec_info peel_stmt_info = dr_peel_info->stmt; - /* For interleaved data accesses the step in the loop must be multiplied by - the size of the interleaving group. */ - if (STMT_VINFO_GROUPED_ACCESS (stmt_info)) - dr_size *= DR_GROUP_SIZE (DR_GROUP_FIRST_ELEMENT (stmt_info)); - if (STMT_VINFO_GROUPED_ACCESS (peel_stmt_info)) - dr_peel_size *= DR_GROUP_SIZE (peel_stmt_info); - - /* It can be assumed that the data refs with the same alignment as dr_peel - are aligned in the vector loop. */ + /* It can be assumed that if dr_info has the same alignment as dr_peel, + it is aligned in the vector loop. */ same_aligned_drs = STMT_VINFO_SAME_ALIGN_REFS (peel_stmt_info); FOR_EACH_VEC_ELT (same_aligned_drs, i, current_dr) { @@ -1031,8 +1021,8 @@ vect_update_misalignment_for_peel (dr_vec_info *dr_info, continue; gcc_assert (!known_alignment_for_access_p (dr_info) || !known_alignment_for_access_p (dr_peel_info) - || (DR_MISALIGNMENT (dr_info) / dr_size - == DR_MISALIGNMENT (dr_peel_info) / dr_peel_size)); + || (DR_MISALIGNMENT (dr_info) + == DR_MISALIGNMENT (dr_peel_info))); SET_DR_MISALIGNMENT (dr_info, 0); return; } @@ -1040,10 +1030,8 @@ vect_update_misalignment_for_peel (dr_vec_info *dr_info, if (known_alignment_for_access_p (dr_info) && known_alignment_for_access_p (dr_peel_info)) { - bool negative = tree_int_cst_compare (DR_STEP (dr_info->dr), - size_zero_node) < 0; int misal = DR_MISALIGNMENT (dr_info); - misal += negative ? -npeel * dr_size : npeel * dr_size; + misal += npeel * TREE_INT_CST_LOW (DR_STEP (dr_info->dr)); misal &= DR_TARGET_ALIGNMENT (dr_info) - 1; SET_DR_MISALIGNMENT (dr_info, misal); return;