1! Miscellaneous tests for private variables.
2
3! { dg-do run }
4
5! { dg-additional-options "-fopt-info-note-omp" }
6! { dg-additional-options "--param=openacc-privatization=noisy" }
7! { dg-additional-options "-foffload=-fopt-info-note-omp" }
8! { dg-additional-options "-foffload=--param=openacc-privatization=noisy" }
9! for testing/documenting aspects of that functionality.
10
11! { dg-additional-options "-Wopenacc-parallelism" } for testing/documenting
12! aspects of that functionality.
13
14! It's only with Tcl 8.5 (released in 2007) that "the variable 'varName'
15! passed to 'incr' may be unset, and in that case, it will be set to [...]",
16! so to maintain compatibility with earlier Tcl releases, we manually
17! initialize counter variables:
18! { dg-line l_dummy[variable c_loop 0] }
19! { dg-message "dummy" "" { target iN-VAl-Id } l_dummy } to avoid
20! "WARNING: dg-line var l_dummy defined, but not used".
21
22
23! Test of gang-private variables declared on loop directive.
24
25subroutine t1()
26  integer :: x, i, arr(32)
27
28  do i = 1, 32
29     arr(i) = i
30  end do
31
32  !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
33  ! { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-1 }
34  ! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-2 }
35  !$acc loop gang private(x) ! { dg-line l_loop[incr c_loop] }
36  ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
37  ! { dg-note {variable 'x' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
38  do i = 1, 32
39     x = i * 2;
40     arr(i) = arr(i) + x
41  end do
42  !$acc end parallel
43
44  do i = 1, 32
45     if (arr(i) .ne. i * 3) STOP 1
46  end do
47end subroutine t1
48
49
50! Test of gang-private variables declared on loop directive, with broadcasting
51! to partitioned workers.
52
53subroutine t2()
54  integer :: x, i, j, arr(0:32*32)
55
56  do i = 0, 32*32-1
57     arr(i) = i
58  end do
59
60  !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
61  ! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-1 }
62  !$acc loop gang private(x) ! { dg-line l_loop[incr c_loop] }
63  ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
64  ! { dg-note {variable 'x' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
65  do i = 0, 31
66     x = i * 2;
67
68     !$acc loop worker ! { dg-line l_loop[incr c_loop] }
69     ! { dg-note {variable 'j' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
70     do j = 0, 31
71        arr(i * 32 + j) = arr(i * 32 + j) + x
72     end do
73  end do
74  !$acc end parallel
75
76  do i = 0, 32 * 32 - 1
77     if (arr(i) .ne. i + (i / 32) * 2) STOP 2
78  end do
79end subroutine t2
80
81
82! Test of gang-private variables declared on loop directive, with broadcasting
83! to partitioned vectors.
84
85subroutine t3()
86  integer :: x, i, j, arr(0:32*32)
87
88  do i = 0, 32*32-1
89     arr(i) = i
90  end do
91
92  !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
93  ! { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-1 }
94  !$acc loop gang private(x) ! { dg-line l_loop[incr c_loop] }
95  ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
96  ! { dg-note {variable 'x' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
97  do i = 0, 31
98     x = i * 2;
99
100     !$acc loop vector ! { dg-line l_loop[incr c_loop] }
101     ! { dg-note {variable 'j' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
102     do j = 0, 31
103        arr(i * 32 + j) = arr(i * 32 + j) + x
104     end do
105  end do
106  !$acc end parallel
107
108  do i = 0, 32 * 32 - 1
109     if (arr(i) .ne. i + (i / 32) * 2) STOP 3
110  end do
111end subroutine t3
112
113
114! Test of gang-private addressable variable declared on loop directive, with
115! broadcasting to partitioned workers.
116
117subroutine t4()
118  type vec3
119     integer x, y, z, attr(13)
120  end type vec3
121
122  integer i, j, arr(0:32*32)
123  type(vec3) pt
124
125  do i = 0, 32*32-1
126     arr(i) = i
127  end do
128
129  !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
130  ! { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-1 }
131  !$acc loop gang private(pt) ! { dg-line l_loop[incr c_loop] }
132  ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
133  ! { dg-note {variable 'pt' in 'private' clause is candidate for adjusting OpenACC privatization level} "" { target *-*-* } l_loop$c_loop }
134  ! But, with optimizations enabled, per the '*.ssa' dump ('gcc/tree-ssa.c:execute_update_addresses_taken'):
135  !     No longer having address taken: pt
136  ! However, 'pt' remains in the candidate set:
137  ! { dg-note {variable 'pt' ought to be adjusted for OpenACC privatization level: 'gang'} "" { target *-*-* } l_loop$c_loop }
138  ! Now, for GCN offloading, 'adjust_private_decl' does the privatization change right away:
139  ! { dg-note {variable 'pt' adjusted for OpenACC privatization level: 'gang'} "" { target openacc_radeon_accel_selected } l_loop$c_loop }
140  ! For nvptx offloading however, we first mark up 'pt', and then later apply the privatization change -- or, with optimizations enabled, don't, because we then don't actually call 'expand_var_decl'.
141  ! { dg-note {variable 'pt' adjusted for OpenACC privatization level: 'gang'} "" { target { openacc_nvidia_accel_selected && { ! __OPTIMIZE__ } } } l_loop$c_loop }
142  ! { dg-bogus {note: variable 'pt' adjusted for OpenACC privatization level: 'gang'} "" { target { openacc_nvidia_accel_selected && __OPTIMIZE__ } } l_loop$c_loop }
143  do i = 0, 31
144     pt%x = i
145     pt%y = i * 2
146     pt%z = i * 4
147     pt%attr(5) = i * 6
148
149     !$acc loop vector ! { dg-line l_loop[incr c_loop] }
150     ! { dg-note {variable 'j' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
151     do j = 0, 31
152        arr(i * 32 + j) = arr(i * 32 + j) + pt%x + pt%y + pt%z + pt%attr(5);
153     end do
154  end do
155  !$acc end parallel
156
157  do i = 0, 32 * 32 - 1
158     if (arr(i) .ne. i + (i / 32) * 13) STOP 4
159  end do
160end subroutine t4
161
162
163! Test of vector-private variables declared on loop directive.
164
165subroutine t5()
166  integer :: x, i, j, k, idx, arr(0:32*32*32)
167
168  do i = 0, 32*32*32-1
169     arr(i) = i
170  end do
171
172  !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
173  !$acc loop gang ! { dg-line l_loop[incr c_loop] }
174  ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
175  do i = 0, 31
176     !$acc loop worker ! { dg-line l_loop[incr c_loop] }
177     ! { dg-note {variable 'j' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
178     do j = 0, 31
179        !$acc loop vector private(x) ! { dg-line l_loop[incr c_loop] }
180        ! { dg-note {variable 'k' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
181        ! { dg-note {variable 'x' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
182        do k = 0, 31
183           x = ieor(i, j * 3)
184           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k
185        end do
186        !$acc loop vector private(x) ! { dg-line l_loop[incr c_loop] }
187        ! { dg-note {variable 'k' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
188        ! { dg-note {variable 'x' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
189        do k = 0, 31
190           x = ior(i, j * 5)
191           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k
192        end do
193     end do
194  end do
195  !$acc end parallel
196
197  do i = 0, 32 - 1
198     do j = 0, 32 -1
199        do k = 0, 32 - 1
200           idx = i * 1024 + j * 32 + k
201           if (arr(idx) .ne. idx + ieor(i, j * 3) * k + ior(i, j * 5) * k) then
202              STOP 5
203           end if
204        end do
205     end do
206  end do
207end subroutine t5
208
209
210! Test of vector-private variables declared on loop directive. Array type.
211
212subroutine t6()
213  integer :: i, j, k, idx, arr(0:32*32*32), pt(2)
214
215  do i = 0, 32*32*32-1
216     arr(i) = i
217  end do
218
219  !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
220  !$acc loop gang ! { dg-line l_loop[incr c_loop] }
221  ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
222  do i = 0, 31
223     !$acc loop worker ! { dg-line l_loop[incr c_loop] }
224     ! { dg-note {variable 'j' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
225     do j = 0, 31
226        !$acc loop vector private(x, pt) ! { dg-line l_loop[incr c_loop] }
227        ! { dg-note {variable 'k' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
228        ! { dg-bogus {note: variable 'x' in 'private' clause} "" { target *-*-* } l_loop$c_loop }
229        ! { dg-note {variable 'pt' in 'private' clause is candidate for adjusting OpenACC privatization level} "" { target *-*-* } l_loop$c_loop }
230        ! { dg-note {variable 'pt' ought to be adjusted for OpenACC privatization level: 'vector'} "" { target *-*-* } l_loop$c_loop }
231        ! { dg-note {variable 'pt' adjusted for OpenACC privatization level: 'vector'} "" { target { ! openacc_host_selected } } l_loop$c_loop }
232        do k = 0, 31
233           pt(1) = ieor(i, j * 3)
234           pt(2) = ior(i, j * 5)
235           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + pt(1) * k
236           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + pt(2) * k
237        end do
238     end do
239  end do
240  !$acc end parallel
241
242  do i = 0, 32 - 1
243     do j = 0, 32 -1
244        do k = 0, 32 - 1
245           idx = i * 1024 + j * 32 + k
246           if (arr(idx) .ne. idx + ieor(i, j * 3) * k + ior(i, j * 5) * k) then
247              STOP 6
248           end if
249        end do
250     end do
251  end do
252end subroutine t6
253
254
255! Test of worker-private variables declared on a loop directive.
256
257subroutine t7()
258  integer :: x, i, j, arr(0:32*32)
259  common x
260
261  do i = 0, 32*32-1
262     arr(i) = i
263  end do
264
265  !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
266  ! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-1 }
267  !$acc loop gang private(x) ! { dg-line l_loop[incr c_loop] }
268  ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
269  ! { dg-bogus {note: variable 'x' in 'private' clause} "" { target *-*-* } l_loop$c_loop }
270  do i = 0, 31
271     !$acc loop worker private(x) ! { dg-line l_loop[incr c_loop] }
272     ! { dg-note {variable 'j' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
273     ! { dg-note {variable 'x' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
274     do j = 0, 31
275        x = ieor(i, j * 3)
276        arr(i * 32 + j) = arr(i * 32 + j) + x
277     end do
278  end do
279  !$acc end parallel
280
281  do i = 0, 32 * 32 - 1
282     if (arr(i) .ne. i + ieor(i / 32, mod(i, 32) * 3)) STOP 7
283  end do
284end subroutine t7
285
286
287! Test of worker-private variables declared on a loop directive, broadcasting
288! to vector-partitioned mode.
289
290subroutine t8()
291  integer :: x, i, j, k, idx, arr(0:32*32*32)
292
293  do i = 0, 32*32*32-1
294     arr(i) = i
295  end do
296
297  !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
298  !$acc loop gang ! { dg-line l_loop[incr c_loop] }
299  ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
300  do i = 0, 31
301     !$acc loop worker private(x) ! { dg-line l_loop[incr c_loop] }
302     ! { dg-note {variable 'j' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
303     ! { dg-note {variable 'x' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
304     do j = 0, 31
305        x = ieor(i, j * 3)
306
307        !$acc loop vector ! { dg-line l_loop[incr c_loop] }
308        ! { dg-note {variable 'k' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
309        do k = 0, 31
310           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k
311        end do
312     end do
313  end do
314  !$acc end parallel
315
316  do i = 0, 32 - 1
317     do j = 0, 32 -1
318        do k = 0, 32 - 1
319           idx = i * 1024 + j * 32 + k
320           if (arr(idx) .ne. idx + ieor(i, j * 3) * k) STOP 8
321        end do
322     end do
323  end do
324end subroutine t8
325
326
327! Test of worker-private variables declared on a loop directive, broadcasting
328! to vector-partitioned mode.  Back-to-back worker loops.
329
330subroutine t9()
331  integer :: x, i, j, k, idx, arr(0:32*32*32)
332
333  do i = 0, 32*32*32-1
334     arr(i) = i
335  end do
336
337  !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
338  !$acc loop gang ! { dg-line l_loop[incr c_loop] }
339  ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
340  do i = 0, 31
341     !$acc loop worker private(x) ! { dg-line l_loop[incr c_loop] }
342     ! { dg-note {variable 'j' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
343     ! { dg-note {variable 'x' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
344     do j = 0, 31
345        x = ieor(i, j * 3)
346
347        !$acc loop vector ! { dg-line l_loop[incr c_loop] }
348        ! { dg-note {variable 'k' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
349        do k = 0, 31
350           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k
351        end do
352     end do
353
354     !$acc loop worker private(x) ! { dg-line l_loop[incr c_loop] }
355     ! { dg-note {variable 'j' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
356     ! { dg-note {variable 'x' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
357     do j = 0, 31
358        x = ior(i, j * 5)
359
360        !$acc loop vector ! { dg-line l_loop[incr c_loop] }
361        ! { dg-note {variable 'k' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
362        do k = 0, 31
363           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k
364        end do
365     end do
366  end do
367  !$acc end parallel
368
369  do i = 0, 32 - 1
370     do j = 0, 32 -1
371        do k = 0, 32 - 1
372           idx = i * 1024 + j * 32 + k
373           if (arr(idx) .ne. idx + ieor(i, j * 3) * k + ior(i, j * 5) * k) then
374              STOP 9
375           end if
376        end do
377     end do
378  end do
379end subroutine t9
380
381
382! Test of worker-private variables declared on a loop directive, broadcasting
383! to vector-partitioned mode.  Successive vector loops.  */
384
385subroutine t10()
386  integer :: x, i, j, k, idx, arr(0:32*32*32)
387
388  do i = 0, 32*32*32-1
389     arr(i) = i
390  end do
391
392  !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
393  !$acc loop gang ! { dg-line l_loop[incr c_loop] }
394  ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
395  do i = 0, 31
396     !$acc loop worker private(x) ! { dg-line l_loop[incr c_loop] }
397     ! { dg-note {variable 'j' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
398     ! { dg-note {variable 'x' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
399     do j = 0, 31
400        x = ieor(i, j * 3)
401
402        !$acc loop vector ! { dg-line l_loop[incr c_loop] }
403        ! { dg-note {variable 'k' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
404        do k = 0, 31
405           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k
406        end do
407
408        x = ior(i, j * 5)
409
410        !$acc loop vector ! { dg-line l_loop[incr c_loop] }
411        ! { dg-note {variable 'k' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
412        do k = 0, 31
413           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k
414        end do
415     end do
416  end do
417  !$acc end parallel
418
419  do i = 0, 32 - 1
420     do j = 0, 32 -1
421        do k = 0, 32 - 1
422           idx = i * 1024 + j * 32 + k
423           if (arr(idx) .ne. idx + ieor(i, j * 3) * k + ior(i, j * 5) * k) then
424              STOP 10
425           end if
426        end do
427     end do
428  end do
429end subroutine t10
430
431
432! Test of worker-private variables declared on a loop directive, broadcasting
433! to vector-partitioned mode.  Addressable worker variable.
434
435subroutine t11()
436  integer :: i, j, k, idx, arr(0:32*32*32)
437  integer, target :: x
438  integer, pointer :: p
439
440  do i = 0, 32*32*32-1
441     arr(i) = i
442  end do
443
444  !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
445  !$acc loop gang ! { dg-line l_loop[incr c_loop] }
446  ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
447  do i = 0, 31
448     !$acc loop worker private(x, p) ! { dg-line l_loop[incr c_loop] }
449     ! { dg-note {variable 'j' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
450     ! { dg-note {variable 'x' in 'private' clause is candidate for adjusting OpenACC privatization level} "" { target *-*-* } l_loop$c_loop }
451     ! { dg-note {variable 'x' ought to be adjusted for OpenACC privatization level: 'worker'} "" { target *-*-* } l_loop$c_loop }
452     ! { dg-note {variable 'x' adjusted for OpenACC privatization level: 'worker'} "TODO" { target { ! openacc_host_selected } xfail *-*-* } l_loop$c_loop }
453     ! { dg-note {variable 'p' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
454     do j = 0, 31
455        p => x
456        x = ieor(i, j * 3)
457
458        !$acc loop vector ! { dg-line l_loop[incr c_loop] }
459        ! { dg-note {variable 'k' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
460        do k = 0, 31
461           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k
462        end do
463
464        p = ior(i, j * 5)
465
466        !$acc loop vector ! { dg-line l_loop[incr c_loop] }
467        ! { dg-note {variable 'k' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
468        do k = 0, 31
469           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + x * k
470        end do
471     end do
472  end do
473  !$acc end parallel
474
475  do i = 0, 32 - 1
476     do j = 0, 32 -1
477        do k = 0, 32 - 1
478           idx = i * 1024 + j * 32 + k
479           if (arr(idx) .ne. idx + ieor(i, j * 3) * k + ior(i, j * 5) * k) then
480              STOP 11
481           end if
482        end do
483     end do
484  end do
485end subroutine t11
486
487
488! Test of worker-private variables declared on a loop directive, broadcasting
489! to vector-partitioned mode.  Aggregate worker variable.
490
491subroutine t12()
492  type vec2
493     integer x, y
494  end type vec2
495
496  integer :: i, j, k, idx, arr(0:32*32*32)
497  type(vec2) :: pt
498
499  do i = 0, 32*32*32-1
500     arr(i) = i
501  end do
502
503  !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
504  !$acc loop gang ! { dg-line l_loop[incr c_loop] }
505  ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
506  do i = 0, 31
507     !$acc loop worker private(pt) ! { dg-line l_loop[incr c_loop] }
508     ! { dg-note {variable 'j' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
509     ! { dg-note {variable 'pt' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
510     do j = 0, 31
511        pt%x = ieor(i, j * 3)
512        pt%y = ior(i, j * 5)
513
514        !$acc loop vector ! { dg-line l_loop[incr c_loop] }
515        ! { dg-note {variable 'k' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
516        do k = 0, 31
517           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + pt%x * k
518        end do
519
520        !$acc loop vector ! { dg-line l_loop[incr c_loop] }
521        ! { dg-note {variable 'k' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
522        do k = 0, 31
523           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + pt%y * k
524        end do
525     end do
526  end do
527  !$acc end parallel
528
529  do i = 0, 32 - 1
530     do j = 0, 32 -1
531        do k = 0, 32 - 1
532           idx = i * 1024 + j * 32 + k
533           if (arr(idx) .ne. idx + ieor(i, j * 3) * k + ior(i, j * 5) * k) then
534              STOP 12
535           end if
536        end do
537     end do
538  end do
539end subroutine t12
540
541
542! Test of worker-private variables declared on loop directive, broadcasting
543! to vector-partitioned mode.  Array worker variable.
544
545subroutine t13()
546  integer :: i, j, k, idx, arr(0:32*32*32), pt(2)
547
548  do i = 0, 32*32*32-1
549     arr(i) = i
550  end do
551
552  !$acc parallel copy(arr) num_gangs(32) num_workers(8) vector_length(32)
553  !$acc loop gang ! { dg-line l_loop[incr c_loop] }
554  ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
555  do i = 0, 31
556     !$acc loop worker private(pt) ! { dg-line l_loop[incr c_loop] }
557     ! { dg-note {variable 'j' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
558     ! { dg-note {variable 'pt' in 'private' clause is candidate for adjusting OpenACC privatization level} "" { target *-*-* } l_loop$c_loop }
559     ! { dg-note {variable 'pt' ought to be adjusted for OpenACC privatization level: 'worker'} "" { target *-*-* } l_loop$c_loop }
560     ! { dg-note {variable 'pt' adjusted for OpenACC privatization level: 'worker'} "TODO" { target { ! openacc_host_selected } xfail *-*-* } l_loop$c_loop } */
561     do j = 0, 31
562        pt(1) = ieor(i, j * 3)
563        pt(2) = ior(i, j * 5)
564
565        !$acc loop vector ! { dg-line l_loop[incr c_loop] }
566        ! { dg-note {variable 'k' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
567        do k = 0, 31
568           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + pt(1) * k
569        end do
570
571        !$acc loop vector ! { dg-line l_loop[incr c_loop] }
572        ! { dg-note {variable 'k' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
573        do k = 0, 31
574           arr(i * 1024 + j * 32 + k) = arr(i * 1024 + j * 32 + k) + pt(2) * k
575        end do
576     end do
577  end do
578  !$acc end parallel
579
580  do i = 0, 32 - 1
581     do j = 0, 32 -1
582        do k = 0, 32 - 1
583           idx = i * 1024 + j * 32 + k
584           if (arr(idx) .ne. idx + ieor(i, j * 3) * k + ior(i, j * 5) * k) then
585              STOP 13
586           end if
587        end do
588     end do
589  end do
590end subroutine t13
591
592
593! Test of gang-private variables declared on the parallel directive.
594
595subroutine t14()
596  use openacc
597  integer :: x = 5
598  integer, parameter :: n = 32
599  integer :: arr(n)
600
601  do i = 1, n
602    arr(i) = 3
603  end do
604
605  !$acc parallel private(x) copy(arr) num_gangs(n) num_workers(8) vector_length(32)
606  ! { dg-warning "region is worker partitioned but does not contain worker partitioned code" "" { target *-*-* } .-1 }
607  ! { dg-warning "region is vector partitioned but does not contain vector partitioned code" "" { target *-*-* } .-2 }
608    !$acc loop gang(static:1) ! { dg-line l_loop[incr c_loop] }
609    ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
610    do i = 1, n
611      x = i * 2;
612    end do
613
614   !$acc loop gang(static:1) ! { dg-line l_loop[incr c_loop] }
615    ! { dg-note {variable 'i' in 'private' clause isn't candidate for adjusting OpenACC privatization level: not addressable} "" { target *-*-* } l_loop$c_loop }
616    do i = 1, n
617       ! { dg-note {variable 'C\.[0-9]+' declared in block potentially has improper OpenACC privatization level: 'const_decl'} "TODO" { target *-*-* } l_loop$c_loop }
618       !TODO Unhandled 'CONST_DECL' instance for constant argument in 'acc_on_device' call.
619      if (acc_on_device (acc_device_host) .eqv. .TRUE.) x = i * 2
620      arr(i) = arr(i) + x
621    end do
622  !$acc end parallel
623
624  do i = 1, n
625    if (arr(i) .ne. (3 + i * 2)) STOP 14
626  end do
627
628end subroutine t14
629
630
631program main
632  call t1()
633  call t2()
634  call t3()
635  call t4()
636  call t5()
637  call t6()
638  call t7()
639  call t8()
640  call t9()
641  call t10()
642  call t11()
643  call t12()
644  call t13()
645  call t14()
646end program main
647