diff mbox series

Add testcase for PR tree-optimization/88739

Message ID 20190208182248.GE2135@tucnak
State New
Headers show
Series Add testcase for PR tree-optimization/88739 | expand

Commit Message

Jakub Jelinek Feb. 8, 2019, 6:22 p.m. UTC
Hi!

The following testcase distilled from https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88739#c0
aborts on s390x-linux when compiled with trunk -O2 with r268332 reverted (or
e.g. with -O2 and gcc 7.x) and succeeds with trunk -O2, or -O0 with any of
those compilers.  Tested also on x86_64-linux with -m32/-m64 make check.

Ok for trunk?

2019-02-08  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/88739
	* gcc.c-torture/execute/pr88739.c: New test.


	Jakub

Comments

Richard Biener Feb. 8, 2019, 6:59 p.m. UTC | #1
On February 8, 2019 7:22:48 PM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>The following testcase distilled from
>https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88739#c0
>aborts on s390x-linux when compiled with trunk -O2 with r268332
>reverted (or
>e.g. with -O2 and gcc 7.x) and succeeds with trunk -O2, or -O0 with any
>of
>those compilers.  Tested also on x86_64-linux with -m32/-m64 make
>check.
>
>Ok for trunk?

OK and thanks for the testcase! 

Richard. 

>2019-02-08  Jakub Jelinek  <jakub@redhat.com>
>
>	PR tree-optimization/88739
>	* gcc.c-torture/execute/pr88739.c: New test.
>
>--- gcc/testsuite/gcc.c-torture/execute/pr88739.c.jj	2019-01-27
>12:44:12.526219828 +0100
>+++ gcc/testsuite/gcc.c-torture/execute/pr88739.c	2019-02-08
>18:48:25.880556579 +0100
>@@ -0,0 +1,59 @@
>+/* PR tree-optimization/88739 */
>+#if __SIZEOF_SHORT__ == 2 &&  __SIZEOF_INT__ == 4 && __CHAR_BIT__ == 8
>+struct A
>+{
>+  unsigned int a, b, c;
>+  unsigned int d : 30;
>+  unsigned int e : 2;
>+};
>+
>+union U
>+{
>+  struct A f;
>+  unsigned int g[4];
>+  unsigned short h[8];
>+  unsigned char i[16];
>+};
>+volatile union U v = { .f.d = 0x4089 };
>+
>+__attribute__((noipa)) void
>+bar (int x)
>+{
>+  static int i;
>+  switch (i++)
>+    {
>+    case 0: if (x != v.f.d) __builtin_abort (); break;
>+    case 1: if (x != v.f.e) __builtin_abort (); break;
>+    case 2: if (x != v.g[3]) __builtin_abort (); break;
>+    case 3: if (x != v.h[6]) __builtin_abort (); break;
>+    case 4: if (x != v.h[7]) __builtin_abort (); break;
>+    default: __builtin_abort (); break;
>+    }
>+}
>+
>+void
>+foo (unsigned int x)
>+{
>+  union U u;
>+  u.f.d = x >> 2;
>+  u.f.e = 0;
>+  bar (u.f.d);
>+  bar (u.f.e);
>+  bar (u.g[3]);
>+  bar (u.h[6]);
>+  bar (u.h[7]);
>+}
>+
>+int
>+main ()
>+{
>+  foo (0x10224);
>+  return 0;
>+}
>+#else
>+int
>+main ()
>+{
>+  return 0;
>+}
>+#endif
>
>	Jakub
Christophe Lyon Feb. 8, 2019, 9:19 p.m. UTC | #2
On Fri, 8 Feb 2019 at 20:00, Richard Biener <rguenther@suse.de> wrote:
>
> On February 8, 2019 7:22:48 PM GMT+01:00, Jakub Jelinek <jakub@redhat.com> wrote:
> >Hi!
> >
> >The following testcase distilled from
> >https://gcc.gnu.org/bugzilla/show_bug.cgi?id=88739#c0
> >aborts on s390x-linux when compiled with trunk -O2 with r268332
> >reverted (or
> >e.g. with -O2 and gcc 7.x) and succeeds with trunk -O2, or -O0 with any
> >of
> >those compilers.  Tested also on x86_64-linux with -m32/-m64 make
> >check.
> >
> >Ok for trunk?
>
> OK and thanks for the testcase!
>
> Richard.
>
> >2019-02-08  Jakub Jelinek  <jakub@redhat.com>
> >
> >       PR tree-optimization/88739
> >       * gcc.c-torture/execute/pr88739.c: New test.
> >
> >--- gcc/testsuite/gcc.c-torture/execute/pr88739.c.jj   2019-01-27
> >12:44:12.526219828 +0100
> >+++ gcc/testsuite/gcc.c-torture/execute/pr88739.c      2019-02-08
> >18:48:25.880556579 +0100
> >@@ -0,0 +1,59 @@
> >+/* PR tree-optimization/88739 */
> >+#if __SIZEOF_SHORT__ == 2 &&  __SIZEOF_INT__ == 4 && __CHAR_BIT__ == 8
> >+struct A
> >+{
> >+  unsigned int a, b, c;
> >+  unsigned int d : 30;
> >+  unsigned int e : 2;
> >+};
> >+
> >+union U
> >+{
> >+  struct A f;
> >+  unsigned int g[4];
> >+  unsigned short h[8];
> >+  unsigned char i[16];
> >+};
> >+volatile union U v = { .f.d = 0x4089 };
> >+
> >+__attribute__((noipa)) void
> >+bar (int x)
> >+{
> >+  static int i;
> >+  switch (i++)
> >+    {
> >+    case 0: if (x != v.f.d) __builtin_abort (); break;
> >+    case 1: if (x != v.f.e) __builtin_abort (); break;
> >+    case 2: if (x != v.g[3]) __builtin_abort (); break;
> >+    case 3: if (x != v.h[6]) __builtin_abort (); break;
> >+    case 4: if (x != v.h[7]) __builtin_abort (); break;
> >+    default: __builtin_abort (); break;
> >+    }
> >+}
> >+
> >+void
> >+foo (unsigned int x)
> >+{
> >+  union U u;
> >+  u.f.d = x >> 2;
> >+  u.f.e = 0;
> >+  bar (u.f.d);
> >+  bar (u.f.e);
> >+  bar (u.g[3]);
> >+  bar (u.h[6]);
> >+  bar (u.h[7]);
> >+}
> >+
> >+int
> >+main ()
> >+{
> >+  foo (0x10224);
> >+  return 0;
> >+}
> >+#else
> >+int
> >+main ()
> >+{
> >+  return 0;
> >+}
> >+#endif
> >
> >       Jakub
>

