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