vector alignment

Martin Sebor msebor@gmail.com
Wed Apr 3 17:59:00 GMT 2019


On 4/3/19 5:13 AM, Richard Biener wrote:
> On Tue, Apr 2, 2019 at 6:20 PM Martin Sebor <msebor@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



More information about the Gcc mailing list