On 4/3/19 5:13 AM, Richard Biener wrote:
On Tue, Apr 2, 2019 at 6:20 PM Martin Sebor <mse...@gmail.com> wrote:

GCC tries to align a vector on its natural boundary, i.e., that
given by its size, up to MAX_OBJECT_ALIGNMENT.  Vectors that are
bigger than that are either silently [mis]aligned on that same
maximum boundary (PR 89798), silently truncated (and misaligned),
or cause an ICE (PR 89797).  Compiling the following:

    __attribute__ ((vector_size (N))) char v;

    _Static_assert (sizeof (v) == N, "size");
    _Static_assert (__alignof__ (v) == N, "alignment");

with N set to 1LLU << I shows these failures:

    I < 29   succeeds
    I < 31   fails alignment
    I < 32   ICE
    I >= 32  fails alignment and size

Attribute aligned doesn't seem to have any effect on types or
variables declared with attribute vector_size.  The alignment
set by the latter prevails.

This happens no matter what scope the vector is defined in (i.e.,
file or local).

I have some questions:

1) Is there some reason to align vectors on the same boundary
     as their size no matter how big it is?  I can't find such
     a requirement in the ABIs I looked at.  Or would it be more
     appropriate to align the big ones on the preferred boundary
     for the target?  For instance, does it make more sense to
     align a 64KB vector on a 64KB boundary than on, say,
     a 64-byte boundary (or some other boundary less than 64K?)

I don't think there's a good reason.  Instead I think that
BIGGEST_ALIGNMENT is what we should go for as upper limit,
anything bigger doesn't make sense (unless the user explicitely
requests it).

Sounds good.  Changing the alignment will impact object layout.
How do you suggest to deal with it? (Presumably for GCC 10.)
Issuing an ABI warning and adding an option to override
the new setting come to mind as possible mitigating solutions.


2) If not, is it then appropriate to underalign very large
     vectors on a boundary less than their size?

Yes.

Ack.


3) Should the aligned attribute not override the default vector
     alignment?

Yes, but doesn't it already?

Not if both are specified on the same declaration, as in:

  typedef __attribute__ ((aligned (1024), vector_size (256))) int V;

I opened PR 89950 for this.

Martin

Reply via email to