GIMPLE store merging pass
[official-gcc.git] / gcc / testsuite / gcc.c-torture / execute / pr22141-2.c
blobcb9cc79026310260ffc3a83bfdf9bfc92f998a86
1 /* PR middle-end/22141 */
3 extern void abort (void);
5 struct S
7 struct T
9 char a;
10 char b;
11 char c;
12 char d;
13 } t;
14 } u __attribute__((aligned));
16 struct U
18 struct S s[4];
21 void __attribute__((noinline))
22 c1 (struct T *p)
24 if (p->a != 1 || p->b != 2 || p->c != 3 || p->d != 4)
25 abort ();
26 __builtin_memset (p, 0xaa, sizeof (*p));
29 void __attribute__((noinline))
30 c2 (struct S *p)
32 c1 (&p->t);
35 void __attribute__((noinline))
36 c3 (struct U *p)
38 c2 (&p->s[2]);
41 void __attribute__((noinline))
42 f1 (void)
44 u = (struct S) { { 1, 2, 3, 4 } };
47 void __attribute__((noinline))
48 f2 (void)
50 u.t.a = 1;
51 u.t.b = 2;
52 u.t.c = 3;
53 u.t.d = 4;
56 void __attribute__((noinline))
57 f3 (void)
59 u.t.d = 4;
60 u.t.b = 2;
61 u.t.a = 1;
62 u.t.c = 3;
65 void __attribute__((noinline))
66 f4 (void)
68 struct S v __attribute__((aligned));
69 v.t.a = 1;
70 v.t.b = 2;
71 v.t.c = 3;
72 v.t.d = 4;
73 c2 (&v);
76 void __attribute__((noinline))
77 f5 (struct S *p)
79 p->t.a = 1;
80 p->t.c = 3;
81 p->t.d = 4;
82 p->t.b = 2;
85 void __attribute__((noinline))
86 f6 (void)
88 struct U v __attribute__((aligned));
89 v.s[2].t.a = 1;
90 v.s[2].t.b = 2;
91 v.s[2].t.c = 3;
92 v.s[2].t.d = 4;
93 c3 (&v);
96 void __attribute__((noinline))
97 f7 (struct U *p)
99 p->s[2].t.a = 1;
100 p->s[2].t.c = 3;
101 p->s[2].t.d = 4;
102 p->s[2].t.b = 2;
106 main (void)
108 struct U w __attribute__((aligned));
109 f1 ();
110 c2 (&u);
111 f2 ();
112 c1 (&u.t);
113 f3 ();
114 c2 (&u);
115 f4 ();
116 f5 (&u);
117 c2 (&u);
118 f6 ();
119 f7 (&w);
120 c3 (&w);
121 return 0;