testsuite: XFAIL gfortran.dg/initialization_25.f90 properly
[official-gcc.git] / gcc / testsuite / gcc.c-torture / execute / builtin-prefetch-4.c
blob054220774f49038284c7d3469ef497b2b8c94336
1 /* Test that __builtin_prefetch does no harm.
3 Check that the expression containing the address to prefetch is
4 evaluated if it has side effects, even if the target does not support
5 data prefetch. Check changes to pointers and to array indices that are
6 either global variables or arguments. */
8 void abort (void);
9 void exit (int);
11 #define ARRSIZE 100
13 int arr[ARRSIZE];
14 int *ptr = &arr[20];
15 int arrindex = 4;
17 /* Check that assignment within a prefetch argument is evaluated. */
19 int
20 assign_arg_ptr (int *p)
22 int *q;
23 __builtin_prefetch ((q = p), 0, 0);
24 return q == p;
27 int
28 assign_glob_ptr (void)
30 int *q;
31 __builtin_prefetch ((q = ptr), 0, 0);
32 return q == ptr;
35 int
36 assign_arg_idx (int *p, int i)
38 int j;
39 __builtin_prefetch (&p[j = i], 0, 0);
40 return j == i;
43 int
44 assign_glob_idx (void)
46 int j;
47 __builtin_prefetch (&ptr[j = arrindex], 0, 0);
48 return j == arrindex;
51 /* Check that pre/post increment/decrement within a prefetch argument are
52 evaluated. */
54 int
55 preinc_arg_ptr (int *p)
57 int *q;
58 q = p + 1;
59 __builtin_prefetch (++p, 0, 0);
60 return p == q;
63 int
64 preinc_glob_ptr (void)
66 int *q;
67 q = ptr + 1;
68 __builtin_prefetch (++ptr, 0, 0);
69 return ptr == q;
72 int
73 postinc_arg_ptr (int *p)
75 int *q;
76 q = p + 1;
77 __builtin_prefetch (p++, 0, 0);
78 return p == q;
81 int
82 postinc_glob_ptr (void)
84 int *q;
85 q = ptr + 1;
86 __builtin_prefetch (ptr++, 0, 0);
87 return ptr == q;
90 int
91 predec_arg_ptr (int *p)
93 int *q;
94 q = p - 1;
95 __builtin_prefetch (--p, 0, 0);
96 return p == q;
99 int
100 predec_glob_ptr (void)
102 int *q;
103 q = ptr - 1;
104 __builtin_prefetch (--ptr, 0, 0);
105 return ptr == q;
109 postdec_arg_ptr (int *p)
111 int *q;
112 q = p - 1;
113 __builtin_prefetch (p--, 0, 0);
114 return p == q;
118 postdec_glob_ptr (void)
120 int *q;
121 q = ptr - 1;
122 __builtin_prefetch (ptr--, 0, 0);
123 return ptr == q;
127 preinc_arg_idx (int *p, int i)
129 int j = i + 1;
130 __builtin_prefetch (&p[++i], 0, 0);
131 return i == j;
136 preinc_glob_idx (void)
138 int j = arrindex + 1;
139 __builtin_prefetch (&ptr[++arrindex], 0, 0);
140 return arrindex == j;
144 postinc_arg_idx (int *p, int i)
146 int j = i + 1;
147 __builtin_prefetch (&p[i++], 0, 0);
148 return i == j;
152 postinc_glob_idx (void)
154 int j = arrindex + 1;
155 __builtin_prefetch (&ptr[arrindex++], 0, 0);
156 return arrindex == j;
160 predec_arg_idx (int *p, int i)
162 int j = i - 1;
163 __builtin_prefetch (&p[--i], 0, 0);
164 return i == j;
168 predec_glob_idx (void)
170 int j = arrindex - 1;
171 __builtin_prefetch (&ptr[--arrindex], 0, 0);
172 return arrindex == j;
176 postdec_arg_idx (int *p, int i)
178 int j = i - 1;
179 __builtin_prefetch (&p[i--], 0, 0);
180 return i == j;
184 postdec_glob_idx (void)
186 int j = arrindex - 1;
187 __builtin_prefetch (&ptr[arrindex--], 0, 0);
188 return arrindex == j;
191 /* Check that function calls within the first prefetch argument are
192 evaluated. */
194 int getptrcnt = 0;
196 int *
197 getptr (int *p)
199 getptrcnt++;
200 return p + 1;
204 funccall_arg_ptr (int *p)
206 __builtin_prefetch (getptr (p), 0, 0);
207 return getptrcnt == 1;
210 int getintcnt = 0;
213 getint (int i)
215 getintcnt++;
216 return i + 1;
220 funccall_arg_idx (int *p, int i)
222 __builtin_prefetch (&p[getint (i)], 0, 0);
223 return getintcnt == 1;
227 main ()
229 if (!assign_arg_ptr (ptr))
230 abort ();
231 if (!assign_glob_ptr ())
232 abort ();
233 if (!assign_arg_idx (ptr, 4))
234 abort ();
235 if (!assign_glob_idx ())
236 abort ();
237 if (!preinc_arg_ptr (ptr))
238 abort ();
239 if (!preinc_glob_ptr ())
240 abort ();
241 if (!postinc_arg_ptr (ptr))
242 abort ();
243 if (!postinc_glob_ptr ())
244 abort ();
245 if (!predec_arg_ptr (ptr))
246 abort ();
247 if (!predec_glob_ptr ())
248 abort ();
249 if (!postdec_arg_ptr (ptr))
250 abort ();
251 if (!postdec_glob_ptr ())
252 abort ();
253 if (!preinc_arg_idx (ptr, 3))
254 abort ();
255 if (!preinc_glob_idx ())
256 abort ();
257 if (!postinc_arg_idx (ptr, 3))
258 abort ();
259 if (!postinc_glob_idx ())
260 abort ();
261 if (!predec_arg_idx (ptr, 3))
262 abort ();
263 if (!predec_glob_idx ())
264 abort ();
265 if (!postdec_arg_idx (ptr, 3))
266 abort ();
267 if (!postdec_glob_idx ())
268 abort ();
269 if (!funccall_arg_ptr (ptr))
270 abort ();
271 if (!funccall_arg_idx (ptr, 3))
272 abort ();
273 exit (0);