Steve Ellcey wrote:
Most of the gcc.dg/vect/* tests contain something like:

        typedef float afloat __attribute__ ((__aligned__(16)));
        afloat a[N];

It looks like what is really intended here is to apply the alignment to the array type. The point is that the entire array has to be appropriately aligned for the SIMD instructions to work correctly. It's certainly *not* true that the individual array elements must be so aligned.


So, the right thing to write is:

  typedef float aligned_float_array[N] __attribute__((__aligned__((16)));
  aligned_float_array a;

which says that the array should be 16-byte aligned.

The GCC manual has some confusing language suggesting that arrays of aligned objects ought to work, contrary to my earlier statement. I think that's just broken. For example, if "sizeof (E) * N" is not the same as the sizeof an array of N elements of E, all kinds of normal invariants of C are going to break. If the above statement is going to be legal at all, then sizeof (afloat) must be equal to (at least) 16, which is surely not what the user intended, nor is what GCC actually does.

The gcc.dg/compat/struct-layout problems seem to stem from
struct-layout-1_generate.c.  In generate_fields() it generates random
types, some of these are arrays of some base type.  Then based on
another random number we might add an attribute like alignment.  There
is no check to ensure that the alignment of the base type is less than or
equal to the size of the base type in those instances where we are
creating an array.

That could be fixed by adding the check you suggest, and then just discarding the attribute.


--
Mark Mitchell
CodeSourcery, LLC
[EMAIL PROTECTED]
(916) 791-8304

Reply via email to