1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
/* TODO: move to ../libgomp.c-c++-common once C++ is implemented. */
/* NOTE: { target c } is unsupported with with the C compiler. */
/* { dg-do run } */
/* { dg-additional-options "-fdump-tree-gimple" } */
#include <omp.h>
#include <stdint.h>
/* { dg-final { scan-tree-dump-times "__builtin_GOMP_alloc \\(" 5 "gimple" } } */
/* { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(" 5 "gimple" } } */
int one ()
{
int sum = 0;
#pragma omp allocate(sum)
/* { dg-final { scan-tree-dump-times "sum\\.\[0-9\]+ = __builtin_GOMP_alloc \\(4, 4, 0B\\);" 1 "gimple" } } */
/* { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(sum\\.\[0-9\]+, 0B\\);" 1 "gimple" } } */
/* NOTE: Initializer cannot be omp_init_allocator - as 'A' is
in the same scope and the auto-omp_free comes later than
any omp_destroy_allocator. */
omp_allocator_handle_t my_allocator = omp_low_lat_mem_alloc;
int n = 25;
int A[n];
#pragma omp allocate(A) align(128) allocator(my_allocator)
/* { dg-final { scan-tree-dump-times "A\\.\[0-9\]+ = __builtin_GOMP_alloc \\(128, _\[0-9\]+, my_allocator\\);" 1 "gimple" } } */
/* { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(A\\.\[0-9\]+, 0B\\);" 1 "gimple" } } */
if (((intptr_t)A) % 128 != 0)
__builtin_abort ();
for (int i = 0; i < n; ++i)
A[i] = i;
omp_alloctrait_t traits[1] = { { omp_atk_alignment, 64 } };
my_allocator = omp_init_allocator(omp_low_lat_mem_space,1,traits);
{
int B[n] = { };
int C[5] = {1,2,3,4,5};
#pragma omp allocate(B,C) allocator(my_allocator)
/* { dg-final { scan-tree-dump-times "B\\.\[0-9\]+ = __builtin_GOMP_alloc \\(\[0-9\]+, _\[0-9\]+, my_allocator\\);" 1 "gimple" } } */
/* { dg-final { scan-tree-dump-times "C\\.\[0-9\]+ = __builtin_GOMP_alloc \\(\[0-9\]+, 20, my_allocator\\);" 1 "gimple" } } */
/* { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(B\\.\[0-9\]+, 0B\\);" 1 "gimple" } } */
/* { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(C\\.\[0-9\]+, 0B\\);" 1 "gimple" } } */
int D[5] = {11,22,33,44,55};
#pragma omp allocate(D) align(256)
/* { dg-final { scan-tree-dump-times "D\\.\[0-9\]+ = __builtin_GOMP_alloc \\(256, 20, 0B\\);" 1 "gimple" } } */
/* { dg-final { scan-tree-dump-times "__builtin_GOMP_free \\(D\\.\[0-9\]+, 0B\\);" 1 "gimple" } } */
if (((intptr_t) B) % 64 != 0)
__builtin_abort ();
if (((intptr_t) C) % 64 != 0)
__builtin_abort ();
if (((intptr_t) D) % 64 != 0)
__builtin_abort ();
for (int i = 0; i < 5; ++i)
{
if (C[i] != i+1)
__builtin_abort ();
if (D[i] != i+1 + 10*(i+1))
__builtin_abort ();
}
for (int i = 0; i < n; ++i)
{
if (B[i] != 0)
__builtin_abort ();
sum += A[i]+B[i]+C[i%5]+D[i%5];
}
}
omp_destroy_allocator (my_allocator);
return sum;
}
int
main ()
{
if (one () != 1200)
__builtin_abort ();
return 0;
}
|