summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/execute/pr37573.c
diff options
context:
space:
mode:
authorupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
committerupstream source tree <ports@midipix.org>2015-03-15 20:14:05 -0400
commit554fd8c5195424bdbcabf5de30fdc183aba391bd (patch)
tree976dc5ab7fddf506dadce60ae936f43f58787092 /gcc/testsuite/gcc.c-torture/execute/pr37573.c
downloadcbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.bz2
cbb-gcc-4.6.4-554fd8c5195424bdbcabf5de30fdc183aba391bd.tar.xz
obtained gcc-4.6.4.tar.bz2 from upstream website;upstream
verified gcc-4.6.4.tar.bz2.sig; imported gcc-4.6.4 source tree from verified upstream tarball. downloading a git-generated archive based on the 'upstream' tag should provide you with a source tree that is binary identical to the one extracted from the above tarball. if you have obtained the source via the command 'git clone', however, do note that line-endings of files in your working directory might differ from line-endings of the respective files in the upstream repository.
Diffstat (limited to 'gcc/testsuite/gcc.c-torture/execute/pr37573.c')
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr37573.c65
1 files changed, 65 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr37573.c b/gcc/testsuite/gcc.c-torture/execute/pr37573.c
new file mode 100644
index 000000000..589191035
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr37573.c
@@ -0,0 +1,65 @@
+/* PR tree-optimization/37573 */
+
+struct S
+{
+ unsigned int *a;
+ unsigned int b;
+ unsigned int c[624];
+};
+
+static unsigned char __attribute__((noinline))
+foo (struct S *s)
+{
+ unsigned int r;
+ if (!--s->b)
+ {
+ unsigned int *c = s->c;
+ unsigned int i;
+ s->a = c;
+ for (i = 0; i < 227; i++)
+ c[i] = ((((c[i] ^ c[i + 1]) & 0x7ffffffe) ^ c[i]) >> 1)
+ ^ ((0 - (c[i + 1] & 1)) & 0x9908b0df) ^ c[i + 397];
+ }
+ r = *(s->a++);
+ r ^= (r >> 11);
+ r ^= ((r & 0xff3a58ad) << 7);
+ r ^= ((r & 0xffffdf8c) << 15);
+ r ^= (r >> 18);
+ return (unsigned char) (r >> 1);
+}
+
+static void __attribute__((noinline))
+bar (unsigned char *p, unsigned int q, unsigned int r)
+{
+ struct S s;
+ unsigned int i;
+ unsigned int *c = s.c;
+ *c = r;
+ for (i = 1; i < 624; i++)
+ c[i] = i + 0x6c078965 * ((c[i - 1] >> 30) ^ c[i - 1]);
+ s.b = 1;
+ while (q--)
+ *p++ ^= foo (&s);
+};
+
+static unsigned char p[23] = {
+ 0xc0, 0x49, 0x17, 0x32, 0x62, 0x1e, 0x2e, 0xd5, 0x4c, 0x19, 0x28, 0x49,
+ 0x91, 0xe4, 0x72, 0x83, 0x91, 0x3d, 0x93, 0x83, 0xb3, 0x61, 0x38
+};
+
+static unsigned char q[23] = {
+ 0x3e, 0x41, 0x55, 0x54, 0x4f, 0x49, 0x54, 0x20, 0x55, 0x4e, 0x49, 0x43,
+ 0x4f, 0x44, 0x45, 0x20, 0x53, 0x43, 0x52, 0x49, 0x50, 0x54, 0x3c
+};
+
+int
+main (void)
+{
+ unsigned int s;
+ s = 23;
+ bar (p, s, s + 0xa25e);
+ if (__builtin_memcmp (p, q, s) != 0)
+ __builtin_abort ();
+ return 0;
+}
+