blob: 8cd29f4243c15730224156ca4bb8dc233f615aef [file] [log] [blame]
/* { dg-do run } */
/* { dg-require-effective-target store_merge } */
/* { dg-options "-O2 -fdump-tree-store-merging" } */
struct bar
{
int a;
unsigned char b;
unsigned char c;
short d;
unsigned char e;
unsigned char f;
unsigned char g;
};
__attribute__ ((noinline)) void
foozero (struct bar *p)
{
p->b = 0;
p->a = 0;
p->c = 0;
p->d = 0;
p->e = 0;
p->f = 0;
p->g = 0;
}
__attribute__ ((noinline)) void
foo1 (struct bar *p)
{
p->b = 1;
p->a = 2;
p->c = 3;
p->d = 4;
p->e = 5;
p->f = 0;
p->g = 0xff;
}
__attribute__ ((noinline)) void
foo2 (struct bar *p, struct bar *p2)
{
p->b = 0xff;
p2->b = 0xa;
p->a = 0xfffff;
p2->c = 0xc;
p->c = 0xff;
p2->d = 0xbf;
p->d = 0xfff;
}
int
main (void)
{
struct bar b1, b2;
foozero (&b1);
foozero (&b2);
foo1 (&b1);
if (b1.b != 1 || b1.a != 2 || b1.c != 3 || b1.d != 4 || b1.e != 5
|| b1.f != 0 || b1.g != 0xff)
__builtin_abort ();
foozero (&b1);
/* Make sure writes to aliasing struct pointers preserve the
correct order. */
foo2 (&b1, &b1);
if (b1.b != 0xa || b1.a != 0xfffff || b1.c != 0xff || b1.d != 0xfff)
__builtin_abort ();
foozero (&b1);
foo2 (&b1, &b2);
if (b1.a != 0xfffff || b1.b != 0xff || b1.c != 0xff || b1.d != 0xfff
|| b2.b != 0xa || b2.c != 0xc || b2.d != 0xbf)
__builtin_abort ();
return 0;
}
/* { dg-final { scan-tree-dump-times "Merging successful" 2 "store-merging" } } */