Commit 6e4f1168 by H.J. Lu Committed by H.J. Lu

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
parent 890065bf
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> 2009-01-18 Richard Guenther <rguenther@suse.de>
PR tree-optimization/38819 PR tree-optimization/38819
......
...@@ -5906,7 +5906,7 @@ handle_aligned_attribute (tree *node, tree ARG_UNUSED (name), tree args, ...@@ -5906,7 +5906,7 @@ handle_aligned_attribute (tree *node, tree ARG_UNUSED (name), tree args,
tree *type = NULL; tree *type = NULL;
int is_type = 0; int is_type = 0;
tree align_expr = (args ? TREE_VALUE (args) tree align_expr = (args ? TREE_VALUE (args)
: size_int (BIGGEST_ALIGNMENT / BITS_PER_UNIT)); : size_int (ATTRIBUTE_ALIGNED_VALUE / BITS_PER_UNIT));
int i; int i;
if (DECL_P (*node)) if (DECL_P (*node))
......
...@@ -762,6 +762,9 @@ c_cpp_builtins (cpp_reader *pfile) ...@@ -762,6 +762,9 @@ c_cpp_builtins (cpp_reader *pfile)
format. */ format. */
if (ENABLE_DECIMAL_FLOAT && ENABLE_DECIMAL_BID_FORMAT) if (ENABLE_DECIMAL_FLOAT && ENABLE_DECIMAL_BID_FORMAT)
cpp_define (pfile, "__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 /* Pass an object-like macro. If it doesn't lie in the user's
......
...@@ -710,6 +710,10 @@ enum target_cpu_default ...@@ -710,6 +710,10 @@ enum target_cpu_default
/* Maximum stack alignment. */ /* Maximum stack alignment. */
#define MAX_STACK_ALIGNMENT MAX_OFILE_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. */ /* Decide whether a variable of mode MODE should be 128 bit aligned. */
#define ALIGN_MODE_128(MODE) \ #define ALIGN_MODE_128(MODE) \
((MODE) == XFmode || SSE_REG_MODE_P (MODE)) ((MODE) == XFmode || SSE_REG_MODE_P (MODE))
......
...@@ -944,4 +944,9 @@ along with GCC; see the file COPYING3. If not see ...@@ -944,4 +944,9 @@ along with GCC; see the file COPYING3. If not see
((TYPE) ? LOCAL_ALIGNMENT ((TYPE), (ALIGN)) : (ALIGN)) ((TYPE) ? LOCAL_ALIGNMENT ((TYPE), (ALIGN)) : (ALIGN))
#endif #endif
/* Alignment value for attribute ((aligned)). */
#ifndef ATTRIBUTE_ALIGNED_VALUE
#define ATTRIBUTE_ALIGNED_VALUE BIGGEST_ALIGNMENT
#endif
#endif /* ! GCC_DEFAULTS_H */ #endif /* ! GCC_DEFAULTS_H */
...@@ -3697,21 +3697,27 @@ that forces the union to be double-word aligned. ...@@ -3697,21 +3697,27 @@ that forces the union to be double-word aligned.
As in the preceding examples, you can explicitly specify the alignment 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 (in bytes) that you wish the compiler to use for a given variable or
structure field. Alternatively, you can leave out the alignment factor structure field. Alternatively, you can leave out the alignment factor
and just ask the compiler to align a variable or field to the maximum and just ask the compiler to align a variable or field to the
useful alignment for the target machine you are compiling for. For default alignment for the target architecture you are compiling for.
example, you could write: 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 @smallexample
short array[3] __attribute__ ((aligned)); short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)));
@end smallexample @end smallexample
Whenever you leave out the alignment factor in an @code{aligned} attribute The compiler automatically sets the alignment for the declared
specification, the compiler automatically sets the alignment for the declared variable or field to @code{__BIGGEST_ALIGNMENT__}. Doing this can
variable or field to the largest alignment which is ever used for any data often make copy operations more efficient, because the compiler can
type on the target machine you are compiling for. Doing this can often make use whatever instructions copy the biggest chunks of memory when
copy operations more efficient, because the compiler can use whatever performing copies to or from the variables or fields that you have
instructions copy the biggest chunks of memory when performing copies to aligned this way. Note that the value of @code{__BIGGEST_ALIGNMENT__}
or from the variables or fields that you have aligned this way. may change depending on command line options.
When used on a struct, or struct member, the @code{aligned} attribute can 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} 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 ...@@ -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}. provide. If not defined, the default value is @code{BITS_PER_WORD}.
@end defmac @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 @defmac MINIMUM_ATOMIC_ALIGNMENT
If defined, the smallest alignment, in bits, that can be given to an If defined, the smallest alignment, in bits, that can be given to an
object that can be referenced in one operation, without disturbing any object that can be referenced in one operation, without disturbing any
......
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> 2009-01-18 Richard Guenther <rguenther@suse.de>
PR tree-optimization/38819 PR tree-optimization/38819
......
/* 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;
}
/* 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);
}
/* PR target/38736 */
/* { dg-options "-O2 -mavx" } */
#define aligned_x aligned_y_avx
#include "pr38736_x.C"
/* { dg-do compile } */
short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)));
/* 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;
}
/* 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);
}
/* PR target/38736 */
/* { dg-options "-O2 -mavx" } */
#define aligned_x aligned_y_avx
#include "pr38736_x.c"
/* { dg-do compile } */
short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)));
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment