Message ID | 20190208182248.GE2135@tucnak |
---|---|
State | New |
Headers | show |
Series | Add testcase for PR tree-optimization/88739 | expand |
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
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
--- 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