On April 3, 2019 7:59:47 PM GMT+02:00, Martin Sebor <mse...@gmail.com> wrote:
>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.

Do we really apply the alignment there? How do other compilers lay out here? 

>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.

We could reject these vector types in aggregates in favor of arrays. Of course 
that ship has sailed... 

>> 
>>> 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