"H.J. Lu" <hjl.to...@gmail.com> writes:

> Index: gcc/doc/extend.texi
> ===================================================================
> --- gcc/doc/extend.texi       (revision 4884)
> +++ gcc/doc/extend.texi       (working copy)
> @@ -3697,9 +3697,8 @@ that forces the union to be double-word 
>  As in the preceding examples, you can explicitly specify the alignment
>  (in bytes) that you wish the compiler to use for a given variable or
>  structure field.  Alternatively, you can leave out the alignment factor
> -and just ask the compiler to align a variable or field to the maximum
> -useful alignment for the target machine you are compiling for.  For
> -example, you could write:
> +and use @code{ATTRIBUTE_ALIGNED_VALUE} for the target machine you are
> +compiling for.  For example, you could write:
>  
>  @smallexample
>  short array[3] __attribute__ ((aligned));
> @@ -3707,11 +3706,11 @@ short array[3] __attribute__ ((aligned))
>  
>  Whenever you leave out the alignment factor in an @code{aligned} attribute
>  specification, the compiler automatically sets the alignment for the declared
> -variable or field to the largest alignment which is ever used for any data
> -type on the target machine you are compiling for.  Doing this can often make
> -copy operations more efficient, because the compiler can use whatever
> -instructions copy the biggest chunks of memory when performing copies to
> -or from the variables or fields that you have aligned this way.
> +variable or field to @code{ATTRIBUTE_ALIGNED_VALUE}.  Doing this can
> +often make copy operations more efficient, because the compiler can use
> +whatever instructions copy the biggest chunks of memory aligned at
> +...@code{attribute_aligned_value} when performing copies to or from the
> +variables or fields that you have aligned this way.

ATTRIBUTE_ALIGNED_VALUE is an internal compiler macro.  extend.texi is
external user documentation.  extend.texi should not documented the
attribute in terms of ATTRIBUTE_ALIGNED_VALUE.


> Index: gcc/testsuite/gcc.target/i386/pr38736-2.c
> ===================================================================
> --- gcc/testsuite/gcc.target/i386/pr38736-2.c (revision 0)
> +++ gcc/testsuite/gcc.target/i386/pr38736-2.c (revision 0)
> @@ -0,0 +1,19 @@
> +/* PR target/38736 */
> +/* { dg-do run } */
> +/* { dg-require-effective-target avx } */
> +/* { dg-options "-O2 -mavx" } */
> +
> +extern void abort (void);
> +
> +struct alignment_test_struct
> +{
> +  char space[4] __attribute__((__aligned__));
> +};
> +
> +int
> +main ()
> +{
> +  if (__alignof__(struct alignment_test_struct) != 16)
> +    abort ();
> +  return 0;
> +}

This test case seems to be asserting that attribute ((aligned)) should
always align to a 16-byte boundary on x86.  It is not clear to me that
that should be the case.  In fact, I tend to think that it should not
be the case.

It would be better to (somehow) have a multi-file test which checked
that attributed ((aligned)) has the same value with and without -mavx.

> +/* Alignment value for attribute ((aligned)).  It is a constant
> +   since it is the part of the ABI.  */
> +#define ATTRIBUTE_ALIGNED_VALUE 128

Please add some comment here about the AVX issue.

Ian

Reply via email to