diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/split-8.c | 43 |
2 files changed, 48 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0343e8e..2e333b4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-06-20 Than McIntosh <thanm@google.com> + + PR libgcc/86213 + * gcc.dg/split-8.c: New. + 2018-06-20 Kelvin Nilsen <kelvin@gcc.gnu.org> * gcc.target/powerpc/builtins-1.c: Adjust dg directives to scan diff --git a/gcc/testsuite/gcc.dg/split-8.c b/gcc/testsuite/gcc.dg/split-8.c new file mode 100644 index 0000000..33662e2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/split-8.c @@ -0,0 +1,43 @@ +/* { dg-do run } */ +/* { dg-require-effective-target split_stack } */ +/* { dg-options "-fsplit-stack" } */ + +/* Testcase for PR86213. On the first call to __morestack there is a live + value in xmm0, which was being clobbered by a call to getenv(). */ + +#include <stdlib.h> + +double gd[8]; +int z; + +double bar(double q) __attribute__ ((noinline)); +double foo(double q) __attribute__ ((noinline)); +int ck(double q) __attribute__ ((noinline)); +int main(int argc, char **argv) __attribute__ ((no_split_stack)); + +double bar(double q) +{ + double d[8]; + for (unsigned i = 0; i < 8; ++i) + d[i] = gd[8-i-1]; + return q + d[z&3]; +} + +double foo(double d) +{ + return bar(d); +} + +int ck(double d) +{ + if (d != 64.0) + abort(); + return 0; +} + +typedef double (*fp)(double); +fp g = foo; + +int main(int argc, char **argv) { + return ck(g(64.0)); +} |