Looks more elaborate than what I was deriving from #c0. I'll let you
know if I see some problems on aarch64_be or armeb.

Thanks,

Christophe
diff mbox series

Patch

--- gcc/testsuite/gcc.c-torture/execute/pr88739.c.jj	2019-01-27 12:44:12.526219828 +0100
+++ gcc/testsuite/gcc.c-torture/execute/pr88739.c	2019-02-08 18:48:25.880556579 +0100
@@ -0,0 +1,59 @@ 
+/* PR tree-optimization/88739 */
+#if __SIZEOF_SHORT__ == 2 &&  __SIZEOF_INT__ == 4 && __CHAR_BIT__ == 8
+struct A
+{
+  unsigned int a, b, c;
+  unsigned int d : 30;
+  unsigned int e : 2;
+};
+
+union U
+{
+  struct A f;
+  unsigned int g[4];
+  unsigned short h[8];
+  unsigned char i[16];
+};
+volatile union U v = { .f.d = 0x4089 };
+
+__attribute__((noipa)) void
+bar (int x)
+{
+  static int i;
+  switch (i++)
+    {
+    case 0: if (x != v.f.d) __builtin_abort (); break;
+    case 1: if (x != v.f.e) __builtin_abort (); break;
+    case 2: if (x != v.g[3]) __builtin_abort (); break;
+    case 3: if (x != v.h[6]) __builtin_abort (); break;
+    case 4: if (x != v.h[7]) __builtin_abort (); break;
+    default: __builtin_abort (); break;
+    }
+}
+
+void
+foo (unsigned int x)
+{
+  union U u;
+  u.f.d = x >> 2;
+  u.f.e = 0;
+  bar (u.f.d);
+  bar (u.f.e);
+  bar (u.g[3]);
+  bar (u.h[6]);
+  bar (u.h[7]);
+}
+
+int
+main ()
+{
+  foo (0x10224);
+  return 0;
+}
+#else
+int
+main ()
+{
+  return 0;
+}
+#endif