On Wed, 17 Jan 2018, Jakub Jelinek wrote:

> On Tue, Jan 16, 2018 at 02:19:16PM +0100, Christophe Lyon wrote:
> > I've noticed that this new test fails on arm, eg:
> > arm-none-linux-gnueabihf
> > --with-mode arm
> > --with-cpu cortex-a9
> > --with-fpu neon-fp16
> > FAIL: gcc.dg/store_merging_18.c scan-tree-dump-times store-merging
> > "Merging successful" 3 (found 0 times)
> 
> Ugh, the problem that arm announces itself as a store_merge target when
> it can't do unaligned stores again, so essentially dup of PR83195.
> We really shouldn't lie :(.
> 
> Anyway, for now I've checked in the following which matches what I've done
> for PR83195.
> 
> Better would be to have store_merge_unaligned and store_merge, where
> the former would be current store_merge except for arm, and latter
> would be all targets that can perform store merging (isn't that all except
> targets that don't have 8-bit chars or pdp endianity)?

Ok.

> 2018-01-17  Jakub Jelinek  <ja...@redhat.com>
> 
>       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.
> 
> --- gcc/testsuite/gcc.dg/store_merging_18.c.jj        2018-01-16 
> 09:52:26.231235131 +0100
> +++ gcc/testsuite/gcc.dg/store_merging_18.c   2018-01-17 12:10:07.862957549 
> +0100
> @@ -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)
> --- gcc/testsuite/gcc.dg/store_merging_19.c.jj        2018-01-17 
> 12:10:34.819962003 +0100
> +++ gcc/testsuite/gcc.dg/store_merging_19.c   2018-01-17 12:13:08.425987375 
> +0100
> @@ -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;
> +}
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 
21284 (AG Nuernberg)

Reply via email to