[Bug tree-optimization/69186] ICE at -O3 on x86_64-linux-gnu in vect_update_misalignment_for_peel, at tree-vect-data-refs.c:889
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Tue Jan 12 12:45:00 GMT 2016
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.
More information about the Gcc-bugs
mailing list