aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/split-8.c43
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));
+}