re PR target/30665 (peephole2 misapplied on postinc mem)
authorHans-Peter Nilsson <hp@axis.com>
Mon, 5 Feb 2007 21:20:36 +0000 (21:20 +0000)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Mon, 5 Feb 2007 21:20:36 +0000 (21:20 +0000)
PR target/30665
* gcc.dg/torture/pr30665-1.c, gcc.dg/torture/pr30665-2.c: New tests.

From-SVN: r121611

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr30665-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/torture/pr30665-2.c [new file with mode: 0644]

index da8fdb0..d6f14ca 100644 (file)
@@ -1,3 +1,8 @@
+2007-02-05  Hans-Peter Nilsson  <hp@axis.com>
+
+       PR target/30665
+       * gcc.dg/torture/pr30665-1.c, gcc.dg/torture/pr30665-2.c: New tests.
+
 2007-02-04  Francois-Xavier Coudert  <coudert@clipper.ens.fr>
 
        PR fortran/30611
diff --git a/gcc/testsuite/gcc.dg/torture/pr30665-1.c b/gcc/testsuite/gcc.dg/torture/pr30665-1.c
new file mode 100644 (file)
index 0000000..4650408
--- /dev/null
@@ -0,0 +1,24 @@
+/* PR target/30665: bug in cris.md peephole2 condition.
+   Testcase for trunk.  */
+/* { dg-do run } */
+
+extern void abort (void);
+extern void exit (int);
+
+int  __attribute__ ((__noinline__)) f (unsigned *p, int *x)
+{
+  int y = *p++ & 0xfff;
+  *x++ = y;
+  *x = *p;
+  return y;
+}
+
+int main (void)
+{
+  unsigned u[2] = { 0x3aad, 0x5ad1 };
+  int x[2] = {17689, 23456};
+
+  if (f (u, x) != 0xaad || x[0] != 0xaad || x[1] != 0x5ad1)
+    abort ();
+  exit (0);
+}
diff --git a/gcc/testsuite/gcc.dg/torture/pr30665-2.c b/gcc/testsuite/gcc.dg/torture/pr30665-2.c
new file mode 100644 (file)
index 0000000..a2cbf02
--- /dev/null
@@ -0,0 +1,57 @@
+/* PR target/30665: bug in cris.md peephole2 condition.
+   Original reduced testcase (fails on 3.2.1 derivate, not on trunk).  */
+/* { dg-do run } */
+
+extern void abort (void);
+extern void exit (int);
+
+struct t
+{
+  unsigned int a : 12;
+  unsigned int b  : 12;
+  unsigned int dummy1 : 8;
+};
+
+struct area
+{
+  int xa;
+  int xb;
+};
+
+struct c
+{
+  struct area ii;
+};
+
+static struct c c;
+
+void  __attribute__ ((__noinline__)) g(int a)
+{
+  if (a != 79)
+    abort ();
+}
+
+void  __attribute__ ((__noinline__)) h(struct t tt)
+{
+  if (tt.a != 20 || tt.b != 79)
+    abort ();
+}
+
+void __attribute__ ((__noinline__)) s(void);
+
+int main(int argc, char **argv)
+{
+  c.ii.xa = 20;
+  c.ii.xb = 79;
+
+  s();
+
+  exit (0);
+}
+
+void __attribute__ ((__noinline__)) s(void)
+{
+  struct t ii_x = { .a = c.ii.xa, .b = c.ii.xb };
+  g(c.ii.xb);
+  h(ii_x);
+}