diff options
author | Alan Modra <amodra@gmail.com> | 2016-02-14 12:13:14 +1030 |
---|---|---|
committer | Alan Modra <amodra@gcc.gnu.org> | 2016-02-14 12:13:14 +1030 |
commit | f6964637b640c6b54742cd58155a7eca1b670510 (patch) | |
tree | dc2001b5e8137581a37d02a034d5143fb261b09e | |
parent | ab6e41cb3c9ec47b0dc7dcbf2c85b38980a5ef90 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/stkalign.c | 23 |
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; } |