1/* Test that __builtin_prefetch does no harm.
2
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.  */
7
8#define ARRSIZE 100
9
10int arr[ARRSIZE];
11int *ptr = &arr[20];
12int arrindex = 4;
13
14/* Check that assignment within a prefetch argument is evaluated.  */
15
16int
17assign_arg_ptr (int *p)
18{
19  int *q;
20  __builtin_prefetch ((q = p), 0, 0);
21  return q == p;
22}
23
24int
25assign_glob_ptr (void)
26{
27  int *q;
28  __builtin_prefetch ((q = ptr), 0, 0);
29  return q == ptr;
30}
31
32int
33assign_arg_idx (int *p, int i)
34{
35  int j;
36  __builtin_prefetch (&p[j = i], 0, 0);
37  return j == i;
38}
39
40int
41assign_glob_idx (void)
42{
43  int j;
44  __builtin_prefetch (&ptr[j = arrindex], 0, 0);
45  return j == arrindex;
46}
47
48/* Check that pre/post increment/decrement within a prefetch argument are
49   evaluated.  */
50
51int
52preinc_arg_ptr (int *p)
53{
54  int *q;
55  q = p + 1;
56  __builtin_prefetch (++p, 0, 0);
57  return p == q;
58}
59
60int
61preinc_glob_ptr (void)
62{
63  int *q;
64  q = ptr + 1;
65  __builtin_prefetch (++ptr, 0, 0);
66  return ptr == q;
67}
68
69int
70postinc_arg_ptr (int *p)
71{
72  int *q;
73  q = p + 1;
74  __builtin_prefetch (p++, 0, 0);
75  return p == q;
76}
77
78int
79postinc_glob_ptr (void)
80{
81  int *q;
82  q = ptr + 1;
83  __builtin_prefetch (ptr++, 0, 0);
84  return ptr == q;
85}
86
87int
88predec_arg_ptr (int *p)
89{
90  int *q;
91  q = p - 1;
92  __builtin_prefetch (--p, 0, 0);
93  return p == q;
94}
95
96int
97predec_glob_ptr (void)
98{
99  int *q;
100  q = ptr - 1;
101  __builtin_prefetch (--ptr, 0, 0);
102  return ptr == q;
103}
104
105int
106postdec_arg_ptr (int *p)
107{
108  int *q;
109  q = p - 1;
110  __builtin_prefetch (p--, 0, 0);
111  return p == q;
112}
113
114int
115postdec_glob_ptr (void)
116{
117  int *q;
118  q = ptr - 1;
119  __builtin_prefetch (ptr--, 0, 0);
120  return ptr == q;
121}
122
123int
124preinc_arg_idx (int *p, int i)
125{
126  int j = i + 1;
127  __builtin_prefetch (&p[++i], 0, 0);
128  return i == j;
129}
130
131
132int
133preinc_glob_idx (void)
134{
135  int j = arrindex + 1;
136  __builtin_prefetch (&ptr[++arrindex], 0, 0);
137  return arrindex == j;
138}
139
140int
141postinc_arg_idx (int *p, int i)
142{
143  int j = i + 1;
144  __builtin_prefetch (&p[i++], 0, 0);
145  return i == j;
146}
147
148int
149postinc_glob_idx (void)
150{
151  int j = arrindex + 1;
152  __builtin_prefetch (&ptr[arrindex++], 0, 0);
153  return arrindex == j;
154}
155
156int
157predec_arg_idx (int *p, int i)
158{
159  int j = i - 1;
160  __builtin_prefetch (&p[--i], 0, 0);
161  return i == j;
162}
163
164int
165predec_glob_idx (void)
166{
167  int j = arrindex - 1;
168  __builtin_prefetch (&ptr[--arrindex], 0, 0);
169  return arrindex == j;
170}
171
172int
173postdec_arg_idx (int *p, int i)
174{
175  int j = i - 1;
176  __builtin_prefetch (&p[i--], 0, 0);
177  return i == j;
178}
179
180int
181postdec_glob_idx (void)
182{
183  int j = arrindex - 1;
184  __builtin_prefetch (&ptr[arrindex--], 0, 0);
185  return arrindex == j;
186}
187
188/* Check that function calls within the first prefetch argument are
189   evaluated.  */
190
191int getptrcnt = 0;
192
193int *
194getptr (int *p)
195{
196  getptrcnt++;
197  return p + 1;
198}
199
200int
201funccall_arg_ptr (int *p)
202{
203  __builtin_prefetch (getptr (p), 0, 0);
204  return getptrcnt == 1;
205}
206
207int getintcnt = 0;
208
209int
210getint (int i)
211{
212  getintcnt++;
213  return i + 1;
214}
215
216int
217funccall_arg_idx (int *p, int i)
218{
219  __builtin_prefetch (&p[getint (i)], 0, 0);
220  return getintcnt == 1;
221}
222
223int
224main ()
225{
226  if (!assign_arg_ptr (ptr))
227    abort ();
228  if (!assign_glob_ptr ())
229    abort ();
230  if (!assign_arg_idx (ptr, 4))
231    abort ();
232  if (!assign_glob_idx ())
233    abort ();
234  if (!preinc_arg_ptr (ptr))
235    abort ();
236  if (!preinc_glob_ptr ())
237    abort ();
238  if (!postinc_arg_ptr (ptr))
239    abort ();
240  if (!postinc_glob_ptr ())
241    abort ();
242  if (!predec_arg_ptr (ptr))
243    abort ();
244  if (!predec_glob_ptr ())
245    abort ();
246  if (!postdec_arg_ptr (ptr))
247    abort ();
248  if (!postdec_glob_ptr ())
249    abort ();
250  if (!preinc_arg_idx (ptr, 3))
251    abort ();
252  if (!preinc_glob_idx ())
253    abort ();
254  if (!postinc_arg_idx (ptr, 3))
255    abort ();
256  if (!postinc_glob_idx ())
257    abort ();
258  if (!predec_arg_idx (ptr, 3))
259    abort ();
260  if (!predec_glob_idx ())
261    abort ();
262  if (!postdec_arg_idx (ptr, 3))
263    abort ();
264  if (!postdec_glob_idx ())
265    abort ();
266  if (!funccall_arg_ptr (ptr))
267    abort ();
268  if (!funccall_arg_idx (ptr, 3))
269    abort ();
270  exit (0);
271}
272