aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2016-02-14 12:13:14 +1030
committerAlan Modra <amodra@gcc.gnu.org>2016-02-14 12:13:14 +1030
commitf6964637b640c6b54742cd58155a7eca1b670510 (patch)
treedc2001b5e8137581a37d02a034d5143fb261b09e
parentab6e41cb3c9ec47b0dc7dcbf2c85b38980a5ef90 (diff)
downloadgcc-f6964637b640c6b54742cd58155a7eca1b670510.zip
gcc-f6964637b640c6b54742cd58155a7eca1b670510.tar.gz
gcc-f6964637b640c6b54742cd58155a7eca1b670510.tar.bz2
Correct c-torture stkalign test
The test wrongly assumed that a local var will normally not be 64-bit aligned, causing it to fail on many targets. So the test needs to pass if a local var *is* normally 64-bit aligned. * gcc.c-torture/execute/stkalign.c: Revise test. From-SVN: r233407
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/stkalign.c23
2 files changed, 24 insertions, 3 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 1c417e5..031daed 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2016-02-14 Alan Modra <amodra@gmail.com>
+
+ * gcc.c-torture/execute/stkalign.c: Revise test.
+
2016-02-13 Oleg Endo <olegendo@gcc.gnu.org>
PR target/67260
diff --git a/gcc/testsuite/gcc.c-torture/execute/stkalign.c b/gcc/testsuite/gcc.c-torture/execute/stkalign.c
index 2f8d041..e10a1d2 100644
--- a/gcc/testsuite/gcc.c-torture/execute/stkalign.c
+++ b/gcc/testsuite/gcc.c-torture/execute/stkalign.c
@@ -1,5 +1,6 @@
-/* { dg-xfail-run-if "invalid assumption" { sparc*-*-* && lp64 } "*" "" } */
/* { dg-options "-fno-inline" } */
+/* Check that stack alignment is not affected by variables not placed
+ on the stack. */
#include <assert.h>
@@ -16,12 +17,28 @@ unsigned test(unsigned n, unsigned p)
return n ? test(n - 1, x) : (x ^ p);
}
+unsigned test2(unsigned n, unsigned p)
+{
+ static struct { char c; } s;
+ unsigned x;
+
+ assert(__alignof__(s) != ALIGNMENT);
+ asm ("" : "=g" (x), "+m" (s) : "0" (&x));
+
+ return n ? test2(n - 1, x) : (x ^ p);
+}
+
int main (int argc, char *argv[] __attribute__((unused)))
{
- unsigned int x = test(argc, 0);
+ unsigned int x, y;
+ x = test(argc, 0);
x |= test(argc + 1, 0);
x |= test(argc + 2, 0);
- return !(x & (ALIGNMENT - 1));
+ y = test2(argc, 0);
+ y |= test2(argc + 1, 0);
+ y |= test2(argc + 2, 0);
+
+ return (x & (ALIGNMENT - 1)) == 0 && (y & (ALIGNMENT - 1)) != 0 ? 1 : 0;
}