PR tree-optimization/78821
[official-gcc.git] / gcc / testsuite / gcc.dg / store_merging_13.c
blobd4e9ad2d2603d59be318126420ea6e557a1c0d84
1 /* { dg-do compile } */
2 /* { dg-require-effective-target store_merge } */
3 /* { dg-options "-O2 -fdump-tree-store-merging" } */
5 struct S { unsigned char a, b; unsigned short c; unsigned char d, e, f, g; unsigned long long h; };
7 __attribute__((noipa)) void
8 f1 (struct S *p)
10 p->a = 1;
11 p->b = 2;
12 p->c = 3;
13 p->d = 4;
14 p->e = 5;
15 p->f = 6;
16 p->g = 7;
19 __attribute__((noipa)) void
20 f2 (struct S *__restrict p, struct S *__restrict q)
22 p->a = q->a;
23 p->b = q->b;
24 p->c = q->c;
25 p->d = q->d;
26 p->e = q->e;
27 p->f = q->f;
28 p->g = q->g;
31 __attribute__((noipa)) void
32 f3 (struct S *p, struct S *q)
34 unsigned char pa = q->a;
35 unsigned char pb = q->b;
36 unsigned short pc = q->c;
37 unsigned char pd = q->d;
38 unsigned char pe = q->e;
39 unsigned char pf = q->f;
40 unsigned char pg = q->g;
41 p->a = pa;
42 p->b = pb;
43 p->c = pc;
44 p->d = pd;
45 p->e = pe;
46 p->f = pf;
47 p->g = pg;
50 __attribute__((noipa)) void
51 f4 (struct S *p, struct S *q)
53 unsigned char pa = p->a | q->a;
54 unsigned char pb = p->b | q->b;
55 unsigned short pc = p->c | q->c;
56 unsigned char pd = p->d | q->d;
57 unsigned char pe = p->e | q->e;
58 unsigned char pf = p->f | q->f;
59 unsigned char pg = p->g | q->g;
60 p->a = pa;
61 p->b = pb;
62 p->c = pc;
63 p->d = pd;
64 p->e = pe;
65 p->f = pf;
66 p->g = pg;
69 __attribute__((noipa)) void
70 f5 (struct S *p, struct S *q)
72 unsigned char pa = p->a & q->a;
73 unsigned char pb = p->b & q->b;
74 unsigned short pc = p->c & q->c;
75 unsigned char pd = p->d & q->d;
76 unsigned char pe = p->e & q->e;
77 unsigned char pf = p->f & q->f;
78 unsigned char pg = p->g & q->g;
79 p->a = pa;
80 p->b = pb;
81 p->c = pc;
82 p->d = pd;
83 p->e = pe;
84 p->f = pf;
85 p->g = pg;
88 __attribute__((noipa)) void
89 f6 (struct S *p, struct S *q)
91 unsigned char pa = p->a ^ q->a;
92 unsigned char pb = p->b ^ q->b;
93 unsigned short pc = p->c ^ q->c;
94 unsigned char pd = p->d ^ q->d;
95 unsigned char pe = p->e ^ q->e;
96 unsigned char pf = p->f ^ q->f;
97 unsigned char pg = p->g ^ q->g;
98 p->a = pa;
99 p->b = pb;
100 p->c = pc;
101 p->d = pd;
102 p->e = pe;
103 p->f = pf;
104 p->g = pg;
107 struct S s = { 20, 21, 22, 23, 24, 25, 26, 27 };
108 struct S t = { 0x71, 0x72, 0x7f04, 0x78, 0x31, 0x32, 0x34, 0xf1f2f3f4f5f6f7f8ULL };
109 struct S u = { 28, 29, 30, 31, 32, 33, 34, 35 };
110 struct S v = { 36, 37, 38, 39, 40, 41, 42, 43 };
113 main ()
115 asm volatile ("" : : : "memory");
116 f1 (&s);
117 asm volatile ("" : : : "memory");
118 if (s.a != 1 || s.b != 2 || s.c != 3 || s.d != 4
119 || s.e != 5 || s.f != 6 || s.g != 7 || s.h != 27)
120 __builtin_abort ();
121 f2 (&s, &u);
122 asm volatile ("" : : : "memory");
123 if (s.a != 28 || s.b != 29 || s.c != 30 || s.d != 31
124 || s.e != 32 || s.f != 33 || s.g != 34 || s.h != 27)
125 __builtin_abort ();
126 f3 (&s, &v);
127 asm volatile ("" : : : "memory");
128 if (s.a != 36 || s.b != 37 || s.c != 38 || s.d != 39
129 || s.e != 40 || s.f != 41 || s.g != 42 || s.h != 27)
130 __builtin_abort ();
131 f4 (&s, &t);
132 asm volatile ("" : : : "memory");
133 if (s.a != (36 | 0x71) || s.b != (37 | 0x72)
134 || s.c != (38 | 0x7f04) || s.d != (39 | 0x78)
135 || s.e != (40 | 0x31) || s.f != (41 | 0x32)
136 || s.g != (42 | 0x34) || s.h != 27)
137 __builtin_abort ();
138 f3 (&s, &u);
139 f5 (&s, &t);
140 asm volatile ("" : : : "memory");
141 if (s.a != (28 & 0x71) || s.b != (29 & 0x72)
142 || s.c != (30 & 0x7f04) || s.d != (31 & 0x78)
143 || s.e != (32 & 0x31) || s.f != (33 & 0x32)
144 || s.g != (34 & 0x34) || s.h != 27)
145 __builtin_abort ();
146 f2 (&s, &v);
147 f6 (&s, &t);
148 asm volatile ("" : : : "memory");
149 if (s.a != (36 ^ 0x71) || s.b != (37 ^ 0x72)
150 || s.c != (38 ^ 0x7f04) || s.d != (39 ^ 0x78)
151 || s.e != (40 ^ 0x31) || s.f != (41 ^ 0x32)
152 || s.g != (42 ^ 0x34) || s.h != 27)
153 __builtin_abort ();
154 return 0;
157 /* { dg-final { scan-tree-dump-times "Merging successful" 6 "store-merging" } } */