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). > 2) If not, is it then appropriate to underalign very large > vectors on a boundary less than their size? Yes. > 3) Should the aligned attribute not override the default vector > alignment? Yes, but doesn't it already? > I would like to think the answer to (1) is that vectors should > be aligned on the preferred boundary for the target/ABI. If > that's feasible, it should also obviate question (2). > > I believe the answer to (3) is yes. If not, GCC should issue > a warning that it doesn't honor the aligned attribute. > > Thanks > Martin