From: Jakub Jelinek Date: Wed, 17 Jan 2018 11:19:16 +0000 (+0100) Subject: re PR tree-optimization/83843 (wrong code at -O2) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b67d554cc2cc01ff69abf2301f1c5ca05ae9b86f;p=gcc.git re PR tree-optimization/83843 (wrong code at -O2) PR tree-optimization/83843 * gcc.dg/store_merging_18.c: Don't expect "Merging successful" on arm. * gcc.dg/store_merging_19.c: New test. From-SVN: r256783 --- diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2e5a53b1d70..807752e25fe 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-01-17 Jakub Jelinek + + PR tree-optimization/83843 + * gcc.dg/store_merging_18.c: Don't expect "Merging successful" on arm. + * gcc.dg/store_merging_19.c: New test. + 2018-01-17 Kyrylo Tkachov * gcc.target/arm/xor-and.c: Fix armv6 effective target checks diff --git a/gcc/testsuite/gcc.dg/store_merging_18.c b/gcc/testsuite/gcc.dg/store_merging_18.c index 43de6ed3d5d..66e157e3272 100644 --- a/gcc/testsuite/gcc.dg/store_merging_18.c +++ b/gcc/testsuite/gcc.dg/store_merging_18.c @@ -1,7 +1,7 @@ /* PR tree-optimization/83843 */ /* { dg-do run } */ /* { dg-options "-O2 -fdump-tree-store-merging" } */ -/* { dg-final { scan-tree-dump-times "Merging successful" 3 "store-merging" { target store_merge } } } */ +/* { dg-final { scan-tree-dump-times "Merging successful" 3 "store-merging" { target { store_merge && { ! arm*-*-* } } } } } */ __attribute__((noipa)) void foo (unsigned char *buf, unsigned char *tab) diff --git a/gcc/testsuite/gcc.dg/store_merging_19.c b/gcc/testsuite/gcc.dg/store_merging_19.c new file mode 100644 index 00000000000..0841bb4deee --- /dev/null +++ b/gcc/testsuite/gcc.dg/store_merging_19.c @@ -0,0 +1,57 @@ +/* PR tree-optimization/83843 */ +/* { dg-do run } */ +/* { dg-options "-O2 -fdump-tree-store-merging" } */ +/* { dg-final { scan-tree-dump-times "Merging successful" 3 "store-merging" { target store_merge } } } */ + +__attribute__((noipa)) void +foo (unsigned char *buf, unsigned char *tab) +{ + tab = __builtin_assume_aligned (tab, 2); + buf = __builtin_assume_aligned (buf, 2); + unsigned v = tab[1] ^ (tab[0] << 8); + buf[0] = ~(v >> 8); + buf[1] = ~v; +} + +__attribute__((noipa)) void +bar (unsigned char *buf, unsigned char *tab) +{ + tab = __builtin_assume_aligned (tab, 2); + buf = __builtin_assume_aligned (buf, 2); + unsigned v = tab[1] ^ (tab[0] << 8); + buf[0] = (v >> 8); + buf[1] = ~v; +} + +__attribute__((noipa)) void +baz (unsigned char *buf, unsigned char *tab) +{ + tab = __builtin_assume_aligned (tab, 2); + buf = __builtin_assume_aligned (buf, 2); + unsigned v = tab[1] ^ (tab[0] << 8); + buf[0] = ~(v >> 8); + buf[1] = v; +} + +int +main () +{ + volatile unsigned char l1 = 0; + volatile unsigned char l2 = 1; + unsigned char buf[2] __attribute__((aligned (2))); + unsigned char tab[2] __attribute__((aligned (2))) = { l1 + 1, l2 * 2 }; + foo (buf, tab); + if (buf[0] != (unsigned char) ~1 || buf[1] != (unsigned char) ~2) + __builtin_abort (); + buf[0] = l1 + 7; + buf[1] = l2 * 8; + bar (buf, tab); + if (buf[0] != 1 || buf[1] != (unsigned char) ~2) + __builtin_abort (); + buf[0] = l1 + 9; + buf[1] = l2 * 10; + baz (buf, tab); + if (buf[0] != (unsigned char) ~1 || buf[1] != 2) + __builtin_abort (); + return 0; +}