[PR90862] OpenACC 'declare' ICE when nested inside another construct
[gcc.git] / libgomp / testsuite / libgomp.oacc-c-c++-common / declare-1.c
1 #include <openacc.h>
2 #include <stdlib.h>
3
4 #define N 8
5
6 void
7 subr2 (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
23 void
24 subr1 (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
41 int b[N];
42 #pragma acc declare create (b)
43
44 int d[N] = { 1, 2, 3, 4, 5, 6, 7, 8 };
45 #pragma acc declare copyin (d)
46
47 static void
48 f (void)
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
112 for (i = 0; i < N; i++)
113 {
114 if (a[i] != 1234 * 6)
115 abort ();
116 }
117 }
118
119
120 /* The same as 'f' but everything contained in an OpenACC 'data' construct. */
121
122 static void
123 f_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
198 int
199 main (int argc, char **argv)
200 {
201 f ();
202
203 f_data ();
204
205 return 0;
206 }