aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-02-08 20:01:37 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2019-02-08 20:01:37 +0100
commitddf321918d35a4f737dda35867c550ab7daf8dfc (patch)
tree11dc747a6bb2acc71a198f9432e796aa25eb6d14 /gcc
parent82396b8cfb651c9d7ae108d33648ff5cb7b9bce0 (diff)
downloadgcc-ddf321918d35a4f737dda35867c550ab7daf8dfc.zip
gcc-ddf321918d35a4f737dda35867c550ab7daf8dfc.tar.gz
gcc-ddf321918d35a4f737dda35867c550ab7daf8dfc.tar.bz2
re PR tree-optimization/88739 (Big-endian union bug)
PR tree-optimization/88739 * gcc.c-torture/execute/pr88739.c: New test. From-SVN: r268706
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr88739.c59
2 files changed, 64 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3269078..814a861 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..d4b32fb
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/pr88739.c
@@ -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