/* { dg-options "-O2 -fdump-tree-dse-details -fno-tree-fre" } */ #include #include struct X { char mem0[10]; char mem1[10]; }; void blah (struct X); void foo1() { struct X x = { }; memset (x.mem1, 0, sizeof x.mem1); blah (x); } void foo2() { struct X x = { }; x.mem1[5] = 0; blah (x); } void bar1 () { struct X x; memset (&x, 0, sizeof x); memset (&x.mem1, 0, sizeof x.mem1); blah (x); } void bar2 () { struct X x; memset (&x, 0, sizeof x); x.mem1[5] = 0; blah (x); } void baz1 () { struct X *x = calloc (sizeof (struct X), 1); memset (&x->mem1, 0, sizeof x->mem1); blah (*x); } void baz2 () { struct X *x = calloc (sizeof (struct X), 1); x->mem1[5] = 0; blah (*x); } /* { dg-final { scan-tree-dump-times "Deleted redundant call" 3 "dse1" } } */ /* { dg-final { scan-tree-dump-times "Deleted redundant store" 3 "dse1" } } */