aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2015-07-06 19:06:00 +0200
committerAlan Lawrence <alalaw01@gcc.gnu.org>2015-07-06 17:06:00 +0000
commit25a57facdda63f94a915caece613985c972463a8 (patch)
treeb9097824cead46d66aaca5d3aacd49fc1f80ce64
parent6a47847024dcca2bc071fecd241b5b8bd33c5f7a (diff)
downloadgcc-25a57facdda63f94a915caece613985c972463a8.zip
gcc-25a57facdda63f94a915caece613985c972463a8.tar.gz
gcc-25a57facdda63f94a915caece613985c972463a8.tar.bz2
Fix eipa_src AAPCS issue (PR target/65956)
2015-05-05 Jakub Jelinek <jakub@redhat.com> PR target/65956 * gcc.c-torture/execute/pr65956.c: New test. From-SVN: r225466
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr65956.c67
2 files changed, 72 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 529c863..0788e3c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..f5c5eec
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr65956.c
@@ -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;
+}