xfail scan-tree-dump-not throw in g++.dg/pr99966.C on hppa*64*-*-*
[official-gcc.git] / libgomp / testsuite / libgomp.c-c++-common / allocate-1.c
blobd3af3b8170e4864e20542648a410cceb87df7189
1 #include <omp.h>
2 #include <stdlib.h>
3 #include <stdint.h>
5 struct S { int a, b; };
7 void
8 foo (int x, int *p, int *q, int px, omp_allocator_handle_t h, int fl)
10 int y = 0, r = 0, i, i1, l, l2[4], l3, n = 8;
11 int i2, j2, n2 = 9, l4;
12 int i3, j3, n3 = 10, l5;
13 int i4, j4, n4 = 11, l6;
14 int i5, n5;
15 int v[x], w[x];
16 int r2[4] = { 0, 0, 0, 0 };
17 int xo = x;
18 struct S s = { 27, 29 };
19 for (i = 0; i < 4; i++)
20 p[i] = 0;
21 for (i = 0; i < 3; i++)
22 q[i] = 0;
23 for (i = 0; i < x; i++)
24 w[i] = i;
25 #pragma omp parallel private (y, v) firstprivate (x) allocate (x, y, v)
27 int *volatile p1 = &x;
28 int *volatile p2 = &y;
29 if (x != 42)
30 abort ();
31 #pragma omp barrier
32 *p2 = 1;
33 p1[0]++;
34 v[0] = 7;
35 v[41] = 8;
36 #pragma omp barrier
37 if (x != 43 || y != 1)
38 abort ();
39 if (v[0] != 7 || v[41] != 8)
40 abort ();
41 if ((fl & 2) && (((uintptr_t) p1 | (uintptr_t) p2
42 | (uintptr_t) &v[0]) & 63) != 0)
43 abort ();
45 x = xo;
46 #pragma omp teams
47 #pragma omp parallel private (y) firstprivate (x, w) allocate (h: x, y, w)
49 int *volatile p1 = &x;
50 int *volatile p2 = &y;
51 if (x != 42 || w[17] != 17 || w[41] != 41)
52 abort ();
53 #pragma omp barrier
54 *p2 = 1;
55 p1[0]++;
56 w[19]++;
57 #pragma omp barrier
58 if (x != 43 || y != 1 || w[19] != 20)
59 abort ();
60 if ((fl & 1) && (((uintptr_t) p1 | (uintptr_t) p2
61 | (uintptr_t) &w[0]) & 63) != 0)
62 abort ();
64 x = xo;
65 #pragma omp parallel for private (y) firstprivate (x) allocate (h: x, y, r, l, n) reduction(+: r) lastprivate (l) linear (n: 16)
66 for (i = 0; i < 64; i++)
68 if (x != 42)
69 abort ();
70 y = 1;
71 l = i;
72 n += y + 15;
73 r += i;
74 if ((fl & 1) && (((uintptr_t) &x | (uintptr_t) &y | (uintptr_t) &r
75 | (uintptr_t) &l | (uintptr_t) &n) & 63) != 0)
76 abort ();
78 x = xo;
79 #pragma omp parallel
81 #pragma omp for lastprivate (l2) private (i1) allocate (h: l2, l3, i1) lastprivate (conditional: l3)
82 for (i1 = 0; i1 < 64; i1++)
84 l2[0] = i1;
85 l2[1] = i1 + 1;
86 l2[2] = i1 + 2;
87 l2[3] = i1 + 3;
88 if (i1 < 37)
89 l3 = i1;
90 if ((fl & 1) && (((uintptr_t) &l2[0] | (uintptr_t) &l3 | (uintptr_t) &i1) & 63) != 0)
91 abort ();
93 #pragma omp for collapse(2) lastprivate(l4, i2, j2) linear (n2:17) allocate (h: n2, l4, i2, j2)
94 for (i2 = 3; i2 < 5; i2++)
95 for (j2 = 17; j2 < 22; j2 += 2)
97 n2 += 17;
98 l4 = i2 * 31 + j2;
99 if ((fl & 1) && (((uintptr_t) &l4 | (uintptr_t) &n2
100 | (uintptr_t) &i2 | (uintptr_t) &j2) & 63) != 0)
101 abort ();
103 #pragma omp for collapse(2) lastprivate(l5, i3, j3) linear (n3:17) schedule (static, 3) allocate (n3, l5, i3, j3)
104 for (i3 = 3; i3 < 5; i3++)
105 for (j3 = 17; j3 < 23; j3 += 2)
107 n3 += 17;
108 l5 = i3 * 31 + j3;
109 if ((fl & 2) && (((uintptr_t) &l5 | (uintptr_t) &n3
110 | (uintptr_t) &i3 | (uintptr_t) &j3) & 63) != 0)
111 abort ();
113 #pragma omp for collapse(2) lastprivate(l6, i4, j4) linear (n4:17) schedule (dynamic) allocate (h: n4, l6, i4, j4)
114 for (i4 = 3; i4 < 5; i4++)
115 for (j4 = 17; j4 < 22; j4 += 2)
117 n4 += 17;
118 l6 = i4 * 31 + j4;
119 if ((fl & 1) && (((uintptr_t) &l6 | (uintptr_t) &n4
120 | (uintptr_t) &i4 | (uintptr_t) &j4) & 63) != 0)
121 abort ();
123 #pragma omp for lastprivate (i5) allocate (i5)
124 for (i5 = 1; i5 < 17; i5 += 3)
126 if ((fl & 2) && (((uintptr_t) &i5) & 63) != 0)
127 abort ();
129 #pragma omp for reduction(+:p[2:px], q[:3], r2) allocate(h: p, q, r2)
130 for (i = 0; i < 32; i++)
132 p[2] += i;
133 p[3] += 2 * i;
134 q[0] += 3 * i;
135 q[2] += 4 * i;
136 r2[0] += 5 * i;
137 r2[3] += 6 * i;
138 /* Can't really rely on alignment of &p[0], the implementation could
139 allocate the whole array or do what GCC does and allocate only part
140 of it. */
141 if ((fl & 1) && (((uintptr_t) &q[0] | (uintptr_t) &r2[0]) & 63) != 0)
142 abort ();
144 #pragma omp task private(y) firstprivate(x) allocate(x, y)
146 int *volatile p1 = &x;
147 int *volatile p2 = &y;
148 if (x != 42)
149 abort ();
150 p1[0]++;
151 p2[0] = 21;
152 if (x != 43 || y != 21)
153 abort ();
154 if ((fl & 2) && (((uintptr_t) p1 | (uintptr_t) p2) & 63) != 0)
155 abort ();
157 #pragma omp task private(y) firstprivate(x) allocate(h: x, y)
159 int *volatile p1 = &x;
160 int *volatile p2 = &y;
161 if (x != 42)
162 abort ();
163 p1[0]++;
164 p2[0] = 21;
165 if (x != 43 || y != 21)
166 abort ();
167 if ((fl & 1) && (((uintptr_t) p1 | (uintptr_t) p2) & 63) != 0)
168 abort ();
170 #pragma omp task private(y) firstprivate(s) allocate(s, y)
172 int *volatile p1 = &s.a;
173 int *volatile p2 = &s.b;
174 int *volatile p3 = &y;
175 if (s.a != 27 || s.b != 29)
176 abort ();
177 p1[0]++;
178 p2[0]++;
179 p3[0] = 21;
180 if (s.a != 28 || s.b != 30 || y != 21)
181 abort ();
182 if ((fl & 2) && (((uintptr_t) p1 | (uintptr_t) p3) & 63) != 0)
183 abort ();
185 #pragma omp task private(y) firstprivate(s) allocate(h: s, y)
187 int *volatile p1 = &s.a;
188 int *volatile p2 = &s.b;
189 int *volatile p3 = &y;
190 if (s.a != 27 || s.b != 29)
191 abort ();
192 p1[0]++;
193 p2[0]++;
194 p3[0] = 21;
195 if (s.a != 28 || s.b != 30 || y != 21)
196 abort ();
197 if ((fl & 1) && (((uintptr_t) p1 | (uintptr_t) p3) & 63) != 0)
198 abort ();
201 if (r != 64 * 63 / 2 || l != 63 || n != 8 + 16 * 64)
202 abort ();
203 if (l2[0] != 63 || l2[1] != 63 + 1 || l2[2] != 63 + 2 || l2[3] != 63 + 3 || l3 != 36)
204 abort ();
205 if (i2 != 5 || j2 != 23 || n2 != 9 + 6 * 17 || l4 != 4 * 31 + 21)
206 abort ();
207 if (i3 != 5 || j3 != 23 || n3 != 10 + 6 * 17 || l5 != 4 * 31 + 21)
208 abort ();
209 if (i4 != 5 || j4 != 23 || n4 != 11 + 6 * 17 || l6 != 4 * 31 + 21)
210 abort ();
211 if (i5 != 19)
212 abort ();
213 if (p[2] != (32 * 31) / 2 || p[3] != 2 * (32 * 31) / 2
214 || q[0] != 3 * (32 * 31) / 2 || q[2] != 4 * (32 * 31) / 2
215 || r2[0] != 5 * (32 * 31) / 2 || r2[3] != 6 * (32 * 31) / 2)
216 abort ();
217 r = 0;
218 x = xo;
219 #pragma omp parallel shared (x, y, r, n5) firstprivate (h)
221 #pragma omp masked
222 n5 = omp_get_num_threads ();
223 #pragma omp scope private (y) firstprivate (x) reduction(+:r) \
224 allocate (h: x, y, r)
226 int *volatile p1 = &x;
227 int *volatile p2 = &y;
228 int *volatile p3 = &r;
229 if (x != 42)
230 abort ();
231 #pragma omp barrier
232 *p2 = 1;
233 p1[0]++;
234 p3[0]++;
235 #pragma omp barrier
236 if (x != 43 || y != 1 || r != 1)
237 abort ();
238 if ((fl & 1) && (((uintptr_t) p1 | (uintptr_t) p2
239 | (uintptr_t) p3) & 63) != 0)
240 abort ();
243 if (x != 42 || r != n5)
244 abort ();
247 void
248 bar (int x, omp_allocator_handle_t h)
250 int y = 0, r = 0, i, i1, l, l2[4], l3, n = 8;
251 int i2, j2, n2 = 9, l4;
252 int i3, j3, n3 = 10, l5;
253 int i4, j4, n4 = 11, l6;
254 int i5;
255 struct S s = { 27, 29 };
256 int xo = x;
257 #pragma omp parallel private (y) firstprivate (x) allocate (x, y)
259 if (x != 42)
260 abort ();
261 #pragma omp barrier
262 y = 1;
263 x++;
264 #pragma omp barrier
265 if (x != 43 || y != 1)
266 abort ();
268 x = xo;
269 #pragma omp teams
270 #pragma omp parallel private (y) firstprivate (x) allocate (h: x, y)
272 if (x != 42)
273 abort ();
274 #pragma omp barrier
275 y = 1;
276 x++;
277 #pragma omp barrier
278 if (x != 43 || y != 1)
279 abort ();
281 x = xo;
282 #pragma omp parallel for private (y) firstprivate (x) allocate (h: x, y, r, l, n) reduction(+: r) lastprivate (l) linear (n: 16)
283 for (i = 0; i < 64; i++)
285 if (x != 42)
286 abort ();
287 y = 1;
288 l = i;
289 n += y + 15;
290 r += i;
292 x = xo;
293 #pragma omp parallel
295 #pragma omp for lastprivate (l2) private (i1) allocate (h: l2, l3, i1) lastprivate (conditional: l3)
296 for (i1 = 0; i1 < 64; i1++)
298 l2[0] = i1;
299 l2[1] = i1 + 1;
300 l2[2] = i1 + 2;
301 l2[3] = i1 + 3;
302 if (i1 < 37)
303 l3 = i1;
305 #pragma omp for collapse(2) lastprivate(l4, i2, j2) linear (n2:17) allocate (h: n2, l4, i2, j2)
306 for (i2 = 3; i2 < 5; i2++)
307 for (j2 = 17; j2 < 22; j2 += 2)
309 n2 += 17;
310 l4 = i2 * 31 + j2;
312 #pragma omp for collapse(2) lastprivate(l5, i3, j3) linear (n3:17) schedule (static, 3) allocate (n3, l5, i3, j3)
313 for (i3 = 3; i3 < 5; i3++)
314 for (j3 = 17; j3 < 23; j3 += 2)
316 n3 += 17;
317 l5 = i3 * 31 + j3;
319 #pragma omp for collapse(2) lastprivate(l6, i4, j4) linear (n4:17) schedule (dynamic) allocate (h: n4, l6, i4, j4)
320 for (i4 = 3; i4 < 5; i4++)
321 for (j4 = 17; j4 < 22; j4 += 2)
323 n4 += 17;
324 l6 = i4 * 31 + j4;
326 #pragma omp for lastprivate (i5) allocate (i5)
327 for (i5 = 1; i5 < 17; i5 += 3)
329 #pragma omp task private(y) firstprivate(x) allocate(x, y)
331 if (x != 42)
332 abort ();
333 x++;
334 y = 21;
335 if (x != 43 || y != 21)
336 abort ();
338 #pragma omp task private(y) firstprivate(x) allocate(h: x, y)
340 if (x != 42)
341 abort ();
342 x++;
343 y = 21;
344 if (x != 43 || y != 21)
345 abort ();
347 #pragma omp task private(y) firstprivate(s) allocate(s, y)
349 if (s.a != 27 || s.b != 29)
350 abort ();
351 s.a++;
352 s.b++;
353 y = 21;
354 if (s.a != 28 || s.b != 30 || y != 21)
355 abort ();
357 #pragma omp task private(y) firstprivate(s) allocate(h: s, y)
359 if (s.a != 27 || s.b != 29)
360 abort ();
361 s.a++;
362 s.b++;
363 y = 21;
364 if (s.a != 28 || s.b != 30 || y != 21)
365 abort ();
368 if (r != 64 * 63 / 2 || l != 63 || n != 8 + 16 * 64)
369 abort ();
370 if (l2[0] != 63 || l2[1] != 63 + 1 || l2[2] != 63 + 2 || l2[3] != 63 + 3 || l3 != 36)
371 abort ();
372 if (i2 != 5 || j2 != 23 || n2 != 9 + 6 * 17 || l4 != 4 * 31 + 21)
373 abort ();
374 if (i3 != 5 || j3 != 23 || n3 != 10 + 6 * 17 || l5 != 4 * 31 + 21)
375 abort ();
376 if (i4 != 5 || j4 != 23 || n4 != 11 + 6 * 17 || l6 != 4 * 31 + 21)
377 abort ();
378 if (i5 != 19)
379 abort ();
383 main ()
385 omp_alloctrait_t traits[3]
386 = { { omp_atk_alignment, 64 },
387 { omp_atk_fallback, omp_atv_null_fb } };
388 omp_allocator_handle_t a
389 = omp_init_allocator (omp_default_mem_space, 2, traits);
390 int p[4], q[3];
391 if (a == omp_null_allocator)
392 abort ();
393 omp_set_default_allocator (omp_default_mem_alloc);
394 foo (42, p, q, 2, omp_null_allocator, 0);
395 foo (42, p, q, 2, omp_default_mem_alloc, 0);
396 foo (42, p, q, 2, a, 1);
397 omp_set_default_allocator (a);
398 foo (42, p, q, 2, omp_null_allocator, 3);
399 foo (42, p, q, 2, omp_default_mem_alloc, 2);
400 bar (42, a);
401 omp_destroy_allocator (a);
402 return 0;