https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69186
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> --- Ok, here we have t.c:8:3: note: Detected single element interleaving a[b.0_14][2] step 8 t.c:8:3: note: not consecutive access a[b.0_14][2] = _6; t.c:8:3: note: using strided accesses thus strided store vs. interleaving. But int dr_size = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (DR_REF (dr)))); int dr_peel_size = GET_MODE_SIZE (TYPE_MODE (TREE_TYPE (DR_REF (dr_peel)))); ... if (STMT_VINFO_GROUPED_ACCESS (stmt_info)) dr_size *= GROUP_SIZE (vinfo_for_stmt (GROUP_FIRST_ELEMENT (stmt_info))); if (STMT_VINFO_GROUPED_ACCESS (peel_stmt_info)) dr_peel_size *= GROUP_SIZE (peel_stmt_info); ... gcc_assert (DR_MISALIGNMENT (dr) / dr_size == DR_MISALIGNMENT (dr_peel) / dr_peel_size); doesn't make much sense to me anyway. Note that by construction SAME_ALIGN_REFS evolve in lock-step (dependence distance zero or a multiple of the vectorization factor). In fact if (known_alignment_for_access_p (dr) && known_alignment_for_access_p (dr_peel)) { bool negative = tree_int_cst_compare (DR_STEP (dr), size_zero_node) < 0; int misal = DR_MISALIGNMENT (dr); tree vectype = STMT_VINFO_VECTYPE (stmt_info); misal += negative ? -npeel * dr_size : npeel * dr_size; misal &= (TYPE_ALIGN (vectype) / BITS_PER_UNIT) - 1; SET_DR_MISALIGNMENT (dr, misal); return; } looks bogus to me. It should use npeel * dr_step (not dr_size and the odd way it is computed - usually "correctly" of course). Well. I'll just guard the call appropriately.