re PR tree-optimization/37573 (gcc-4.4 regression: incorrect code generation with...
authorRichard Guenther <rguenther@suse.de>
Mon, 3 Nov 2008 12:32:52 +0000 (12:32 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Mon, 3 Nov 2008 12:32:52 +0000 (12:32 +0000)
2008-11-03  Richard Guenther  <rguenther@suse.de>

PR middle-end/37573
* tree-data-ref.c (split_constant_offset_1): Fix tuplification.

* gcc.c-torture/execute/pr37573.c: New testcase.

Co-Authored-By: Jakub Jelinek <jakub@redhat.com>
From-SVN: r141547

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr37573.c [new file with mode: 0644]
gcc/tree-data-ref.c

index 6489e91..9a3d1bd 100644 (file)
@@ -1,3 +1,8 @@
+2008-11-03  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/37573
+       * tree-data-ref.c (split_constant_offset_1): Fix tuplification.
+
 2008-11-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/37858
index 1d7e58b..104f203 100644 (file)
@@ -1,3 +1,9 @@
+2008-11-03  Richard Guenther  <rguenther@suse.de>
+       Jakub Jelinek  <jakub@redhat.com>
+
+       PR middle-end/37573
+       * gcc.c-torture/execute/pr37573.c: New testcase.
+
 2008-11-03  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/37858
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr37573.c b/gcc/testsuite/gcc.c-torture/execute/pr37573.c
new file mode 100644 (file)
index 0000000..5891910
--- /dev/null
@@ -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;
+}
+
index 9412414..4f1a9fd 100644 (file)
@@ -551,6 +551,7 @@ split_constant_offset_1 (tree type, tree op0, enum tree_code code, tree op1,
        enum machine_mode pmode;
        int punsignedp, pvolatilep;
 
+       op0 = TREE_OPERAND (op0, 0);
        if (!handled_component_p (op0))
          return false;