blob: 53a6a74c56fb686401daac4e0d74bf1578bbb7d4 [file] [log] [blame]
/* { dg-do run } */
/* { dg-require-effective-target store_merge } */
/* { dg-options "-O2 -fdump-tree-store-merging" } */
struct S {
unsigned int b1:1;
unsigned int b2:1;
unsigned int b3:1;
unsigned int b4:1;
unsigned int b5:1;
unsigned int b6:27;
};
struct T {
unsigned int b1:1;
unsigned int b2:16;
unsigned int b3:14;
unsigned int b4:1;
};
__attribute__((noipa)) void
foo (struct S *x)
{
x->b1 = 1;
x->b2 = 0;
x->b3 = 1;
x->b4 = 1;
x->b5 = 0;
}
__attribute__((noipa)) void
bar (struct T *x)
{
x->b1 = 1;
x->b2 = 0;
x->b4 = 0;
}
struct S s = { 0, 1, 0, 0, 1, 0x3a5f05a };
struct T t = { 0, 0xf5af, 0x3a5a, 1 };
int
main ()
{
asm volatile ("" : : : "memory");
foo (&s);
bar (&t);
asm volatile ("" : : : "memory");
if (s.b1 != 1 || s.b2 != 0 || s.b3 != 1 || s.b4 != 1 || s.b5 != 0 || s.b6 != 0x3a5f05a)
__builtin_abort ();
if (t.b1 != 1 || t.b2 != 0 || t.b3 != 0x3a5a || t.b4 != 0)
__builtin_abort ();
return 0;
}
/* { dg-final { scan-tree-dump-times "Merging successful" 2 "store-merging" } } */