5 struct S
{ int a
, b
; };
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
;
16 int r2
[4] = { 0, 0, 0, 0 };
18 struct S s
= { 27, 29 };
19 for (i
= 0; i
< 4; i
++)
21 for (i
= 0; i
< 3; i
++)
23 for (i
= 0; i
< x
; i
++)
25 #pragma omp parallel private (y, v) firstprivate (x) allocate (x, y, v)
27 int *volatile p1
= &x
;
28 int *volatile p2
= &y
;
37 if (x
!= 43 || y
!= 1)
39 if (v
[0] != 7 || v
[41] != 8)
41 if ((fl
& 2) && (((uintptr_t) p1
| (uintptr_t) p2
42 | (uintptr_t) &v
[0]) & 63) != 0)
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)
58 if (x
!= 43 || y
!= 1 || w
[19] != 20)
60 if ((fl
& 1) && (((uintptr_t) p1
| (uintptr_t) p2
61 | (uintptr_t) &w
[0]) & 63) != 0)
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
++)
74 if ((fl
& 1) && (((uintptr_t) &x
| (uintptr_t) &y
| (uintptr_t) &r
75 | (uintptr_t) &l
| (uintptr_t) &n
) & 63) != 0)
81 #pragma omp for lastprivate (l2) private (i1) allocate (h: l2, l3, i1) lastprivate (conditional: l3)
82 for (i1
= 0; i1
< 64; i1
++)
90 if ((fl
& 1) && (((uintptr_t) &l2
[0] | (uintptr_t) &l3
| (uintptr_t) &i1
) & 63) != 0)
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)
99 if ((fl
& 1) && (((uintptr_t) &l4
| (uintptr_t) &n2
100 | (uintptr_t) &i2
| (uintptr_t) &j2
) & 63) != 0)
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)
109 if ((fl
& 2) && (((uintptr_t) &l5
| (uintptr_t) &n3
110 | (uintptr_t) &i3
| (uintptr_t) &j3
) & 63) != 0)
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)
119 if ((fl
& 1) && (((uintptr_t) &l6
| (uintptr_t) &n4
120 | (uintptr_t) &i4
| (uintptr_t) &j4
) & 63) != 0)
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)
129 #pragma omp for reduction(+:p[2:px], q[:3], r2) allocate(h: p, q, r2)
130 for (i
= 0; i
< 32; 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
141 if ((fl
& 1) && (((uintptr_t) &q
[0] | (uintptr_t) &r2
[0]) & 63) != 0)
144 #pragma omp task private(y) firstprivate(x) allocate(x, y)
146 int *volatile p1
= &x
;
147 int *volatile p2
= &y
;
152 if (x
!= 43 || y
!= 21)
154 if ((fl
& 2) && (((uintptr_t) p1
| (uintptr_t) p2
) & 63) != 0)
157 #pragma omp task private(y) firstprivate(x) allocate(h: x, y)
159 int *volatile p1
= &x
;
160 int *volatile p2
= &y
;
165 if (x
!= 43 || y
!= 21)
167 if ((fl
& 1) && (((uintptr_t) p1
| (uintptr_t) p2
) & 63) != 0)
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)
180 if (s
.a
!= 28 || s
.b
!= 30 || y
!= 21)
182 if ((fl
& 2) && (((uintptr_t) p1
| (uintptr_t) p3
) & 63) != 0)
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)
195 if (s
.a
!= 28 || s
.b
!= 30 || y
!= 21)
197 if ((fl
& 1) && (((uintptr_t) p1
| (uintptr_t) p3
) & 63) != 0)
201 if (r
!= 64 * 63 / 2 || l
!= 63 || n
!= 8 + 16 * 64)
203 if (l2
[0] != 63 || l2
[1] != 63 + 1 || l2
[2] != 63 + 2 || l2
[3] != 63 + 3 || l3
!= 36)
205 if (i2
!= 5 || j2
!= 23 || n2
!= 9 + 6 * 17 || l4
!= 4 * 31 + 21)
207 if (i3
!= 5 || j3
!= 23 || n3
!= 10 + 6 * 17 || l5
!= 4 * 31 + 21)
209 if (i4
!= 5 || j4
!= 23 || n4
!= 11 + 6 * 17 || l6
!= 4 * 31 + 21)
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)
219 #pragma omp parallel shared (x, y, r, n5) firstprivate (h)
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
;
236 if (x
!= 43 || y
!= 1 || r
!= 1)
238 if ((fl
& 1) && (((uintptr_t) p1
| (uintptr_t) p2
239 | (uintptr_t) p3
) & 63) != 0)
243 if (x
!= 42 || r
!= n5
)
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
;
255 struct S s
= { 27, 29 };
257 #pragma omp parallel private (y) firstprivate (x) allocate (x, y)
265 if (x
!= 43 || y
!= 1)
270 #pragma omp parallel private (y) firstprivate (x) allocate (h: x, y)
278 if (x
!= 43 || y
!= 1)
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
++)
295 #pragma omp for lastprivate (l2) private (i1) allocate (h: l2, l3, i1) lastprivate (conditional: l3)
296 for (i1
= 0; i1
< 64; 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)
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)
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)
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)
335 if (x
!= 43 || y
!= 21)
338 #pragma omp task private(y) firstprivate(x) allocate(h: x, y)
344 if (x
!= 43 || y
!= 21)
347 #pragma omp task private(y) firstprivate(s) allocate(s, y)
349 if (s
.a
!= 27 || s
.b
!= 29)
354 if (s
.a
!= 28 || s
.b
!= 30 || y
!= 21)
357 #pragma omp task private(y) firstprivate(s) allocate(h: s, y)
359 if (s
.a
!= 27 || s
.b
!= 29)
364 if (s
.a
!= 28 || s
.b
!= 30 || y
!= 21)
368 if (r
!= 64 * 63 / 2 || l
!= 63 || n
!= 8 + 16 * 64)
370 if (l2
[0] != 63 || l2
[1] != 63 + 1 || l2
[2] != 63 + 2 || l2
[3] != 63 + 3 || l3
!= 36)
372 if (i2
!= 5 || j2
!= 23 || n2
!= 9 + 6 * 17 || l4
!= 4 * 31 + 21)
374 if (i3
!= 5 || j3
!= 23 || n3
!= 10 + 6 * 17 || l5
!= 4 * 31 + 21)
376 if (i4
!= 5 || j4
!= 23 || n4
!= 11 + 6 * 17 || l6
!= 4 * 31 + 21)
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
);
391 if (a
== omp_null_allocator
)
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);
401 omp_destroy_allocator (a
);