This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
vector alignment
- From: Martin Sebor <msebor at gmail dot com>
- To: gcc mailing list <gcc at gcc dot gnu dot org>
- Date: Tue, 2 Apr 2019 10:20:38 -0600
- Subject: vector alignment
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?)
2) If not, is it then appropriate to underalign very large
vectors on a boundary less than their size?
3) Should the aligned attribute not override the default vector
alignment?
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