brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.6 KiB · 2bfc561 Raw
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