431 lines · plain
1! This test checks lowering of Fortran do loops and do concurrent loops to OpenACC loop constructs.2! Tests the new functionality that converts Fortran iteration constructs to acc.loop with proper IV handling.3 4! RUN: bbc -fopenacc -emit-hlfir %s -o - | FileCheck %s5! RUN: bbc -fopenacc -emit-hlfir --openacc-do-loop-to-acc-loop=false %s -o - | FileCheck %s --check-prefix=CHECK-NOACCLOOP6 7! CHECK-LABEL: func.func @_QPbasic_do_loop8subroutine basic_do_loop()9 integer :: i10 integer, parameter :: n = 1011 real, dimension(n) :: a, b12 13 ! Basic do loop that should be converted to acc.loop14 !$acc kernels15 do i = 1, n16 a(i) = b(i) + 1.017 end do18 !$acc end kernels19 20! CHECK: acc.kernels {21! CHECK: %[[PRIVATE_IV:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}22! CHECK: acc.loop private(%[[PRIVATE_IV]] : !fir.ref<i32>) control(%{{.*}} : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32)23! CHECK: %[[PRIVATE_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_IV]] {uniq_name = "_QFbasic_do_loopEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)24! CHECK: fir.store %{{.*}} to %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>25! CHECK: %{{.*}} = fir.load %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>26! CHECK: %{{.*}} = fir.load %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>27! CHECK: acc.yield28! CHECK: attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}29 30! CHECK-NOACCLOOP-LABEL: func.func @_QPbasic_do_loop31! CHECK-NOACCLOOP: acc.kernels {32! CHECK-NOACCLOOP-NOT: acc.loop33 34end subroutine35 36! CHECK-LABEL: func.func @_QPbasic_do_concurrent37subroutine basic_do_concurrent()38 integer :: i39 integer, parameter :: n = 1040 real, dimension(n) :: a, b41 42 ! Basic do concurrent loop43 !$acc kernels44 do concurrent (i = 1:n)45 a(i) = b(i) + 1.046 end do47 !$acc end kernels48 49! CHECK: acc.kernels {50! CHECK: %[[PRIVATE_IV:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}51! CHECK: acc.loop private(%[[PRIVATE_IV]] : !fir.ref<i32>) control(%{{.*}} : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32)52! CHECK: %[[PRIVATE_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_IV]] {uniq_name = "_QFbasic_do_concurrentEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)53! CHECK: fir.store %{{.*}} to %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>54! CHECK: %{{.*}} = fir.load %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>55! CHECK: %{{.*}} = fir.load %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>56! CHECK: acc.yield57! CHECK: attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}58 59! CHECK-NOACCLOOP-LABEL: func.func @_QPbasic_do_concurrent60! CHECK-NOACCLOOP: acc.kernels {61! CHECK-NOACCLOOP-NOT: acc.loop62 63end subroutine64 65! CHECK-LABEL: func.func @_QPbasic_do_loop_parallel66subroutine basic_do_loop_parallel()67 integer :: i68 integer, parameter :: n = 1069 real, dimension(n) :: a, b70 71 ! Basic do loop with acc parallel that should be converted to acc.loop72 !$acc parallel73 do i = 1, n74 a(i) = b(i) + 1.075 end do76 !$acc end parallel77 78! CHECK: acc.parallel {79! CHECK: %[[PRIVATE_IV:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}80! CHECK: acc.loop private(%[[PRIVATE_IV]] : !fir.ref<i32>) control(%{{.*}} : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32)81! CHECK: %[[PRIVATE_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_IV]] {uniq_name = "_QFbasic_do_loop_parallelEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)82! CHECK: fir.store %{{.*}} to %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>83! CHECK: %{{.*}} = fir.load %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>84! CHECK: %{{.*}} = fir.load %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>85! CHECK: acc.yield86! CHECK: attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}87 88! CHECK-NOACCLOOP-LABEL: func.func @_QPbasic_do_loop_parallel89! CHECK-NOACCLOOP: acc.parallel {90! CHECK-NOACCLOOP-NOT: acc.loop91 92end subroutine93 94! CHECK-LABEL: func.func @_QPbasic_do_loop_serial95subroutine basic_do_loop_serial()96 integer :: i97 integer, parameter :: n = 1098 real, dimension(n) :: a, b99 100 ! Basic do loop with acc serial that should be converted to acc.loop101 !$acc serial102 do i = 1, n103 a(i) = b(i) + 1.0104 end do105 !$acc end serial106 107! CHECK: acc.serial {108! CHECK: %[[PRIVATE_IV:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}109! CHECK: acc.loop private(%[[PRIVATE_IV]] : !fir.ref<i32>) control(%{{.*}} : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32)110! CHECK: %[[PRIVATE_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_IV]] {uniq_name = "_QFbasic_do_loop_serialEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)111! CHECK: fir.store %{{.*}} to %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>112! CHECK: %{{.*}} = fir.load %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>113! CHECK: %{{.*}} = fir.load %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>114! CHECK: acc.yield115! CHECK: attributes {inclusiveUpperbound = array<i1: true>, seq = [#acc.device_type<none>]}116 117! CHECK-NOACCLOOP-LABEL: func.func @_QPbasic_do_loop_serial118! CHECK-NOACCLOOP: acc.serial {119! CHECK-NOACCLOOP-NOT: acc.loop120 121end subroutine122 123! CHECK-LABEL: func.func @_QPbasic_do_concurrent_parallel124subroutine basic_do_concurrent_parallel()125 integer :: i126 integer, parameter :: n = 10127 real, dimension(n) :: a, b128 129 ! Basic do concurrent loop with acc parallel130 !$acc parallel131 do concurrent (i = 1:n)132 a(i) = b(i) + 1.0133 end do134 !$acc end parallel135 136! CHECK: acc.parallel {137! CHECK: %[[PRIVATE_IV:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}138! CHECK: acc.loop private(%[[PRIVATE_IV]] : !fir.ref<i32>) control(%{{.*}} : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32)139! CHECK: %[[PRIVATE_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_IV]] {uniq_name = "_QFbasic_do_concurrent_parallelEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)140! CHECK: fir.store %{{.*}} to %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>141! CHECK: %{{.*}} = fir.load %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>142! CHECK: %{{.*}} = fir.load %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>143! CHECK: acc.yield144! CHECK: attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}145 146! CHECK-NOACCLOOP-LABEL: func.func @_QPbasic_do_concurrent_parallel147! CHECK-NOACCLOOP: acc.parallel {148! CHECK-NOACCLOOP-NOT: acc.loop149 150end subroutine151 152! CHECK-LABEL: func.func @_QPbasic_do_concurrent_serial153subroutine basic_do_concurrent_serial()154 integer :: i155 integer, parameter :: n = 10156 real, dimension(n) :: a, b157 158 ! Basic do concurrent loop with acc serial159 !$acc serial160 do concurrent (i = 1:n)161 a(i) = b(i) + 1.0162 end do163 !$acc end serial164 165! CHECK: acc.serial {166! CHECK: %[[PRIVATE_IV:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}167! CHECK: acc.loop private(%[[PRIVATE_IV]] : !fir.ref<i32>) control(%{{.*}} : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32)168! CHECK: %[[PRIVATE_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_IV]] {uniq_name = "_QFbasic_do_concurrent_serialEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)169! CHECK: fir.store %{{.*}} to %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>170! CHECK: %{{.*}} = fir.load %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>171! CHECK: %{{.*}} = fir.load %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>172! CHECK: acc.yield173! CHECK: attributes {inclusiveUpperbound = array<i1: true>, seq = [#acc.device_type<none>]}174 175! CHECK-NOACCLOOP-LABEL: func.func @_QPbasic_do_concurrent_serial176! CHECK-NOACCLOOP: acc.serial {177! CHECK-NOACCLOOP-NOT: acc.loop178 179end subroutine180 181! CHECK-LABEL: func.func @_QPmulti_dimension_do_concurrent182subroutine multi_dimension_do_concurrent()183 integer :: i, j, k184 integer, parameter :: n = 10, m = 20, l = 5185 real, dimension(n,m,l) :: a, b186 187 ! Multi-dimensional do concurrent with multiple iteration variables188 !$acc kernels189 do concurrent (i = 1:n, j = 1:m, k = 1:l)190 a(i,j,k) = b(i,j,k) * 2.0191 end do192 !$acc end kernels193 194! CHECK: acc.kernels {195! CHECK-DAG: %[[PRIVATE_I:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}196! CHECK-DAG: %[[PRIVATE_J:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "j"}197! CHECK-DAG: %[[PRIVATE_K:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "k"}198! CHECK: acc.loop private(%[[PRIVATE_I]], %[[PRIVATE_J]], %[[PRIVATE_K]] : !fir.ref<i32>, !fir.ref<i32>, !fir.ref<i32>) control(%{{.*}} : i32, %{{.*}} : i32, %{{.*}} : i32) = (%c1{{.*}}, %c1{{.*}}, %c1{{.*}} : i32, i32, i32) to (%{{.*}}, %{{.*}}, %{{.*}} : i32, i32, i32) step (%c1{{.*}}, %c1{{.*}}, %c1{{.*}} : i32, i32, i32)199! CHECK-DAG: %[[PRIVATE_I_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_I]] {uniq_name = "_QFmulti_dimension_do_concurrentEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)200! CHECK-DAG: %[[PRIVATE_J_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_J]] {uniq_name = "_QFmulti_dimension_do_concurrentEj"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)201! CHECK-DAG: %[[PRIVATE_K_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_K]] {uniq_name = "_QFmulti_dimension_do_concurrentEk"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)202! CHECK: fir.store %{{.*}} to %[[PRIVATE_I_DECLARE]]#0 : !fir.ref<i32>203! CHECK: fir.store %{{.*}} to %[[PRIVATE_J_DECLARE]]#0 : !fir.ref<i32>204! CHECK: fir.store %{{.*}} to %[[PRIVATE_K_DECLARE]]#0 : !fir.ref<i32>205! CHECK: %{{.*}} = fir.load %[[PRIVATE_I_DECLARE]]#0 : !fir.ref<i32>206! CHECK: %{{.*}} = fir.load %[[PRIVATE_J_DECLARE]]#0 : !fir.ref<i32>207! CHECK: %{{.*}} = fir.load %[[PRIVATE_K_DECLARE]]#0 : !fir.ref<i32>208! CHECK: %{{.*}} = fir.load %[[PRIVATE_I_DECLARE]]#0 : !fir.ref<i32>209! CHECK: %{{.*}} = fir.load %[[PRIVATE_J_DECLARE]]#0 : !fir.ref<i32>210! CHECK: %{{.*}} = fir.load %[[PRIVATE_K_DECLARE]]#0 : !fir.ref<i32>211! CHECK: acc.yield212! CHECK: attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true, true, true>}213 214! CHECK-NOACCLOOP-LABEL: func.func @_QPmulti_dimension_do_concurrent215! CHECK-NOACCLOOP: acc.kernels {216! CHECK-NOACCLOOP-NOT: acc.loop217 218end subroutine219 220 221! CHECK-LABEL: func.func @_QPnested_do_loops222subroutine nested_do_loops()223 integer :: i, j224 integer, parameter :: n = 10, m = 20225 real, dimension(n,m) :: a, b226 227 ! Nested do loops228 !$acc kernels229 do i = 1, n230 do j = 1, m231 a(i,j) = b(i,j) + i + j232 end do233 end do234 !$acc end kernels235 236! CHECK: acc.kernels {237! CHECK-DAG: %[[PRIVATE_I:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}238! CHECK: acc.loop private(%[[PRIVATE_I]] : !fir.ref<i32>) control(%{{.*}} : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32)239! CHECK-DAG: %[[PRIVATE_I_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_I]] {uniq_name = "_QFnested_do_loopsEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)240! CHECK: fir.store %{{.*}} to %[[PRIVATE_I_DECLARE]]#0 : !fir.ref<i32>241! CHECK-DAG: %[[PRIVATE_J:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "j"}242! CHECK: acc.loop private(%[[PRIVATE_J]] : !fir.ref<i32>) control(%{{.*}} : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32)243! CHECK-DAG: %[[PRIVATE_J_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_J]] {uniq_name = "_QFnested_do_loopsEj"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)244! CHECK: fir.store %{{.*}} to %[[PRIVATE_J_DECLARE]]#0 : !fir.ref<i32>245! CHECK: %{{.*}} = fir.load %[[PRIVATE_I_DECLARE]]#0 : !fir.ref<i32>246! CHECK: %{{.*}} = fir.load %[[PRIVATE_J_DECLARE]]#0 : !fir.ref<i32>247! CHECK: %{{.*}} = fir.load %[[PRIVATE_I_DECLARE]]#0 : !fir.ref<i32>248! CHECK: %{{.*}} = fir.load %[[PRIVATE_J_DECLARE]]#0 : !fir.ref<i32>249! CHECK: acc.yield250! CHECK: attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}251! CHECK: acc.yield252! CHECK: attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}253 254! CHECK-NOACCLOOP-LABEL: func.func @_QPnested_do_loops255! CHECK-NOACCLOOP: acc.kernels {256! CHECK-NOACCLOOP-NOT: acc.loop257 258end subroutine259 260! CHECK-LABEL: func.func @_QPvariable_bounds_and_step261subroutine variable_bounds_and_step(n, start_val, step_val)262 integer, intent(in) :: n, start_val, step_val263 integer :: i264 real, dimension(n) :: a, b265 266 ! Do loop with variable bounds and step267 !$acc kernels268 do i = start_val, n, step_val269 a(i) = b(i) * 2.0270 end do271 !$acc end kernels272 273! CHECK: acc.kernels {274! CHECK: %[[PRIVATE_IV:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}275! CHECK: acc.loop private(%[[PRIVATE_IV]] : !fir.ref<i32>) control(%{{.*}} : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32)276! CHECK: %[[PRIVATE_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_IV]] {uniq_name = "_QFvariable_bounds_and_stepEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)277! CHECK: fir.store %{{.*}} to %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>278! CHECK: %{{.*}} = fir.load %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>279! CHECK: %{{.*}} = fir.load %[[PRIVATE_DECLARE]]#0 : !fir.ref<i32>280! CHECK: acc.yield281! CHECK: attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}282 283! CHECK-NOACCLOOP-LABEL: func.func @_QPvariable_bounds_and_step284! CHECK-NOACCLOOP: acc.kernels {285! CHECK-NOACCLOOP-NOT: acc.loop286 287end subroutine288 289! CHECK-LABEL: func.func @_QPdifferent_iv_types290subroutine different_iv_types()291 integer(kind=8) :: i8292 integer(kind=4) :: i4293 integer(kind=2) :: i2294 integer, parameter :: n = 10295 real, dimension(n) :: a, b, c, d296 297 ! Test different iteration variable types298 !$acc kernels299 do i8 = 1_8, int(n,8)300 a(i8) = b(i8) + 1.0301 end do302 !$acc end kernels303 304 !$acc kernels305 do i4 = 1, n306 b(i4) = c(i4) + 1.0307 end do308 !$acc end kernels309 310 !$acc kernels311 do i2 = 1_2, int(n,2)312 c(i2) = d(i2) + 1.0313 end do314 !$acc end kernels315 316! CHECK: acc.kernels {317! CHECK: %[[PRIVATE_I8:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i64>) recipe(@privatization_ref_i64) -> !fir.ref<i64> {implicit = true, name = "i8"}318! CHECK: acc.loop private(%[[PRIVATE_I8]] : !fir.ref<i64>) control(%{{.*}} : i64) = (%{{.*}} : i64) to (%{{.*}} : i64) step (%{{.*}} : i64)319! CHECK: %[[PRIVATE_I8_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_I8]] {uniq_name = "_QFdifferent_iv_typesEi8"} : (!fir.ref<i64>) -> (!fir.ref<i64>, !fir.ref<i64>)320! CHECK: fir.store %{{.*}} to %[[PRIVATE_I8_DECLARE]]#0 : !fir.ref<i64>321! CHECK: %{{.*}} = fir.load %[[PRIVATE_I8_DECLARE]]#0 : !fir.ref<i64>322! CHECK: %{{.*}} = fir.load %[[PRIVATE_I8_DECLARE]]#0 : !fir.ref<i64>323! CHECK: acc.kernels {324! CHECK: %[[PRIVATE_I4:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i4"}325! CHECK: acc.loop private(%[[PRIVATE_I4]] : !fir.ref<i32>) control(%{{.*}} : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32)326! CHECK: %[[PRIVATE_I4_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_I4]] {uniq_name = "_QFdifferent_iv_typesEi4"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)327! CHECK: fir.store %{{.*}} to %[[PRIVATE_I4_DECLARE]]#0 : !fir.ref<i32>328! CHECK: %{{.*}} = fir.load %[[PRIVATE_I4_DECLARE]]#0 : !fir.ref<i32>329! CHECK: %{{.*}} = fir.load %[[PRIVATE_I4_DECLARE]]#0 : !fir.ref<i32>330! CHECK: acc.kernels {331! CHECK: %[[PRIVATE_I2:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i16>) recipe(@privatization_ref_i16) -> !fir.ref<i16> {implicit = true, name = "i2"}332! CHECK: acc.loop private(%[[PRIVATE_I2]] : !fir.ref<i16>) control(%{{.*}} : i16) = (%{{.*}} : i16) to (%{{.*}} : i16) step (%{{.*}} : i16)333! CHECK: %[[PRIVATE_I2_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_I2]] {uniq_name = "_QFdifferent_iv_typesEi2"} : (!fir.ref<i16>) -> (!fir.ref<i16>, !fir.ref<i16>)334! CHECK: fir.store %{{.*}} to %[[PRIVATE_I2_DECLARE]]#0 : !fir.ref<i16>335! CHECK: %{{.*}} = fir.load %[[PRIVATE_I2_DECLARE]]#0 : !fir.ref<i16>336! CHECK: %{{.*}} = fir.load %[[PRIVATE_I2_DECLARE]]#0 : !fir.ref<i16>337 338! CHECK-NOACCLOOP-LABEL: func.func @_QPdifferent_iv_types339! CHECK-NOACCLOOP: acc.kernels {340! CHECK-NOACCLOOP-NOT: acc.loop341 342end subroutine343 344! CHECK-LABEL: func.func @_QPnested_loop_with_reduction345subroutine nested_loop_with_reduction(x, y)346 integer :: x, y347 integer :: i, j348 349 ! Nested loop with reduction variables - check that reduction operations350 ! are correctly scoped (outer loop reduction should not be inside inner loop)351 !$acc parallel352 !$acc loop reduction(+:x,y)353 do i = 1, 10354 do j = 1, 20355 y = y + 1356 end do357 x = x + 1358 end do359 !$acc end parallel360 361! CHECK: acc.parallel {362! CHECK: %[[REDUCTION_X:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_add_ref_i32) -> !fir.ref<i32> {name = "x"}363! CHECK: %[[REDUCTION_Y:.*]] = acc.reduction varPtr(%{{.*}} : !fir.ref<i32>) recipe(@reduction_add_ref_i32) -> !fir.ref<i32> {name = "y"}364! CHECK: %[[PRIVATE_I:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "i"}365! CHECK: acc.loop private(%[[PRIVATE_I]] : !fir.ref<i32>) reduction(%[[REDUCTION_X]], %[[REDUCTION_Y]] : !fir.ref<i32>, !fir.ref<i32>) control(%{{.*}} : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32)366! CHECK: %[[PRIVATE_I_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_I]] {uniq_name = "_QFnested_loop_with_reductionEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)367! CHECK: fir.store %{{.*}} to %[[PRIVATE_I_DECLARE]]#0 : !fir.ref<i32>368! CHECK: %[[PRIVATE_J:.*]] = acc.private varPtr(%{{.*}} : !fir.ref<i32>) recipe(@privatization_ref_i32) -> !fir.ref<i32> {implicit = true, name = "j"}369! CHECK: acc.loop private(%[[PRIVATE_J]] : !fir.ref<i32>) control(%{{.*}} : i32) = (%{{.*}} : i32) to (%{{.*}} : i32) step (%{{.*}} : i32)370! CHECK: %[[PRIVATE_J_DECLARE:.*]]:2 = hlfir.declare %[[PRIVATE_J]] {uniq_name = "_QFnested_loop_with_reductionEj"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>)371! CHECK: fir.store %{{.*}} to %[[PRIVATE_J_DECLARE]]#0 : !fir.ref<i32>372! CHECK: %{{.*}} = fir.load %{{.*}} : !fir.ref<i32>373! CHECK: %{{.*}} = arith.addi %{{.*}}, %{{.*}} : i32374! CHECK: hlfir.assign %{{.*}} to %{{.*}} : i32, !fir.ref<i32>375! CHECK: acc.yield376! CHECK: attributes {auto_ = [#acc.device_type<none>], inclusiveUpperbound = array<i1: true>}377! CHECK: %{{.*}} = fir.load %{{.*}} : !fir.ref<i32>378! CHECK: %{{.*}} = arith.addi %{{.*}}, %{{.*}} : i32379! CHECK: hlfir.assign %{{.*}} to %{{.*}} : i32, !fir.ref<i32>380! CHECK: acc.yield381! CHECK: attributes {inclusiveUpperbound = array<i1: true>, independent = [#acc.device_type<none>]}382 383! CHECK-NOACCLOOP-LABEL: func.func @_QPnested_loop_with_reduction384! CHECK-NOACCLOOP: acc.parallel {385! CHECK-NOACCLOOP: acc.loop{{.*}}reduction{{.*}}control386! CHECK-NOACCLOOP-NOT: acc.loop387 388end subroutine389 390! -----------------------------------------------------------------------------------------391! Tests for loops that should NOT be converted to acc.loop due to unstructured control flow392 393! CHECK-LABEL: func.func @_QPinfinite_loop_no_iv394subroutine infinite_loop_no_iv()395 integer :: i396 logical :: condition397 398 ! Infinite loop with no induction variable - should NOT convert to acc.loop399 !$acc kernels400 do401 i = i + 1402 if (i > 100) exit403 end do404 !$acc end kernels405 406! CHECK: acc.kernels {407! CHECK-NOT: acc.loop408 409end subroutine410 411! CHECK-LABEL: func.func @_QPwhile_like_loop412subroutine while_like_loop()413 integer :: i414 logical :: condition415 416 i = 1417 condition = .true.418 419 ! While-like infinite loop - should NOT convert to acc.loop420 !$acc kernels421 do while (condition)422 i = i + 1423 if (i > 100) condition = .false.424 end do425 !$acc end kernels426 427! CHECK: acc.kernels {428! CHECK-NOT: acc.loop429 430end subroutine431