1 ! This test checks lowering of OpenACC loop directive.
3 ! RUN: bbc -fopenacc -emit-fir %s -o - | FileCheck %s
4 ! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s
6 ! CHECK-LABEL: acc.private.recipe @privatization_ref_10x10xf32 : !fir.ref<!fir.array<10x10xf32>> init {
7 ! CHECK: ^bb0(%{{.*}}: !fir.ref<!fir.array<10x10xf32>>):
8 ! CHECK: acc.yield %{{.*}} : !fir.ref<!fir.array<10x10xf32>>
14 integer, parameter :: n
= 10
15 real, dimension(n
) :: a
, b
16 real, dimension(n
, n
) :: c
, d
17 integer :: gangNum
= 8
18 integer :: gangDim
= 1
19 integer :: gangStatic
= 8
20 integer :: vectorLength
= 128
21 integer, parameter :: tileSize
= 2
22 integer :: reduction_i
44 !CHECK-NEXT: } attributes {seq}
54 !CHECK-NEXT: } attributes {auto}
56 !$acc loop independent
64 !CHECK-NEXT: } attributes {independent}
71 !CHECK: acc.loop gang {
76 !$acc loop gang(num: 8)
81 !CHECK: [[GANGNUM1:%.*]] = arith.constant 8 : i32
82 !CHECK-NEXT: acc.loop gang(num=[[GANGNUM1]] : i32) {
87 !$acc loop gang(num: gangNum)
92 !CHECK: [[GANGNUM2:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
93 !CHECK-NEXT: acc.loop gang(num=[[GANGNUM2]] : i32) {
98 !$acc loop gang(num: gangNum, static: gangStatic)
103 !CHECK: acc.loop gang(num=%{{.*}} : i32, static=%{{.*}} : i32) {
113 !CHECK: acc.loop vector {
118 !$acc loop vector(128)
123 !CHECK: [[CONSTANT128:%.*]] = arith.constant 128 : i32
124 !CHECK: acc.loop vector([[CONSTANT128]] : i32) {
129 !$acc loop vector(vectorLength)
134 !CHECK: [[VECTORLENGTH:%.*]] = fir.load %{{.*}} : !fir.ref<i32>
135 !CHECK: acc.loop vector([[VECTORLENGTH]] : i32) {
145 !CHECK: acc.loop worker {
150 !$acc loop worker(128)
155 !CHECK: [[WORKER128:%.*]] = arith.constant 128 : i32
156 !CHECK: acc.loop worker([[WORKER128]] : i32) {
161 !$acc loop private(c)
166 !CHECK: acc.loop private(@privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>) {
171 !$acc loop private(c, d)
176 !CHECK: acc.loop private(@privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>, @privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>) {
181 !$acc loop private(c) private(d)
186 !CHECK: acc.loop private(@privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>, @privatization_ref_10x10xf32 -> %{{.*}} : !fir.ref<!fir.array<10x10xf32>>) {
195 !CHECK: [[TILESIZE:%.*]] = arith.constant 2 : i32
196 !CHECK: acc.loop tile([[TILESIZE]] : i32) {
205 !CHECK: [[TILESIZEM1:%.*]] = arith.constant -1 : i32
206 !CHECK: acc.loop tile([[TILESIZEM1]] : i32) {
211 !$acc loop tile(2, 2)
218 !CHECK: [[TILESIZE1:%.*]] = arith.constant 2 : i32
219 !CHECK: [[TILESIZE2:%.*]] = arith.constant 2 : i32
220 !CHECK: acc.loop tile([[TILESIZE1]], [[TILESIZE2]] : i32, i32) {
225 !$acc loop tile(tileSize)
230 !CHECK: acc.loop tile(%{{.*}} : i32) {
235 !$acc loop tile(tileSize, tileSize)
242 !CHECK: acc.loop tile(%{{.*}}, %{{.*}} : i32, i32) {
247 !$acc loop collapse(2)
258 !CHECK-NEXT: } attributes {collapse = 2 : i64}
277 !$acc loop reduction(+:reduction_r) reduction(*:reduction_i)
279 reduction_r
= reduction_r
+ a(i
)
283 ! CHECK: acc.loop reduction(@reduction_add_ref_f32 -> %{{.*}} : !fir.ref<f32>, @reduction_mul_ref_i32 -> %{{.*}} : !fir.ref<i32>) {
288 !$acc loop gang(dim: gangDim, static: gangStatic)
293 !CHECK: acc.loop gang(dim=%{{.*}}, static=%{{.*}} : i32) {
298 !$acc loop gang(dim: 1)
303 !CHECK: [[GANGDIM1:%.*]] = arith.constant 1 : i32
304 !CHECK-NEXT: acc.loop gang(dim=[[GANGDIM1]] : i32) {
315 ! CHECK: %[[CACHE:.*]] = acc.cache varPtr(%{{.*}} : !fir.ref<!fir.array<10xf32>>) bounds(%{{.*}}) -> !fir.ref<!fir.array<10xf32>> {name = "b"}
316 ! CHECK: acc.loop cache(%[[CACHE]] : !fir.ref<!fir.array<10xf32>>)