annotate gcc/testsuite/gcc.dg/pr47893.c @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents 04ced10e8804
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* PR middle-end/47893 */
kono
parents:
diff changeset
2 /* { dg-do run } */
kono
parents:
diff changeset
3 /* { dg-options "-O2" } */
kono
parents:
diff changeset
4 /* { dg-additional-options "-mtune=atom -fno-omit-frame-pointer -fno-strict-aliasing" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
kono
parents:
diff changeset
5 /* { dg-skip-if "Too much RAM needed" { "avr-*-*" } } */
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 extern void abort (void);
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 struct S
kono
parents:
diff changeset
10 {
kono
parents:
diff changeset
11 unsigned s1:4, s2:2, s3:2, s4:2, s5:2, s6:1, s7:1, s8:1, s9:1, s10:1;
kono
parents:
diff changeset
12 int s11:16; unsigned s12:4; int s13:16; unsigned s14:2;
kono
parents:
diff changeset
13 int s15:16; unsigned s16:4; int s17:16; unsigned s18:2;
kono
parents:
diff changeset
14 };
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 struct T
kono
parents:
diff changeset
17 {
kono
parents:
diff changeset
18 unsigned t[3];
kono
parents:
diff changeset
19 };
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 struct U
kono
parents:
diff changeset
22 {
kono
parents:
diff changeset
23 unsigned u1, u2;
kono
parents:
diff changeset
24 };
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 struct V;
kono
parents:
diff changeset
27
kono
parents:
diff changeset
28 struct W
kono
parents:
diff changeset
29 {
kono
parents:
diff changeset
30 char w1[24]; struct V *w2; unsigned w3; char w4[28912];
kono
parents:
diff changeset
31 unsigned int w5; char w6[60];
kono
parents:
diff changeset
32 };
kono
parents:
diff changeset
33
kono
parents:
diff changeset
34 struct X
kono
parents:
diff changeset
35 {
kono
parents:
diff changeset
36 unsigned int x[2];
kono
parents:
diff changeset
37 };
kono
parents:
diff changeset
38
kono
parents:
diff changeset
39 struct V
kono
parents:
diff changeset
40 {
kono
parents:
diff changeset
41 int v1;
kono
parents:
diff changeset
42 struct X v2[3];
kono
parents:
diff changeset
43 char v3[28];
kono
parents:
diff changeset
44 };
kono
parents:
diff changeset
45
kono
parents:
diff changeset
46 struct Y
kono
parents:
diff changeset
47 {
kono
parents:
diff changeset
48 void *y1;
kono
parents:
diff changeset
49 char y2[3076];
kono
parents:
diff changeset
50 struct T y3[32];
kono
parents:
diff changeset
51 char y4[1052];
kono
parents:
diff changeset
52 };
kono
parents:
diff changeset
53
kono
parents:
diff changeset
54 volatile struct S v1 = { .s15 = -1, .s16 = 15, .s17 = -1, .s18 = 3 };
kono
parents:
diff changeset
55
kono
parents:
diff changeset
56 __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
57 int
kono
parents:
diff changeset
58 fn1 (int x)
kono
parents:
diff changeset
59 {
kono
parents:
diff changeset
60 int r;
kono
parents:
diff changeset
61 __asm__ volatile ("" : "=r" (r) : "0" (1), "r" (x) : "memory");
kono
parents:
diff changeset
62 return r;
kono
parents:
diff changeset
63 }
kono
parents:
diff changeset
64
kono
parents:
diff changeset
65 volatile int cnt;
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
68 #ifdef __i386__
kono
parents:
diff changeset
69 __attribute__ ((regparm (2)))
kono
parents:
diff changeset
70 #endif
kono
parents:
diff changeset
71 struct S
kono
parents:
diff changeset
72 fn2 (struct Y *x, const struct X *y)
kono
parents:
diff changeset
73 {
kono
parents:
diff changeset
74 if (++cnt > 1)
kono
parents:
diff changeset
75 abort ();
kono
parents:
diff changeset
76 __asm__ volatile ("" : : "r" (x), "r" (y) : "memory");
kono
parents:
diff changeset
77 return v1;
kono
parents:
diff changeset
78 }
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
81 void fn3 (void *x, unsigned y, const struct S *z, unsigned w)
kono
parents:
diff changeset
82 {
kono
parents:
diff changeset
83 __asm__ volatile ("" : : "r" (x), "r" (y), "r" (z), "r" (w) : "memory");
kono
parents:
diff changeset
84 }
kono
parents:
diff changeset
85
kono
parents:
diff changeset
86 volatile struct U v2;
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
89 struct U
kono
parents:
diff changeset
90 fn4 (void *x, unsigned y)
kono
parents:
diff changeset
91 {
kono
parents:
diff changeset
92 __asm__ volatile ("" : : "r" (x), "r" (y) : "memory");
kono
parents:
diff changeset
93 return v2;
kono
parents:
diff changeset
94 }
kono
parents:
diff changeset
95
kono
parents:
diff changeset
96 __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
97 struct S
kono
parents:
diff changeset
98 fn5 (void *x)
kono
parents:
diff changeset
99 {
kono
parents:
diff changeset
100 __asm__ volatile ("" : : "r" (x) : "memory");
kono
parents:
diff changeset
101 return v1;
kono
parents:
diff changeset
102 }
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 volatile struct T v3;
kono
parents:
diff changeset
105
kono
parents:
diff changeset
106 __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
107 struct T fn6 (void *x)
kono
parents:
diff changeset
108 {
kono
parents:
diff changeset
109 __asm__ volatile ("" : : "r" (x) : "memory");
kono
parents:
diff changeset
110 return v3;
kono
parents:
diff changeset
111 }
kono
parents:
diff changeset
112
kono
parents:
diff changeset
113 __attribute__ ((noinline, noclone))
kono
parents:
diff changeset
114 struct T fn7 (void *x, unsigned y, unsigned z)
kono
parents:
diff changeset
115 {
kono
parents:
diff changeset
116 __asm__ volatile ("" : : "r" (x), "r" (y), "r" (z) : "memory");
kono
parents:
diff changeset
117 return v3;
kono
parents:
diff changeset
118 }
kono
parents:
diff changeset
119
kono
parents:
diff changeset
120 static void
kono
parents:
diff changeset
121 fn8 (struct Y *x, const struct V *y)
kono
parents:
diff changeset
122 {
kono
parents:
diff changeset
123 void *a = x->y1;
kono
parents:
diff changeset
124 struct S b[4];
kono
parents:
diff changeset
125 unsigned i, c;
kono
parents:
diff changeset
126 c = fn1 (y->v1);
kono
parents:
diff changeset
127 for (i = 0; i < c; i++)
kono
parents:
diff changeset
128 b[i] = fn2 (x, &y->v2[i]);
kono
parents:
diff changeset
129 fn3 (a, y->v1, b, c);
kono
parents:
diff changeset
130 }
kono
parents:
diff changeset
131
kono
parents:
diff changeset
132 static inline void
kono
parents:
diff changeset
133 fn9 (void *x, struct S y __attribute__((unused)))
kono
parents:
diff changeset
134 {
kono
parents:
diff changeset
135 fn4 (x, 8);
kono
parents:
diff changeset
136 }
kono
parents:
diff changeset
137
kono
parents:
diff changeset
138 static void
kono
parents:
diff changeset
139 fn10 (struct Y *x)
kono
parents:
diff changeset
140 {
kono
parents:
diff changeset
141 void *a = x->y1;
kono
parents:
diff changeset
142 struct T b __attribute__((unused)) = fn6 (a);
kono
parents:
diff changeset
143 fn9 (a, fn5 (a));
kono
parents:
diff changeset
144 }
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 __attribute__((noinline, noclone))
kono
parents:
diff changeset
147 int
kono
parents:
diff changeset
148 fn11 (unsigned int x, void *y, const struct W *z,
kono
parents:
diff changeset
149 unsigned int w, const char *v, const char *u)
kono
parents:
diff changeset
150 {
kono
parents:
diff changeset
151 struct Y a, *t;
kono
parents:
diff changeset
152 unsigned i;
kono
parents:
diff changeset
153 t = &a;
kono
parents:
diff changeset
154 __builtin_memset (t, 0, sizeof *t);
kono
parents:
diff changeset
155 t->y1 = y;
kono
parents:
diff changeset
156 if (x == 0)
kono
parents:
diff changeset
157 {
kono
parents:
diff changeset
158 if (z->w3 & 1)
kono
parents:
diff changeset
159 fn10 (t);
kono
parents:
diff changeset
160 for (i = 0; i < w; i++)
kono
parents:
diff changeset
161 {
kono
parents:
diff changeset
162 if (v[i] == 0)
kono
parents:
diff changeset
163 t->y3[i] = fn7 (y, 0, u[i]);
kono
parents:
diff changeset
164 else
kono
parents:
diff changeset
165 return 0;
kono
parents:
diff changeset
166 }
kono
parents:
diff changeset
167 }
kono
parents:
diff changeset
168 else
kono
parents:
diff changeset
169 for (i = 0; i < w; i++)
kono
parents:
diff changeset
170 t->y3[i] = fn7 (y, v[i], u[i]);
kono
parents:
diff changeset
171 for (i = 0; i < z->w5; i++)
kono
parents:
diff changeset
172 fn8 (t, &z->w2[i]);
kono
parents:
diff changeset
173 return 0;
kono
parents:
diff changeset
174 }
kono
parents:
diff changeset
175
kono
parents:
diff changeset
176 volatile int i;
kono
parents:
diff changeset
177 const char *volatile p = "";
kono
parents:
diff changeset
178
kono
parents:
diff changeset
179 int
kono
parents:
diff changeset
180 main ()
kono
parents:
diff changeset
181 {
kono
parents:
diff changeset
182 struct V v = { .v1 = 0 };
kono
parents:
diff changeset
183 struct W w = { .w5 = 1, .w2 = &v };
kono
parents:
diff changeset
184 fn11 (i + 1, (void *) p, &w, i, (const char *) p, (const char *) p);
kono
parents:
diff changeset
185 if (cnt != 1)
kono
parents:
diff changeset
186 abort ();
kono
parents:
diff changeset
187 return 0;
kono
parents:
diff changeset
188 }