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. */
17 /* Check that assignment within a prefetch argument is evaluated. */
20 assign_arg_ptr (int *p
)
23 __builtin_prefetch ((q
= p
), 0, 0);
28 assign_glob_ptr (void)
31 __builtin_prefetch ((q
= ptr
), 0, 0);
36 assign_arg_idx (int *p
, int i
)
39 __builtin_prefetch (&p
[j
= i
], 0, 0);
44 assign_glob_idx (void)
47 __builtin_prefetch (&ptr
[j
= arrindex
], 0, 0);
51 /* Check that pre/post increment/decrement within a prefetch argument are
55 preinc_arg_ptr (int *p
)
59 __builtin_prefetch (++p
, 0, 0);
64 preinc_glob_ptr (void)
68 __builtin_prefetch (++ptr
, 0, 0);
73 postinc_arg_ptr (int *p
)
77 __builtin_prefetch (p
++, 0, 0);
82 postinc_glob_ptr (void)
86 __builtin_prefetch (ptr
++, 0, 0);
91 predec_arg_ptr (int *p
)
95 __builtin_prefetch (--p
, 0, 0);
100 predec_glob_ptr (void)
104 __builtin_prefetch (--ptr
, 0, 0);
109 postdec_arg_ptr (int *p
)
113 __builtin_prefetch (p
--, 0, 0);
118 postdec_glob_ptr (void)
122 __builtin_prefetch (ptr
--, 0, 0);
127 preinc_arg_idx (int *p
, int i
)
130 __builtin_prefetch (&p
[++i
], 0, 0);
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
)
147 __builtin_prefetch (&p
[i
++], 0, 0);
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
)
163 __builtin_prefetch (&p
[--i
], 0, 0);
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
)
179 __builtin_prefetch (&p
[i
--], 0, 0);
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
204 funccall_arg_ptr (int *p
)
206 __builtin_prefetch (getptr (p
), 0, 0);
207 return getptrcnt
== 1;
220 funccall_arg_idx (int *p
, int i
)
222 __builtin_prefetch (&p
[getint (i
)], 0, 0);
223 return getintcnt
== 1;
229 if (!assign_arg_ptr (ptr
))
231 if (!assign_glob_ptr ())
233 if (!assign_arg_idx (ptr
, 4))
235 if (!assign_glob_idx ())
237 if (!preinc_arg_ptr (ptr
))
239 if (!preinc_glob_ptr ())
241 if (!postinc_arg_ptr (ptr
))
243 if (!postinc_glob_ptr ())
245 if (!predec_arg_ptr (ptr
))
247 if (!predec_glob_ptr ())
249 if (!postdec_arg_ptr (ptr
))
251 if (!postdec_glob_ptr ())
253 if (!preinc_arg_idx (ptr
, 3))
255 if (!preinc_glob_idx ())
257 if (!postinc_arg_idx (ptr
, 3))
259 if (!postinc_glob_idx ())
261 if (!predec_arg_idx (ptr
, 3))
263 if (!predec_glob_idx ())
265 if (!postdec_arg_idx (ptr
, 3))
267 if (!postdec_glob_idx ())
269 if (!funccall_arg_ptr (ptr
))
271 if (!funccall_arg_idx (ptr
, 3))