re PR tree-optimization/88739 (Big-endian union bug)
authorJakub Jelinek <jakub@redhat.com>
Fri, 8 Feb 2019 19:01:37 +0000 (20:01 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 8 Feb 2019 19:01:37 +0000 (20:01 +0100)
PR tree-optimization/88739
* gcc.c-torture/execute/pr88739.c: New test.

From-SVN: r268706

gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr88739.c [new file with mode: 0644]

index 3269078fa369b7eb45b1a5c0a63d669dfc33154b..814a861d78205bc0937ea4a58e4f0335e420b727 100644 (file)
@@ -1,3 +1,8 @@
+2019-02-08  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/88739
+       * gcc.c-torture/execute/pr88739.c: New test.
+
 2019-02-08  Jozef Lawrynowicz  <jozef.l@mittosystems.com>
 
        PR testsuite/89258
diff --git a/gcc/testsuite/gcc.c-torture/execute/pr88739.c b/gcc/testsuite/gcc.c-torture/execute/pr88739.c
new file mode 100644 (file)
index 0000000..d4b32fb
--- /dev/null
@@ -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