1! This test checks lowering of OpenACC loop directive.
2
3! RUN: bbc -fopenacc -emit-fir %s -o - | FileCheck %s
4
5program acc_loop
6
7  integer :: i, j
8  integer, parameter :: n = 10
9  real, dimension(n) :: a, b
10  real, dimension(n, n) :: c, d
11  integer :: gangNum = 8
12  integer :: gangStatic = 8
13  integer :: vectorLength = 128
14  integer, parameter :: tileSize = 2
15
16
17  !$acc loop
18  DO i = 1, n
19    a(i) = b(i)
20  END DO
21
22!CHECK:      acc.loop {
23!CHECK:        fir.do_loop
24!CHECK:        acc.yield
25!CHECK-NEXT: }{{$}}
26
27 !$acc loop seq
28  DO i = 1, n
29    a(i) = b(i)
30  END DO
31
32!CHECK:      acc.loop {
33!CHECK:        fir.do_loop
34!CHECK:        acc.yield
35!CHECK-NEXT: } attributes {seq}
36
37  !$acc loop auto
38  DO i = 1, n
39    a(i) = b(i)
40  END DO
41
42!CHECK:      acc.loop {
43!CHECK:        fir.do_loop
44!CHECK:        acc.yield
45!CHECK-NEXT: } attributes {auto}
46
47  !$acc loop independent
48  DO i = 1, n
49    a(i) = b(i)
50  END DO
51
52!CHECK:      acc.loop {
53!CHECK:        fir.do_loop
54!CHECK:        acc.yield
55!CHECK-NEXT: } attributes {independent}
56
57  !$acc loop gang
58  DO i = 1, n
59    a(i) = b(i)
60  END DO
61
62!CHECK:      acc.loop gang {
63!CHECK:        fir.do_loop
64!CHECK:        acc.yield
65!CHECK-NEXT: }{{$}}
66
67  !$acc loop gang(num: 8)
68  DO i = 1, n
69    a(i) = b(i)
70  END DO
71
72!CHECK:      [[GANGNUM1:%.*]] = arith.constant 8 : i32
73!CHECK-NEXT: acc.loop gang(num=[[GANGNUM1]]: i32) {
74!CHECK:        fir.do_loop
75!CHECK:        acc.yield
76!CHECK-NEXT: }{{$}}
77
78  !$acc loop gang(num: gangNum)
79  DO i = 1, n
80    a(i) = b(i)
81  END DO
82
83!CHECK:      [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
84!CHECK-NEXT: acc.loop gang(num=[[GANGNUM2]]: i32) {
85!CHECK:        fir.do_loop
86!CHECK:        acc.yield
87!CHECK-NEXT: }{{$}}
88
89 !$acc loop gang(num: gangNum, static: gangStatic)
90  DO i = 1, n
91    a(i) = b(i)
92  END DO
93
94!CHECK: acc.loop gang(num=%{{.*}}: i32, static=%{{.*}}: i32) {
95!CHECK:        fir.do_loop
96!CHECK:        acc.yield
97!CHECK-NEXT: }{{$}}
98
99  !$acc loop vector
100  DO i = 1, n
101    a(i) = b(i)
102  END DO
103
104!CHECK:      acc.loop vector {
105!CHECK:        fir.do_loop
106!CHECK:        acc.yield
107!CHECK-NEXT: }{{$}}
108
109  !$acc loop vector(128)
110  DO i = 1, n
111    a(i) = b(i)
112  END DO
113
114!CHECK: [[CONSTANT128:%.*]] = arith.constant 128 : i32
115!CHECK:      acc.loop vector([[CONSTANT128]]: i32) {
116!CHECK:        fir.do_loop
117!CHECK:        acc.yield
118!CHECK-NEXT: }{{$}}
119
120  !$acc loop vector(vectorLength)
121  DO i = 1, n
122    a(i) = b(i)
123  END DO
124
125!CHECK:      [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
126!CHECK:      acc.loop vector([[VECTORLENGTH]]: i32) {
127!CHECK:        fir.do_loop
128!CHECK:        acc.yield
129!CHECK-NEXT: }{{$}}
130
131!$acc loop worker
132  DO i = 1, n
133    a(i) = b(i)
134  END DO
135
136!CHECK:      acc.loop worker {
137!CHECK:        fir.do_loop
138!CHECK:        acc.yield
139!CHECK-NEXT: }{{$}}
140
141  !$acc loop worker(128)
142  DO i = 1, n
143    a(i) = b(i)
144  END DO
145
146!CHECK: [[WORKER128:%.*]] = arith.constant 128 : i32
147!CHECK:      acc.loop worker([[WORKER128]]: i32) {
148!CHECK:        fir.do_loop
149!CHECK:        acc.yield
150!CHECK-NEXT: }{{$}}
151
152  !$acc loop private(c)
153  DO i = 1, n
154    a(i) = b(i)
155  END DO
156
157!CHECK:      acc.loop private(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>) {
158!CHECK:        fir.do_loop
159!CHECK:        acc.yield
160!CHECK-NEXT: }{{$}}
161
162  !$acc loop private(c, d)
163  DO i = 1, n
164    a(i) = b(i)
165  END DO
166
167!CHECK:      acc.loop private(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>, %{{.*}}: !fir.ref<!fir.array<10x10xf32>>) {
168!CHECK:        fir.do_loop
169!CHECK:        acc.yield
170!CHECK-NEXT: }{{$}}
171
172  !$acc loop private(c) private(d)
173  DO i = 1, n
174    a(i) = b(i)
175  END DO
176
177!CHECK:      acc.loop private(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>, %{{.*}}: !fir.ref<!fir.array<10x10xf32>>) {
178!CHECK:        fir.do_loop
179!CHECK:        acc.yield
180!CHECK-NEXT: }{{$}}
181
182  !$acc loop tile(2)
183  DO i = 1, n
184    a(i) = b(i)
185  END DO
186!CHECK:      [[TILESIZE:%.*]] = arith.constant 2 : i32
187!CHECK:      acc.loop tile([[TILESIZE]]: i32) {
188!CHECK:        fir.do_loop
189!CHECK:        acc.yield
190!CHECK-NEXT: }{{$}}
191
192 !$acc loop tile(*)
193  DO i = 1, n
194    a(i) = b(i)
195  END DO
196!CHECK:      [[TILESIZEM1:%.*]] = arith.constant -1 : i32
197!CHECK:      acc.loop tile([[TILESIZEM1]]: i32) {
198!CHECK:        fir.do_loop
199!CHECK:        acc.yield
200!CHECK-NEXT: }{{$}}
201
202  !$acc loop tile(2, 2)
203  DO i = 1, n
204    DO j = 1, n
205      c(i, j) = d(i, j)
206    END DO
207  END DO
208
209!CHECK:      [[TILESIZE1:%.*]] = arith.constant 2 : i32
210!CHECK:      [[TILESIZE2:%.*]] = arith.constant 2 : i32
211!CHECK:      acc.loop tile([[TILESIZE1]]: i32, [[TILESIZE2]]: i32) {
212!CHECK:        fir.do_loop
213!CHECK:        acc.yield
214!CHECK-NEXT: }{{$}}
215
216  !$acc loop tile(tileSize)
217  DO i = 1, n
218    a(i) = b(i)
219  END DO
220
221!CHECK:      acc.loop tile(%{{.*}}: i32) {
222!CHECK:        fir.do_loop
223!CHECK:        acc.yield
224!CHECK-NEXT: }{{$}}
225
226  !$acc loop tile(tileSize, tileSize)
227  DO i = 1, n
228    DO j = 1, n
229      c(i, j) = d(i, j)
230    END DO
231  END DO
232
233!CHECK:      acc.loop tile(%{{.*}}: i32, %{{.*}}: i32) {
234!CHECK:        fir.do_loop
235!CHECK:        acc.yield
236!CHECK-NEXT: }{{$}}
237
238  !$acc loop collapse(2)
239  DO i = 1, n
240    DO j = 1, n
241      c(i, j) = d(i, j)
242    END DO
243  END DO
244
245!CHECK:      acc.loop {
246!CHECK:        fir.do_loop
247!CHECK:          fir.do_loop
248!CHECK:        acc.yield
249!CHECK-NEXT: } attributes {collapse = 2 : i64}
250
251  !$acc loop
252  DO i = 1, n
253    !$acc loop
254    DO j = 1, n
255      c(i, j) = d(i, j)
256    END DO
257  END DO
258
259!CHECK:      acc.loop {
260!CHECK:        fir.do_loop
261!CHECK:          acc.loop {
262!CHECK:            fir.do_loop
263!CHECK:            acc.yield
264!CHECK-NEXT:   }{{$}}
265!CHECK:        acc.yield
266!CHECK-NEXT: }{{$}}
267
268end program
269