https://gcc.gnu.org/bugzilla/show_bug.cgi?id=100253

--- Comment #6 from Richard Biener <rguenth at gcc dot gnu.org> ---
So the issue is we're getting a dataref pointer like

&MEM <__int128 unsigned> [(char * {ref-all})&s + 25B]

and the first access has DR_MISALIGNMENT of 9 and the target alignment is 16.
So we have

align == 16
misalign == 9

then we do

                  data_ref = fold_build2 (MEM_REF, vectype,
                                          dataref_ptr,
                                          dataref_offset
                                          ? dataref_offset
                                          : build_int_cst (ref_type, 0));
                  if (aligned_access_p (first_dr_info))
                    ;
                  else if (DR_MISALIGNMENT (first_dr_info) == -1)
                    TREE_TYPE (data_ref)
                      = build_aligned_type (TREE_TYPE (data_ref),
                                            align * BITS_PER_UNIT);
                  else
                    TREE_TYPE (data_ref)
                      = build_aligned_type (TREE_TYPE (data_ref),
                                            TYPE_ALIGN (elem_type));

but since DR_MISALIGNMENT is not -1 we assume element alignment
(since DR_MISALIGNMENT is the misalign in elements and at least at
some point wasn't arbitrary ... unless I misremember).  Since
the vector type is vector(1) __int128 unsigned we get an aligned
access.  Note how we're using 'align' in the == -1 case but that's
the target alignment ...

The load code has the same issue.  I'm testing a simplification.

Reply via email to