]> git.ipfire.org Git - thirdparty/gcc.git/blame - libgomp/testsuite/libgomp.oacc-c-c++-common/declare-1.c
[PR90862] OpenACC 'declare' ICE when nested inside another construct
[thirdparty/gcc.git] / libgomp / testsuite / libgomp.oacc-c-c++-common / declare-1.c
CommitLineData
2fc5e987 1#include <openacc.h>
2#include <stdlib.h>
2fc5e987 3
4#define N 8
5
6void
7subr2 (int *a)
8{
9 int i;
10 int f[N];
11#pragma acc declare copyout (f)
12
13#pragma acc parallel copy (a[0:N])
14 {
15 for (i = 0; i < N; i++)
16 {
17 f[i] = a[i];
18 a[i] = f[i] + f[i] + f[i];
19 }
20 }
21}
22
23void
24subr1 (int *a)
25{
26 int f[N];
27#pragma acc declare copy (f)
28
29#pragma acc parallel copy (a[0:N])
30 {
31 int i;
32
33 for (i = 0; i < N; i++)
34 {
35 f[i] = a[i];
36 a[i] = f[i] + f[i];
37 }
38 }
39}
40
acb41570 41int b[N];
2fc5e987 42#pragma acc declare create (b)
43
acb41570 44int d[N] = { 1, 2, 3, 4, 5, 6, 7, 8 };
2fc5e987 45#pragma acc declare copyin (d)
46
acb41570 47static void
48f (void)
2fc5e987 49{
50 int a[N];
51 int e[N];
52#pragma acc declare create (e)
53 int i;
54
55 for (i = 0; i < N; i++)
56 a[i] = i + 1;
57
58 if (!acc_is_present (&b, sizeof (b)))
59 abort ();
60
61 if (!acc_is_present (&d, sizeof (d)))
62 abort ();
63
64 if (!acc_is_present (&e, sizeof (e)))
65 abort ();
66
67#pragma acc parallel copyin (a[0:N])
68 {
69 for (i = 0; i < N; i++)
70 {
71 b[i] = a[i];
72 a[i] = b[i];
73 }
74 }
75
76 for (i = 0; i < N; i++)
77 {
78 if (a[i] != i + 1)
79 abort ();
80 }
81
82#pragma acc parallel copy (a[0:N])
83 {
84 for (i = 0; i < N; i++)
85 {
86 e[i] = a[i] + d[i];
87 a[i] = e[i];
88 }
89 }
90
91 for (i = 0; i < N; i++)
92 {
93 if (a[i] != (i + 1) * 2)
94 abort ();
95 }
96
97 for (i = 0; i < N; i++)
98 {
99 a[i] = 1234;
100 }
101
102 subr1 (&a[0]);
103
104 for (i = 0; i < N; i++)
105 {
106 if (a[i] != 1234 * 2)
107 abort ();
108 }
109
110 subr2 (&a[0]);
111
acb41570 112 for (i = 0; i < N; i++)
2fc5e987 113 {
114 if (a[i] != 1234 * 6)
115 abort ();
116 }
acb41570 117}
118
119
120/* The same as 'f' but everything contained in an OpenACC 'data' construct. */
121
122static void
123f_data (void)
124{
125#pragma acc data
126 {
127 int a[N];
128 int e[N];
129# pragma acc declare create (e)
130 int i;
131
132 for (i = 0; i < N; i++)
133 a[i] = i + 1;
134
135 if (!acc_is_present (&b, sizeof (b)))
136 abort ();
137
138 if (!acc_is_present (&d, sizeof (d)))
139 abort ();
140
141 if (!acc_is_present (&e, sizeof (e)))
142 abort ();
143
144# pragma acc parallel copyin (a[0:N])
145 {
146 for (i = 0; i < N; i++)
147 {
148 b[i] = a[i];
149 a[i] = b[i];
150 }
151 }
152
153 for (i = 0; i < N; i++)
154 {
155 if (a[i] != i + 1)
156 abort ();
157 }
158
159# pragma acc parallel copy (a[0:N])
160 {
161 for (i = 0; i < N; i++)
162 {
163 e[i] = a[i] + d[i];
164 a[i] = e[i];
165 }
166 }
167
168 for (i = 0; i < N; i++)
169 {
170 if (a[i] != (i + 1) * 2)
171 abort ();
172 }
173
174 for (i = 0; i < N; i++)
175 {
176 a[i] = 1234;
177 }
178
179 subr1 (&a[0]);
180
181 for (i = 0; i < N; i++)
182 {
183 if (a[i] != 1234 * 2)
184 abort ();
185 }
186
187 subr2 (&a[0]);
188
189 for (i = 0; i < N; i++)
190 {
191 if (a[i] != 1234 * 6)
192 abort ();
193 }
194 }
195}
196
197
198int
199main (int argc, char **argv)
200{
201 f ();
202
203 f_data ();
2fc5e987 204
205 return 0;
206}