Fix eipa_src AAPCS issue (PR target/65956)
authorJakub Jelinek <jakub@redhat.com>
Mon, 6 Jul 2015 17:06:00 +0000 (19:06 +0200)
committerAlan Lawrence <alalaw01@gcc.gnu.org>
Mon, 6 Jul 2015 17:06:00 +0000 (17:06 +0000)
2015-05-05  Jakub Jelinek  <jakub@redhat.com>

PR target/65956
* gcc.c-torture/execute/pr65956.c: New test.

From-SVN: r225466

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr65956.c [new file with mode: 0644]

index 529c8637f9097c81a7b418f01073e344181db674..0788e3cbfd1b2ea024cd00e9602aa388a3e3c7b6 100644 (file)
@@ -1,3 +1,8 @@
+2015-05-05  Jakub Jelinek  <jakub@redhat.com>
+
+        PR target/65956
+        * gcc.c-torture/execute/pr65956.c: New test.
+
 2015-07-06  Alan Lawrence  <alan.lawrence@arm.com>
 
        * gcc.target/arm/aapcs/align1.c: New.
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr65956.c b/gcc/testsuite/gcc.c-torture/execute/pr65956.c
new file mode 100644 (file)
index 0000000..f5c5eec
--- /dev/null
@@ -0,0 +1,67 @@
+/* PR target/65956 */
+
+struct A { char *a; int b; long long c; };
+char v[3];
+
+__attribute__((noinline, noclone)) void
+fn1 (char *x, char *y)
+{
+  if (x != &v[1] || y != &v[2])
+    __builtin_abort ();
+  v[1]++;
+}
+
+__attribute__((noinline, noclone)) int
+fn2 (char *x)
+{
+  asm volatile ("" : "+g" (x) : : "memory");
+  return x == &v[0];
+}
+
+__attribute__((noinline, noclone)) void
+fn3 (const char *x)
+{
+  if (x[0] != 0)
+    __builtin_abort ();
+}
+
+static struct A
+foo (const char *x, struct A y, struct A z)
+{
+  struct A r = { 0, 0, 0 };
+  if (y.b && z.b)
+    {
+      if (fn2 (y.a) && fn2 (z.a))
+       switch (x[0])
+         {
+         case '|':
+           break;
+         default:
+           fn3 (x);
+         }
+      fn1 (y.a, z.a);
+    }
+  return r;
+}
+
+__attribute__((noinline, noclone)) int
+bar (int x, struct A *y)
+{
+  switch (x)
+    {
+    case 219:
+      foo ("+", y[-2], y[0]);
+    case 220:
+      foo ("-", y[-2], y[0]);
+    }
+}
+
+int
+main ()
+{
+  struct A a[3] = { { &v[1], 1, 1LL }, { &v[0], 0, 0LL }, { &v[2], 2, 2LL } };
+  bar (220, a + 2);
+  if (v[1] != 1)
+    __builtin_abort ();
+  return 0;
+}