From: Jakub Jelinek Date: Fri, 8 Feb 2019 19:01:37 +0000 (+0100) Subject: re PR tree-optimization/88739 (Big-endian union bug) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=ddf321918d35a4f737dda35867c550ab7daf8dfc;p=gcc.git re PR tree-optimization/88739 (Big-endian union bug) PR tree-optimization/88739 * gcc.c-torture/execute/pr88739.c: New test. From-SVN: r268706 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 3269078fa36..814a861d782 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-02-08 Jakub Jelinek + + PR tree-optimization/88739 + * gcc.c-torture/execute/pr88739.c: New test. + 2019-02-08 Jozef Lawrynowicz 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 00000000000..d4b32fbfc2d --- /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