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