xref: /llvm-project/flang/test/Semantics/OpenACC/acc-parallel-loop-validity.f90 (revision a87ca1bbd9a4f36b1edd3d3d3c4a662e05388f4e)
1! RUN: %python %S/../test_errors.py %s %flang -fopenacc
2
3! Check OpenACC clause validity for the following construct and directive:
4!   2.11 Parallel Loop
5
6program openacc_parallel_loop_validity
7
8  implicit none
9
10  integer :: i, j, b
11  integer, parameter :: N = 256
12  integer, dimension(N) :: c
13  logical, dimension(N) :: d, e
14  real :: reduction_r
15  logical :: reduction_l
16  logical :: ifCondition = .TRUE.
17  real(8), dimension(N) :: a, f, g, h
18  real(8), dimension(N, N) :: aa, bb, cc
19
20  !$acc parallel loop
21  do i = 1, N
22    a(i) = 3.14
23  end do
24
25  !$acc parallel loop
26  do i = 1, N
27    a(i) = 3.14
28  end do
29  !$acc end parallel loop
30
31  !$acc parallel loop
32  do i = 1, N
33    a(i) = 3.14
34  end do
35  !$acc end parallel
36
37  !$acc parallel loop tile(2)
38  do i = 1, N
39    a(i) = 3.14
40  end do
41
42  !$acc parallel loop self
43  do i = 1, N
44    a(i) = 3.14
45  end do
46
47  !ERROR: SELF clause on the PARALLEL LOOP directive only accepts optional scalar logical expression
48  !$acc parallel loop self(bb, cc(:,:))
49  do i = 1, N
50    a(i) = 3.14
51  end do
52
53  !$acc parallel loop self(.true.)
54  do i = 1, N
55    a(i) = 3.14
56  end do
57
58  !$acc parallel loop self(ifCondition)
59  do i = 1, N
60    a(i) = 3.14
61  end do
62
63  !$acc parallel loop tile(2, 2)
64  do i = 1, N
65    do j = 1, N
66      aa(i, j) = 3.14
67    end do
68  end do
69
70  !ERROR: Clause IF is not allowed after clause DEVICE_TYPE on the PARALLEL LOOP directive
71  !$acc parallel loop device_type(*) if(.TRUE.)
72  do i = 1, N
73    a(i) = 3.14
74  end do
75  !$acc end parallel loop
76
77  !$acc kernels loop
78  do i = 1, N
79    a(i) = 3.14
80  end do
81  !ERROR: Unmatched END PARALLEL LOOP directive
82  !$acc end parallel loop
83
84  !$acc parallel loop reduction(+: reduction_r)
85  do i = 1, N
86    reduction_r = a(i) + i
87  end do
88
89  !$acc parallel loop reduction(*: reduction_r)
90  do i = 1, N
91    reduction_r = reduction_r * (a(i) + i)
92  end do
93
94  !$acc parallel loop reduction(min: reduction_r)
95  do i = 1, N
96    reduction_r = min(reduction_r, a(i) * i)
97  end do
98
99  !$acc parallel loop reduction(max: reduction_r)
100  do i = 1, N
101    reduction_r = max(reduction_r, a(i) * i)
102  end do
103
104  !$acc parallel loop reduction(iand: b)
105  do i = 1, N
106    b = iand(b, c(i))
107  end do
108
109  !$acc parallel loop reduction(ior: b)
110  do i = 1, N
111    b = ior(b, c(i))
112  end do
113
114  !$acc parallel loop reduction(ieor: b)
115  do i = 1, N
116    b = ieor(b, c(i))
117  end do
118
119  !$acc parallel loop reduction(.and.: reduction_l)
120  do i = 1, N
121    reduction_l = d(i) .and. e(i)
122  end do
123
124  !$acc parallel loop reduction(.or.: reduction_l)
125  do i = 1, N
126    reduction_l = d(i) .or. e(i)
127  end do
128
129  !$acc parallel loop reduction(.eqv.: reduction_l)
130  do i = 1, N
131    reduction_l = d(i) .eqv. e(i)
132  end do
133
134  !$acc parallel loop reduction(.neqv.: reduction_l)
135  do i = 1, N
136    reduction_l = d(i) .neqv. e(i)
137  end do
138
139  !$acc parallel loop
140  do i = 1, N
141    if(i == 10) cycle
142  end do
143
144end program openacc_parallel_loop_validity
145