1! This test checks lowering of OpenACC parallel directive.
2
3! RUN: bbc -fopenacc -emit-fir %s -o - | FileCheck %s
4
5subroutine acc_parallel
6  integer :: i, j
7
8  integer :: async = 1
9  integer :: wait1 = 1
10  integer :: wait2 = 2
11  integer :: numGangs = 1
12  integer :: numWorkers = 10
13  integer :: vectorLength = 128
14  logical :: ifCondition = .TRUE.
15  real, dimension(10, 10) :: a, b, c
16  real, pointer :: d, e
17
18!CHECK: [[A:%.*]] = fir.alloca !fir.array<10x10xf32> {{{.*}}uniq_name = "{{.*}}Ea"}
19!CHECK: [[B:%.*]] = fir.alloca !fir.array<10x10xf32> {{{.*}}uniq_name = "{{.*}}Eb"}
20!CHECK: [[C:%.*]] = fir.alloca !fir.array<10x10xf32> {{{.*}}uniq_name = "{{.*}}Ec"}
21!CHECK: [[D:%.*]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = "d", uniq_name = "{{.*}}Ed"}
22!CHECK: [[E:%.*]] = fir.alloca !fir.box<!fir.ptr<f32>> {bindc_name = "e", uniq_name = "{{.*}}Ee"}
23!CHECK: [[IFCONDITION:%.*]] = fir.address_of(@{{.*}}ifcondition) : !fir.ref<!fir.logical<4>>
24
25  !$acc parallel
26  !$acc end parallel
27
28!CHECK:      acc.parallel {
29!CHECK:        acc.yield
30!CHECK-NEXT: }{{$}}
31
32  !$acc parallel async
33  !$acc end parallel
34
35!CHECK:      acc.parallel {
36!CHECK:        acc.yield
37!CHECK-NEXT: } attributes {asyncAttr}
38
39  !$acc parallel async(1)
40  !$acc end parallel
41
42!CHECK:      [[ASYNC1:%.*]] = arith.constant 1 : i32
43!CHECK:      acc.parallel async([[ASYNC1]]: i32) {
44!CHECK:        acc.yield
45!CHECK-NEXT: }{{$}}
46
47  !$acc parallel async(async)
48  !$acc end parallel
49
50!CHECK:      [[ASYNC2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
51!CHECK:      acc.parallel async([[ASYNC2]]: i32) {
52!CHECK:        acc.yield
53!CHECK-NEXT: }{{$}}
54
55  !$acc parallel wait
56  !$acc end parallel
57
58!CHECK:      acc.parallel {
59!CHECK:        acc.yield
60!CHECK-NEXT: } attributes {waitAttr}
61
62  !$acc parallel wait(1)
63  !$acc end parallel
64
65!CHECK:      [[WAIT1:%.*]] = arith.constant 1 : i32
66!CHECK:      acc.parallel wait([[WAIT1]]: i32) {
67!CHECK:        acc.yield
68!CHECK-NEXT: }{{$}}
69
70  !$acc parallel wait(1, 2)
71  !$acc end parallel
72
73!CHECK:      [[WAIT2:%.*]] = arith.constant 1 : i32
74!CHECK:      [[WAIT3:%.*]] = arith.constant 2 : i32
75!CHECK:      acc.parallel wait([[WAIT2]]: i32, [[WAIT3]]: i32) {
76!CHECK:        acc.yield
77!CHECK-NEXT: }{{$}}
78
79  !$acc parallel wait(wait1, wait2)
80  !$acc end parallel
81
82!CHECK:      [[WAIT4:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
83!CHECK:      [[WAIT5:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
84!CHECK:      acc.parallel wait([[WAIT4]]: i32, [[WAIT5]]: i32) {
85!CHECK:        acc.yield
86!CHECK-NEXT: }{{$}}
87
88  !$acc parallel num_gangs(1)
89  !$acc end parallel
90
91!CHECK:      [[NUMGANGS1:%.*]] = arith.constant 1 : i32
92!CHECK:      acc.parallel num_gangs([[NUMGANGS1]]: i32) {
93!CHECK:        acc.yield
94!CHECK-NEXT: }{{$}}
95
96  !$acc parallel num_gangs(numGangs)
97  !$acc end parallel
98
99!CHECK:      [[NUMGANGS2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
100!CHECK:      acc.parallel num_gangs([[NUMGANGS2]]: i32) {
101!CHECK:        acc.yield
102!CHECK-NEXT: }{{$}}
103
104  !$acc parallel num_workers(10)
105  !$acc end parallel
106
107!CHECK:      [[NUMWORKERS1:%.*]] = arith.constant 10 : i32
108!CHECK:      acc.parallel num_workers([[NUMWORKERS1]]: i32) {
109!CHECK:        acc.yield
110!CHECK-NEXT: }{{$}}
111
112  !$acc parallel num_workers(numWorkers)
113  !$acc end parallel
114
115!CHECK:      [[NUMWORKERS2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
116!CHECK:      acc.parallel num_workers([[NUMWORKERS2]]: i32) {
117!CHECK:        acc.yield
118!CHECK-NEXT: }{{$}}
119
120  !$acc parallel vector_length(128)
121  !$acc end parallel
122
123!CHECK:      [[VECTORLENGTH1:%.*]] = arith.constant 128 : i32
124!CHECK:      acc.parallel vector_length([[VECTORLENGTH1]]: i32) {
125!CHECK:        acc.yield
126!CHECK-NEXT: }{{$}}
127
128  !$acc parallel vector_length(vectorLength)
129  !$acc end parallel
130
131!CHECK:      [[VECTORLENGTH2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
132!CHECK:      acc.parallel vector_length([[VECTORLENGTH2]]: i32) {
133!CHECK:        acc.yield
134!CHECK-NEXT: }{{$}}
135
136  !$acc parallel if(.TRUE.)
137  !$acc end parallel
138
139!CHECK:      [[IF1:%.*]] = arith.constant true
140!CHECK:      acc.parallel if([[IF1]]) {
141!CHECK:        acc.yield
142!CHECK-NEXT: }{{$}}
143
144  !$acc parallel if(ifCondition)
145  !$acc end parallel
146
147!CHECK:      [[IFCOND:%.*]] = fir.load %{{.*}} : !fir.ref<!fir.logical<4>>
148!CHECK:      [[IF2:%.*]] = fir.convert [[IFCOND]] : (!fir.logical<4>) -> i1
149!CHECK:      acc.parallel if([[IF2]]) {
150!CHECK:        acc.yield
151!CHECK-NEXT: }{{$}}
152
153  !$acc parallel self(.TRUE.)
154  !$acc end parallel
155
156!CHECK:      [[SELF1:%.*]] = arith.constant true
157!CHECK:      acc.parallel self([[SELF1]]) {
158!CHECK:        acc.yield
159!CHECK-NEXT: }{{$}}
160
161  !$acc parallel self
162  !$acc end parallel
163
164!CHECK:      acc.parallel {
165!CHECK:        acc.yield
166!CHECK-NEXT: } attributes {selfAttr}
167
168  !$acc parallel self(ifCondition)
169  !$acc end parallel
170
171!CHECK:      [[SELF2:%.*]] = fir.convert [[IFCONDITION]] : (!fir.ref<!fir.logical<4>>) -> i1
172!CHECK:      acc.parallel self([[SELF2]]) {
173!CHECK:        acc.yield
174!CHECK-NEXT: }{{$}}
175
176  !$acc parallel copy(a, b, c)
177  !$acc end parallel
178
179!CHECK:      acc.parallel copy([[A]]: !fir.ref<!fir.array<10x10xf32>>, [[B]]: !fir.ref<!fir.array<10x10xf32>>, [[C]]: !fir.ref<!fir.array<10x10xf32>>) {
180!CHECK:        acc.yield
181!CHECK-NEXT: }{{$}}
182
183  !$acc parallel copy(a) copy(b) copy(c)
184  !$acc end parallel
185
186!CHECK:      acc.parallel copy([[A]]: !fir.ref<!fir.array<10x10xf32>>, [[B]]: !fir.ref<!fir.array<10x10xf32>>, [[C]]: !fir.ref<!fir.array<10x10xf32>>) {
187!CHECK:        acc.yield
188!CHECK-NEXT: }{{$}}
189
190  !$acc parallel copyin(a) copyin(readonly: b, c)
191  !$acc end parallel
192
193!CHECK:      acc.parallel copyin([[A]]: !fir.ref<!fir.array<10x10xf32>>) copyin_readonly([[B]]: !fir.ref<!fir.array<10x10xf32>>, [[C]]: !fir.ref<!fir.array<10x10xf32>>) {
194!CHECK:        acc.yield
195!CHECK-NEXT: }{{$}}
196
197  !$acc parallel copyout(a) copyout(zero: b) copyout(c)
198  !$acc end parallel
199
200!CHECK:      acc.parallel copyout([[A]]: !fir.ref<!fir.array<10x10xf32>>, [[C]]: !fir.ref<!fir.array<10x10xf32>>) copyout_zero([[B]]: !fir.ref<!fir.array<10x10xf32>>) {
201!CHECK:        acc.yield
202!CHECK-NEXT: }{{$}}
203
204  !$acc parallel create(a, b) create(zero: c)
205  !$acc end parallel
206
207!CHECK:      acc.parallel create([[A]]: !fir.ref<!fir.array<10x10xf32>>, [[B]]: !fir.ref<!fir.array<10x10xf32>>) create_zero([[C]]: !fir.ref<!fir.array<10x10xf32>>) {
208!CHECK:        acc.yield
209!CHECK-NEXT: }{{$}}
210
211  !$acc parallel no_create(a, b) create(zero: c)
212  !$acc end parallel
213
214!CHECK:      acc.parallel create_zero([[C]]: !fir.ref<!fir.array<10x10xf32>>) no_create([[A]]: !fir.ref<!fir.array<10x10xf32>>, [[B]]: !fir.ref<!fir.array<10x10xf32>>) {
215!CHECK:        acc.yield
216!CHECK-NEXT: }{{$}}
217
218  !$acc parallel present(a, b, c)
219  !$acc end parallel
220
221!CHECK:      acc.parallel present([[A]]: !fir.ref<!fir.array<10x10xf32>>, [[B]]: !fir.ref<!fir.array<10x10xf32>>, [[C]]: !fir.ref<!fir.array<10x10xf32>>) {
222!CHECK:        acc.yield
223!CHECK-NEXT: }{{$}}
224
225  !$acc parallel deviceptr(a) deviceptr(c)
226  !$acc end parallel
227
228!CHECK:      acc.parallel deviceptr([[A]]: !fir.ref<!fir.array<10x10xf32>>, [[C]]: !fir.ref<!fir.array<10x10xf32>>) {
229!CHECK:        acc.yield
230!CHECK-NEXT: }{{$}}
231
232  !$acc parallel attach(d, e)
233  !$acc end parallel
234
235!CHECK:      acc.parallel attach([[D]]: !fir.ref<!fir.box<!fir.ptr<f32>>>, [[E]]: !fir.ref<!fir.box<!fir.ptr<f32>>>) {
236!CHECK:        acc.yield
237!CHECK-NEXT: }{{$}}
238
239  !$acc parallel private(a) firstprivate(b) private(c)
240  !$acc end parallel
241
242!CHECK:      acc.parallel private([[A]]: !fir.ref<!fir.array<10x10xf32>>, [[C]]: !fir.ref<!fir.array<10x10xf32>>) firstprivate([[B]]: !fir.ref<!fir.array<10x10xf32>>) {
243!CHECK:        acc.yield
244!CHECK-NEXT: }{{$}}
245
246end subroutine acc_parallel
247