https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116125
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
We document
class dr_with_seg_len
{
...
/* The minimum common alignment of DR's start address, SEG_LEN and
ACCESS_SIZE. */
unsigned int align;
but here we have access_size == 1 and align == 4. It's also said
/* All addresses involved are known to have a common alignment ALIGN.
We can therefore subtract ALIGN from an exclusive endpoint to get
an inclusive endpoint. In the best (and common) case, ALIGN is the
same as the access sizes of both DRs, and so subtracting ALIGN
cancels out the addition of an access size. */
unsigned int align = MIN (dr_a.align, dr_b.align);
poly_uint64 last_chunk_a = dr_a.access_size - align;
poly_uint64 last_chunk_b = dr_b.access_size - align;
and
We also know
that last_chunk_b <= |step|; this is checked elsewhere if it isn't
guaranteed at compile time.
step == 4, but last_chunk_a/b are -3U. I couldn't find the "elsewhere"
to check what we validate there.
I think the case of align > access_size can easily happen with grouped
accesses with a gap at the end (see vect_vfa_access_size), so simply
failing the address-based check for this case is too pessimistic.
Richard, I'd really would like you to handle this.