re PR target/38736 (-mavx can change the ABI via BIGGEST_ALIGNMENT)
gcc/ 2009-01-18 H.J. Lu <hongjiu.lu@intel.com> PR target/38736 * c-common.c (handle_aligned_attribute): Use ATTRIBUTE_ALIGNED_VALUE instead of BIGGEST_ALIGNMENT for default alignment value. * c-cppbuiltin.c (c_cpp_builtins): Define __BIGGEST_ALIGNMENT__. * defaults.h (ATTRIBUTE_ALIGNED_VALUE): New. * config/i386/i386.h (ATTRIBUTE_ALIGNED_VALUE): Likewise. * doc/extend.texi: Update __attribute__ ((aligned)). Document __BIGGEST_ALIGNMENT__. * doc/tm.texi: Document ATTRIBUTE_ALIGNED_VALUE. gcc/testsuite/ 2009-01-18 H.J. Lu <hongjiu.lu@intel.com> PR target/38736 * g++.dg/compat/abi/pr38736_main.C: New. * g++.dg/compat/abi/pr38736_x.C: Likewise. * g++.dg/compat/abi/pr38736_y.C: Likewise. * g++.dg/other/macro-1.C: Likewise. * gcc.dg/macro-1.c: Likewise. * gcc.dg/compat/pr38736_main.c: Likewise. * gcc.dg/compat/pr38736_x.c: Likewise. * gcc.dg/compat/pr38736_y.c: Likewise. From-SVN: r143486
This commit is contained in:
parent
890065bfe4
commit
6e4f11689b
@ -1,3 +1,20 @@
|
||||
2009-01-18 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR target/38736
|
||||
* c-common.c (handle_aligned_attribute): Use
|
||||
ATTRIBUTE_ALIGNED_VALUE instead of BIGGEST_ALIGNMENT for
|
||||
default alignment value.
|
||||
|
||||
* c-cppbuiltin.c (c_cpp_builtins): Define __BIGGEST_ALIGNMENT__.
|
||||
|
||||
* defaults.h (ATTRIBUTE_ALIGNED_VALUE): New.
|
||||
* config/i386/i386.h (ATTRIBUTE_ALIGNED_VALUE): Likewise.
|
||||
|
||||
* doc/extend.texi: Update __attribute__ ((aligned)). Document
|
||||
__BIGGEST_ALIGNMENT__.
|
||||
|
||||
* doc/tm.texi: Document ATTRIBUTE_ALIGNED_VALUE.
|
||||
|
||||
2009-01-18 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/38819
|
||||
|
@ -5906,7 +5906,7 @@ handle_aligned_attribute (tree *node, tree ARG_UNUSED (name), tree args,
|
||||
tree *type = NULL;
|
||||
int is_type = 0;
|
||||
tree align_expr = (args ? TREE_VALUE (args)
|
||||
: size_int (BIGGEST_ALIGNMENT / BITS_PER_UNIT));
|
||||
: size_int (ATTRIBUTE_ALIGNED_VALUE / BITS_PER_UNIT));
|
||||
int i;
|
||||
|
||||
if (DECL_P (*node))
|
||||
|
@ -762,6 +762,9 @@ c_cpp_builtins (cpp_reader *pfile)
|
||||
format. */
|
||||
if (ENABLE_DECIMAL_FLOAT && ENABLE_DECIMAL_BID_FORMAT)
|
||||
cpp_define (pfile, "__DECIMAL_BID_FORMAT__");
|
||||
|
||||
builtin_define_with_int_value ("__BIGGEST_ALIGNMENT__",
|
||||
BIGGEST_ALIGNMENT / BITS_PER_UNIT);
|
||||
}
|
||||
|
||||
/* Pass an object-like macro. If it doesn't lie in the user's
|
||||
|
@ -710,6 +710,10 @@ enum target_cpu_default
|
||||
/* Maximum stack alignment. */
|
||||
#define MAX_STACK_ALIGNMENT MAX_OFILE_ALIGNMENT
|
||||
|
||||
/* Alignment value for attribute ((aligned)). It is a constant since
|
||||
it is the part of the ABI. We shouldn't change it with -mavx. */
|
||||
#define ATTRIBUTE_ALIGNED_VALUE 128
|
||||
|
||||
/* Decide whether a variable of mode MODE should be 128 bit aligned. */
|
||||
#define ALIGN_MODE_128(MODE) \
|
||||
((MODE) == XFmode || SSE_REG_MODE_P (MODE))
|
||||
|
@ -944,4 +944,9 @@ along with GCC; see the file COPYING3. If not see
|
||||
((TYPE) ? LOCAL_ALIGNMENT ((TYPE), (ALIGN)) : (ALIGN))
|
||||
#endif
|
||||
|
||||
/* Alignment value for attribute ((aligned)). */
|
||||
#ifndef ATTRIBUTE_ALIGNED_VALUE
|
||||
#define ATTRIBUTE_ALIGNED_VALUE BIGGEST_ALIGNMENT
|
||||
#endif
|
||||
|
||||
#endif /* ! GCC_DEFAULTS_H */
|
||||
|
@ -3697,21 +3697,27 @@ that forces the union to be double-word aligned.
|
||||
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 just ask the compiler to align a variable or field to the
|
||||
default alignment for the target architecture you are compiling for.
|
||||
The default alignment is sufficient for all scalar types, but may not be
|
||||
enough for all vector types on a target which supports vector operations.
|
||||
The default alignment is fixed for a particular target ABI.
|
||||
|
||||
Gcc also provides a target specific macro @code{__BIGGEST_ALIGNMENT__},
|
||||
which is the largest alignment ever used for any data type on the
|
||||
target machine you are compiling for. For example, you could write:
|
||||
|
||||
@smallexample
|
||||
short array[3] __attribute__ ((aligned));
|
||||
short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)));
|
||||
@end smallexample
|
||||
|
||||
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.
|
||||
The compiler automatically sets the alignment for the declared
|
||||
variable or field to @code{__BIGGEST_ALIGNMENT__}. 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. Note that the value of @code{__BIGGEST_ALIGNMENT__}
|
||||
may change depending on command line options.
|
||||
|
||||
When used on a struct, or struct member, the @code{aligned} attribute can
|
||||
only increase the alignment; in order to decrease it, the @code{packed}
|
||||
|
@ -1105,6 +1105,11 @@ Alignment, in bits, a C conformant malloc implementation has to
|
||||
provide. If not defined, the default value is @code{BITS_PER_WORD}.
|
||||
@end defmac
|
||||
|
||||
@defmac ATTRIBUTE_ALIGNED_VALUE
|
||||
Alignment used by the @code{__attribute__ ((aligned))} construct. If
|
||||
not defined, the default value is @code{BIGGEST_ALIGNMENT}.
|
||||
@end defmac
|
||||
|
||||
@defmac MINIMUM_ATOMIC_ALIGNMENT
|
||||
If defined, the smallest alignment, in bits, that can be given to an
|
||||
object that can be referenced in one operation, without disturbing any
|
||||
|
@ -1,3 +1,15 @@
|
||||
2009-01-18 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
PR target/38736
|
||||
* g++.dg/compat/abi/pr38736_main.C: New.
|
||||
* g++.dg/compat/abi/pr38736_x.C: Likewise.
|
||||
* g++.dg/compat/abi/pr38736_y.C: Likewise.
|
||||
* g++.dg/other/macro-1.C: Likewise.
|
||||
* gcc.dg/macro-1.c: Likewise.
|
||||
* gcc.dg/compat/pr38736_main.c: Likewise.
|
||||
* gcc.dg/compat/pr38736_x.c: Likewise.
|
||||
* gcc.dg/compat/pr38736_y.c: Likewise.
|
||||
|
||||
2009-01-18 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR tree-optimization/38819
|
||||
|
18
gcc/testsuite/g++.dg/compat/abi/pr38736_main.C
Normal file
18
gcc/testsuite/g++.dg/compat/abi/pr38736_main.C
Normal file
@ -0,0 +1,18 @@
|
||||
/* PR target/38736 */
|
||||
/* { dg-skip-if "attribute ((aligned))" { ! { i?86-*-* x86_64-*-* } } } */
|
||||
/* { dg-require-effective-target avx } */
|
||||
|
||||
/* Test compatibility of attribute ((aligned)) with and without -mavx. */
|
||||
|
||||
extern int aligned_x (void);
|
||||
extern int aligned_y_avx (void);
|
||||
extern "C" void abort (void);
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
if (aligned_x () != aligned_y_avx ())
|
||||
abort ();
|
||||
|
||||
return 0;
|
||||
}
|
15
gcc/testsuite/g++.dg/compat/abi/pr38736_x.C
Normal file
15
gcc/testsuite/g++.dg/compat/abi/pr38736_x.C
Normal file
@ -0,0 +1,15 @@
|
||||
/* PR target/38736 */
|
||||
/* { dg-options "-O2" } */
|
||||
|
||||
struct alignment_test_struct
|
||||
{
|
||||
char space[4] __attribute__((__aligned__));
|
||||
};
|
||||
|
||||
extern int aligned_x (void);
|
||||
|
||||
int
|
||||
aligned_x (void)
|
||||
{
|
||||
return __alignof__(struct alignment_test_struct);
|
||||
}
|
6
gcc/testsuite/g++.dg/compat/abi/pr38736_y.C
Normal file
6
gcc/testsuite/g++.dg/compat/abi/pr38736_y.C
Normal file
@ -0,0 +1,6 @@
|
||||
/* PR target/38736 */
|
||||
/* { dg-options "-O2 -mavx" } */
|
||||
|
||||
#define aligned_x aligned_y_avx
|
||||
|
||||
#include "pr38736_x.C"
|
3
gcc/testsuite/g++.dg/other/macro-1.C
Normal file
3
gcc/testsuite/g++.dg/other/macro-1.C
Normal file
@ -0,0 +1,3 @@
|
||||
/* { dg-do compile } */
|
||||
|
||||
short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)));
|
18
gcc/testsuite/gcc.dg/compat/pr38736_main.c
Normal file
18
gcc/testsuite/gcc.dg/compat/pr38736_main.c
Normal file
@ -0,0 +1,18 @@
|
||||
/* PR target/38736 */
|
||||
/* { dg-skip-if "attribute ((aligned))" { ! { i?86-*-* x86_64-*-* } } } */
|
||||
/* { dg-require-effective-target avx } */
|
||||
|
||||
/* Test compatibility of attribute ((aligned)) with and without -mavx. */
|
||||
|
||||
extern int aligned_x (void);
|
||||
extern int aligned_y_avx (void);
|
||||
extern void abort (void);
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
if (aligned_x () != aligned_y_avx ())
|
||||
abort ();
|
||||
|
||||
return 0;
|
||||
}
|
15
gcc/testsuite/gcc.dg/compat/pr38736_x.c
Normal file
15
gcc/testsuite/gcc.dg/compat/pr38736_x.c
Normal file
@ -0,0 +1,15 @@
|
||||
/* PR target/38736 */
|
||||
/* { dg-options "-O2" } */
|
||||
|
||||
struct alignment_test_struct
|
||||
{
|
||||
char space[4] __attribute__((__aligned__));
|
||||
};
|
||||
|
||||
extern int aligned_x (void);
|
||||
|
||||
int
|
||||
aligned_x (void)
|
||||
{
|
||||
return __alignof__(struct alignment_test_struct);
|
||||
}
|
6
gcc/testsuite/gcc.dg/compat/pr38736_y.c
Normal file
6
gcc/testsuite/gcc.dg/compat/pr38736_y.c
Normal file
@ -0,0 +1,6 @@
|
||||
/* PR target/38736 */
|
||||
/* { dg-options "-O2 -mavx" } */
|
||||
|
||||
#define aligned_x aligned_y_avx
|
||||
|
||||
#include "pr38736_x.c"
|
3
gcc/testsuite/gcc.dg/macro-1.c
Normal file
3
gcc/testsuite/gcc.dg/macro-1.c
Normal file
@ -0,0 +1,3 @@
|
||||
/* { dg-do compile } */
|
||||
|
||||
short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)));
|
Loading…
x
Reference in New Issue
Block a user