]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/38736 (-mavx can change the ABI via BIGGEST_ALIGNMENT)
authorH.J. Lu <hongjiu.lu@intel.com>
Sun, 18 Jan 2009 16:26:26 +0000 (16:26 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Sun, 18 Jan 2009 16:26:26 +0000 (08:26 -0800)
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

16 files changed:
gcc/ChangeLog
gcc/c-common.c
gcc/c-cppbuiltin.c
gcc/config/i386/i386.h
gcc/defaults.h
gcc/doc/extend.texi
gcc/doc/tm.texi
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/compat/abi/pr38736_main.C [new file with mode: 0644]
gcc/testsuite/g++.dg/compat/abi/pr38736_x.C [new file with mode: 0644]
gcc/testsuite/g++.dg/compat/abi/pr38736_y.C [new file with mode: 0644]
gcc/testsuite/g++.dg/other/macro-1.C [new file with mode: 0644]
gcc/testsuite/gcc.dg/compat/pr38736_main.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/compat/pr38736_x.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/compat/pr38736_y.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/macro-1.c [new file with mode: 0644]

index 1448c0db3a86d22670a07880eb2c66f7967d969c..fed14be4e6114678c7c21ec0c0f02a0a412d461f 100644 (file)
@@ -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
index b94ac1b7037becc46a04e6ccdb66df1efe847dd0..5eed1dc89e1b5dda78afb85aa3d30569059aaa33 100644 (file)
@@ -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))
index 58b1796e797e7e0e71c0e650d927f2e35b438dc2..c6112d8afcae66a7d6470779168b3fb789ff7b72 100644 (file)
@@ -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
index 55935985a2921679a90749bb3bba02373d0b01fb..14e7438c4a51a7432d447d7c70699583a670ef7b 100644 (file)
@@ -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))
index 282a14ac00a063e024864fc6c578c62229bd9ae7..c9097349795f64c0ea09d9e54679c6e9ea2af884 100644 (file)
@@ -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 */
index f131a4da2ba24b16bd3327b9c98ae570da2a4451..5a7e2d83e29030b1016376a3acc1908e170d186c 100644 (file)
@@ -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}
index d748a754e2d1dc7f9dfffdc08f90e4fa7e24a1b1..92de6e5b8ac4226291dadfff947b0ef4a25b7c9d 100644 (file)
@@ -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
index 43fe9a9396bb7a72a226058af30ea2680d45bb11..8f42d58e6c6c675f8d4dcf2ae7fb0029ea8294fc 100644 (file)
@@ -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
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr38736_main.C b/gcc/testsuite/g++.dg/compat/abi/pr38736_main.C
new file mode 100644 (file)
index 0000000..b9f6ac8
--- /dev/null
@@ -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;
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr38736_x.C b/gcc/testsuite/g++.dg/compat/abi/pr38736_x.C
new file mode 100644 (file)
index 0000000..aeab257
--- /dev/null
@@ -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);
+}
diff --git a/gcc/testsuite/g++.dg/compat/abi/pr38736_y.C b/gcc/testsuite/g++.dg/compat/abi/pr38736_y.C
new file mode 100644 (file)
index 0000000..bade1b2
--- /dev/null
@@ -0,0 +1,6 @@
+/* PR target/38736 */
+/* { dg-options "-O2 -mavx" } */
+
+#define aligned_x aligned_y_avx
+
+#include "pr38736_x.C"
diff --git a/gcc/testsuite/g++.dg/other/macro-1.C b/gcc/testsuite/g++.dg/other/macro-1.C
new file mode 100644 (file)
index 0000000..e1d9d34
--- /dev/null
@@ -0,0 +1,3 @@
+/* { dg-do compile } */
+
+short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)));
diff --git a/gcc/testsuite/gcc.dg/compat/pr38736_main.c b/gcc/testsuite/gcc.dg/compat/pr38736_main.c
new file mode 100644 (file)
index 0000000..88c3586
--- /dev/null
@@ -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;
+}
diff --git a/gcc/testsuite/gcc.dg/compat/pr38736_x.c b/gcc/testsuite/gcc.dg/compat/pr38736_x.c
new file mode 100644 (file)
index 0000000..aeab257
--- /dev/null
@@ -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);
+}
diff --git a/gcc/testsuite/gcc.dg/compat/pr38736_y.c b/gcc/testsuite/gcc.dg/compat/pr38736_y.c
new file mode 100644 (file)
index 0000000..7e46afa
--- /dev/null
@@ -0,0 +1,6 @@
+/* PR target/38736 */
+/* { dg-options "-O2 -mavx" } */
+
+#define aligned_x aligned_y_avx
+
+#include "pr38736_x.c"
diff --git a/gcc/testsuite/gcc.dg/macro-1.c b/gcc/testsuite/gcc.dg/macro-1.c
new file mode 100644 (file)
index 0000000..e1d9d34
--- /dev/null
@@ -0,0 +1,3 @@
+/* { dg-do compile } */
+
+short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__)));