1 /* { dg-options "-O2 -fdump-tree-dse-details -fno-tree-fre" } */
2 #include <string.h>
3 #include <stdlib.h>
4 
5 struct X
6 {
7   char mem0[10];
8   char mem1[10];
9 };
10 
11 
12 void blah (struct X);
13 
14 
15 void
foo1()16 foo1()
17 {
18   struct X x = { };
19   memset (x.mem1, 0, sizeof x.mem1);
20   blah (x);
21 }
22 
23 void
foo2()24 foo2()
25 {
26   struct X x = { };
27   x.mem1[5] = 0;
28   blah (x);
29 }
30 
31 void
bar1()32 bar1 ()
33 {
34   struct X x;
35   memset (&x, 0, sizeof x);
36   memset (&x.mem1, 0, sizeof x.mem1);
37   blah (x);
38 }
39 void
bar2()40 bar2 ()
41 {
42   struct X x;
43   memset (&x, 0, sizeof x);
44   x.mem1[5] = 0;
45   blah (x);
46 }
47 
48 void
baz1()49 baz1 ()
50 {
51   struct X *x = calloc (sizeof (struct X), 1);
52   memset (&x->mem1, 0, sizeof x->mem1);
53   blah (*x);
54 }
55 
56 void
baz2()57 baz2 ()
58 {
59   struct X *x = calloc (sizeof (struct X), 1);
60   x->mem1[5] = 0;
61   blah (*x);
62 }
63 /* { dg-final { scan-tree-dump-times "Deleted redundant call" 3 "dse1" } } */
64 /* { dg-final { scan-tree-dump-times "Deleted redundant store" 3 "dse1" } } */
65 
66