OpenACC reference count overhaul
[platform/upstream/gcc.git] / libgomp / testsuite / libgomp.oacc-c-c++-common / pr92843-1.c
1 /* Verify that 'acc_copyout' etc. is a no-op if there's still a structured
2    reference count.  */
3
4 /* { dg-xfail-run-if "TODO PR92843" { *-*-* } } */
5 /* { dg-skip-if "" { *-*-* } { "*" } { "-DACC_MEM_SHARED=0" } } */
6
7 #include <assert.h>
8 #include <stdlib.h>
9 #include <openacc.h>
10
11
12 const int c0 = 58;
13 const int c1 = 81;
14
15 static void
16 assign_array (char *array, size_t size, char value)
17 {
18   for (size_t i = 0; i < size; ++i)
19     array[i] = value;
20 }
21
22 static void
23 verify_array (const char *array, size_t size, char value)
24 {
25   for (size_t i = 0; i < size; ++i)
26     assert (array[i] == value);
27 }
28
29
30 float global_var;
31 #pragma acc declare create (global_var)
32
33 static void
34 test_acc_declare ()
35 {
36   assert (acc_is_present (&global_var, sizeof global_var));
37
38   global_var = c0;
39 #pragma acc update device (global_var)
40
41   global_var = c1;
42   acc_copyout (&global_var, sizeof global_var);
43   assert (acc_is_present (&global_var, sizeof global_var));
44   assert (global_var == c1);
45
46   global_var = c1;
47   acc_copyout_finalize (&global_var, sizeof global_var);
48   assert (acc_is_present (&global_var, sizeof global_var));
49   assert (global_var == c1);
50
51   void *global_var_d_p = acc_deviceptr (&global_var);
52   assert (global_var_d_p);
53
54   void *d_p = acc_copyin (&global_var, sizeof global_var);
55   assert (d_p == global_var_d_p);
56
57   acc_copyout (&global_var, sizeof global_var);
58   assert (acc_is_present (&global_var, sizeof global_var));
59
60   d_p = acc_copyin (&global_var, sizeof global_var);
61   assert (d_p == global_var_d_p);
62
63   d_p = acc_copyin (&global_var, sizeof global_var);
64   assert (d_p == global_var_d_p);
65
66   global_var = c1;
67   acc_copyout_finalize (&global_var, sizeof global_var);
68   assert (acc_is_present (&global_var, sizeof global_var));
69   assert (global_var == c1);
70
71   global_var = c1;
72   acc_copyout (&global_var, sizeof global_var);
73   assert (acc_is_present (&global_var, sizeof global_var));
74   assert (global_var == c1);
75 }
76
77
78 static void
79 test_acc_map_data ()
80 {
81   const int N = 801;
82
83   char *h = (char *) malloc (N);
84   assert (h);
85   void *d = acc_malloc (N);
86   assert (d);
87   acc_map_data (h, d, N);
88   assert (acc_is_present (h, N));
89
90   assign_array (h, N, c0);
91 #pragma acc update device (h[0:N])
92
93   assign_array (h, N, c1);
94 #pragma acc exit data copyout (h[0:N])
95   assert (acc_is_present (h, N));
96   verify_array (h, N, c1);
97
98   assign_array (h, N, c1);
99 #pragma acc exit data copyout (h[0:N]) finalize
100   assert (acc_is_present (h, N));
101   verify_array (h, N, c1);
102
103 #pragma acc enter data copyin (h[0:N])
104
105   assign_array (h, N, c1);
106 #pragma acc exit data copyout (h[0:N])
107   assert (acc_is_present (h, N));
108   verify_array (h, N, c1);
109
110 #pragma acc enter data copyin (h[0:N])
111
112 #pragma acc enter data copyin (h[0:N])
113
114   assign_array (h, N, c1);
115 #pragma acc exit data copyout (h[0:N]) finalize
116   assert (acc_is_present (h, N));
117   verify_array (h, N, c1);
118
119   assign_array (h, N, c1);
120 #pragma acc exit data copyout (h[0:N])
121   assert (acc_is_present (h, N));
122   verify_array (h, N, c1);
123 }
124
125
126 static void
127 test_acc_data ()
128 {
129 #define N 23
130   char h[N];
131
132   assign_array (h, N, c0);
133 #pragma acc data copyin (h)
134   {
135     assert (acc_is_present (h, sizeof h));
136
137     assign_array (h, N, c1);
138     acc_copyout_finalize (h, sizeof h);
139     assert (acc_is_present (h, sizeof h));
140     verify_array (h, N, c1);
141
142     assign_array (h, N, c1);
143     acc_copyout (h, sizeof h);
144     assert (acc_is_present (h, sizeof h));
145     verify_array (h, N, c1);
146
147     acc_copyin (h, sizeof h);
148
149     assign_array (h, N, c1);
150     acc_copyout (h, sizeof h);
151     assert (acc_is_present (h, sizeof h));
152     verify_array (h, N, c1);
153
154     acc_copyin (h, sizeof h);
155
156     acc_copyin (h, sizeof h);
157
158     assign_array (h, N, c1);
159     acc_copyout_finalize (h, sizeof h);
160     assert (acc_is_present (h, sizeof h));
161     verify_array (h, N, c1);
162
163     assign_array (h, N, c1);
164     acc_copyout (h, sizeof h);
165     assert (acc_is_present (h, sizeof h));
166     verify_array (h, N, c1);
167   }
168 #undef N
169 }
170
171
172 int
173 main ()
174 {
175   test_acc_declare ();
176   test_acc_map_data ();
177   test_acc_data ();
178
179   return 0;
180 }