! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s | FileCheck %s ! Non-iterator tests subroutine omp_task_affinity_elem() implicit none integer, parameter :: n = 100 integer :: a(n) !$omp parallel !$omp task affinity(a(1)) a(1) = 1 !$omp end task !$omp end parallel end subroutine omp_task_affinity_elem ! CHECK-LABEL: func.func @_QPomp_task_affinity_elem() ! CHECK: %[[A:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) {uniq_name = "_QFomp_task_affinity_elemEa"} : (!fir.ref>, !fir.shape<1>) -> (!fir.ref>, !fir.ref>) ! CHECK: omp.parallel { ! CHECK: %[[C1:.*]] = arith.constant 1 : index ! CHECK: %[[ELEM:.*]] = hlfir.designate %[[A]]#0 (%[[C1]]) : (!fir.ref>, index) -> !fir.ref ! CHECK: %[[C0:.*]] = arith.constant 0 : index ! CHECK: %[[C4:.*]] = arith.constant 4 : i64 ! CHECK: %[[ONE:.*]] = arith.constant 1 : index ! CHECK: %[[SUB:.*]] = arith.subi %[[C0]], %[[C0]] : index ! CHECK: %[[MUL:.*]] = arith.muli %[[SUB]], %[[ONE]] : index ! CHECK: %[[ADD:.*]] = arith.addi %[[ONE]], %[[MUL]] : index ! CHECK: %[[CAST:.*]] = fir.convert %[[ADD]] : (index) -> i64 ! CHECK: %[[LEN:.*]] = arith.muli %[[CAST]], %[[C4]] : i64 ! CHECK: %[[ADDRI8:.*]] = fir.convert %[[ELEM]] : (!fir.ref) -> !fir.ref ! CHECK: %[[ENTRY:.*]] = omp.affinity_entry %[[ADDRI8]], %[[LEN]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> ! CHECK: omp.task affinity(%[[ENTRY]] : !omp.affinity_entry_ty, i64>) { subroutine omp_task_affinity_array_section() implicit none integer, parameter :: n = 100 integer :: a(n) integer :: i !$omp parallel !$omp task affinity(a(2:50)) private(i) do i = 2, 50 a(i) = i end do !$omp end task !$omp end parallel end subroutine omp_task_affinity_array_section ! CHECK-LABEL: func.func @_QPomp_task_affinity_array_section() ! CHECK: %[[A:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) {uniq_name = "_QFomp_task_affinity_array_sectionEa"} : (!fir.ref>, !fir.shape<1>) -> (!fir.ref>, !fir.ref>) ! CHECK: %[[I:.*]]:2 = hlfir.declare %{{.*}} {uniq_name = "_QFomp_task_affinity_array_sectionEi"} : (!fir.ref) -> (!fir.ref, !fir.ref) ! CHECK: omp.parallel { ! CHECK: %[[C2:.*]] = arith.constant 2 : index ! CHECK: %[[C50:.*]] = arith.constant 50 : index ! CHECK: %[[C1:.*]] = arith.constant 1 : index ! CHECK: %[[SHAPE:.*]] = fir.shape %{{.*}} : (index) -> !fir.shape<1> ! CHECK: %[[SLICE:.*]] = hlfir.designate %[[A]]#0 (%[[C2]]:%[[C50]]:%[[C1]]) shape %[[SHAPE]] : (!fir.ref>, index, index, index, !fir.shape<1>) -> !fir.ref> ! CHECK: %[[C4:.*]] = arith.constant 4 : i64 ! CHECK: %[[SPAN_I64:.*]] = fir.convert {{.*}} : (index) -> i64 ! CHECK: %[[LEN:.*]] = arith.muli %[[SPAN_I64]], %[[C4]] : i64 ! CHECK: %[[ADDRI8:.*]] = fir.convert %[[SLICE]] : (!fir.ref>) -> !fir.ref ! CHECK: %[[ENTRY:.*]] = omp.affinity_entry %[[ADDRI8]], %[[LEN]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> ! CHECK: omp.task affinity(%[[ENTRY]] : !omp.affinity_entry_ty, i64>) private(@_QFomp_task_affinity_array_sectionEi_private_i32 %[[I]]#0 -> %{{.*}} : !fir.ref) { subroutine omp_task_affinity_scalar() implicit none integer :: s s = 7 !$omp parallel !$omp task affinity(s) s = s + 1 !$omp end task !$omp end parallel end subroutine omp_task_affinity_scalar ! CHECK-LABEL: func.func @_QPomp_task_affinity_scalar() ! CHECK: %[[S:.*]] = fir.alloca i32 {bindc_name = "s", uniq_name = "_QFomp_task_affinity_scalarEs"} ! CHECK: %[[SDECL:.*]]:2 = hlfir.declare %[[S]] {uniq_name = "_QFomp_task_affinity_scalarEs"} : (!fir.ref) -> (!fir.ref, !fir.ref) ! CHECK: hlfir.assign %{{.*}} to %[[SDECL]]#0 : i32, !fir.ref ! CHECK: omp.parallel { ! CHECK: %[[LEN:.*]] = arith.constant 4 : i64 ! CHECK: %[[ADDRI8:.*]] = fir.convert %[[SDECL]]#0 : (!fir.ref) -> !fir.ref ! CHECK: %[[ENTRY:.*]] = omp.affinity_entry %[[ADDRI8]], %[[LEN]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> ! CHECK: omp.task affinity(%[[ENTRY]] : !omp.affinity_entry_ty, i64>) { subroutine omp_task_affinity_multi() implicit none integer, parameter :: n = 100 integer :: a(n), b(n) !$omp parallel !$omp task affinity(a(1), b(1)) a(2) = 2 b(2) = 2 !$omp end task !$omp end parallel end subroutine omp_task_affinity_multi ! CHECK-LABEL: func.func @_QPomp_task_affinity_multi() ! CHECK: omp.parallel { ! CHECK: %[[AADDR:.*]] = fir.convert %{{.*}} : (!fir.ref) -> !fir.ref ! CHECK: %[[AENT:.*]] = omp.affinity_entry %[[AADDR]], %{{.*}} : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> ! CHECK: %[[BADDR:.*]] = fir.convert %{{.*}} : (!fir.ref) -> !fir.ref ! CHECK: %[[BENT:.*]] = omp.affinity_entry %[[BADDR]], %{{.*}} : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> ! CHECK: omp.task affinity(%[[AENT]] : !omp.affinity_entry_ty, i64>, %[[BENT]] : !omp.affinity_entry_ty, i64>) { subroutine whole_array_affinity() implicit none integer :: a(10) !$omp task affinity(a) a(1) = 1 !$omp end task end subroutine whole_array_affinity ! CHECK-LABEL: func.func @_QPwhole_array_affinity() ! CHECK: %[[A:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) {uniq_name = "_QFwhole_array_affinityEa"} : (!fir.ref>, !fir.shape<1>) -> (!fir.ref>, !fir.ref>) ! CHECK: %[[C4:.*]] = arith.constant 4 : i64 ! CHECK: %[[LEN:.*]] = arith.muli %{{.*}}, %[[C4]] : i64 ! CHECK: %[[ADDRI8:.*]] = fir.convert %[[A]]#0 : (!fir.ref>) -> !fir.ref ! CHECK: %[[ENTRY:.*]] = omp.affinity_entry %[[ADDRI8]], %[[LEN]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> subroutine task_affinity_slice_2d integer, parameter :: n = 5 integer, parameter :: m = 7 integer :: a(n, m) integer :: i, j !$omp parallel !$omp single !$omp task affinity(a(2:4, 3:5)) do i = 1, n do j = 1, m a(i, j) = i + j end do end do !$omp end task !$omp end single !$omp end parallel end subroutine ! CHECK-LABEL: func.func @_QPtask_affinity_slice_2d() ! CHECK: omp.parallel { ! CHECK: omp.single { ! CHECK: %[[BOX:.*]] = hlfir.designate {{.*}} : (!fir.ref>, index, index, index, index, index, index, !fir.shape<2>) -> !fir.box> ! CHECK: %[[BASE:.*]] = fir.box_addr %[[BOX]] : (!fir.box>) -> !fir.ref> ! CHECK: %[[C4:.*]] = arith.constant 4 : i64 ! CHECK: %[[SPANI64:.*]] = fir.convert {{.*}} : (index) -> i64 ! CHECK: %[[LEN:.*]] = arith.muli %[[SPANI64]], %[[C4]] : i64 ! CHECK: %[[ADDRI8:.*]] = fir.convert %[[BASE]] : (!fir.ref>) -> !fir.ref ! CHECK: %[[ENTRY:.*]] = omp.affinity_entry %[[ADDRI8]], %[[LEN]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> ! CHECK: omp.task affinity(%[[ENTRY]] : !omp.affinity_entry_ty, i64>){{.*}} { subroutine assumed_shape_affinity(a) integer, intent(inout) :: a(:) !$omp task affinity(a) a(1) = 1 !$omp end task end subroutine ! CHECK-LABEL: func.func @_QPassumed_shape_affinity( ! CHECK: %[[A:.*]]:2 = hlfir.declare %arg0 dummy_scope %{{.*}} arg 1 {fortran_attrs = #fir.var_attrs, uniq_name = "_QFassumed_shape_affinityEa"} ! CHECK: %[[ELEM:.*]] = fir.box_elesize %[[A]]#0 : (!fir.box>) -> index ! CHECK: %[[ELEM_I64:.*]] = fir.convert %[[ELEM]] : (index) -> i64 ! CHECK: %[[LEN:.*]] = arith.muli %{{.*}}, %[[ELEM_I64]] : i64 ! CHECK: %[[ENTRY:.*]] = omp.affinity_entry %{{.*}}, %[[LEN]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> subroutine allocatable_affinity(n) integer, intent(in) :: n integer, allocatable :: a(:) allocate(a(n)) !$omp task affinity(a) a(1) = 1 !$omp end task end subroutine ! CHECK-LABEL: func.func @_QPallocatable_affinity( ! CHECK: %[[A:.*]]:2 = hlfir.declare %{{.*}} {fortran_attrs = #fir.var_attrs, uniq_name = "_QFallocatable_affinityEa"} ! CHECK: %[[ABOX:.*]] = fir.load %[[A]]#0 : !fir.ref>>> ! CHECK: %[[ELEM:.*]] = fir.box_elesize %{{.*}} : (!fir.box>>) -> index ! CHECK: %[[ELEM_I64:.*]] = fir.convert %[[ELEM]] : (index) -> i64 ! CHECK: %[[LEN:.*]] = arith.muli %{{.*}}, %[[ELEM_I64]] : i64 ! CHECK: %[[ENTRY:.*]] = omp.affinity_entry %{{.*}}, %[[LEN]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> subroutine pointer_affinity(n) integer, intent(in) :: n integer, target :: tgt(n) integer, pointer :: p(:) p => tgt !$omp task affinity(p) p(1) = 1 !$omp end task end subroutine ! CHECK-LABEL: func.func @_QPpointer_affinity( ! CHECK: %[[P:.*]]:2 = hlfir.declare %{{.*}} {fortran_attrs = #fir.var_attrs, uniq_name = "_QFpointer_affinityEp"} ! CHECK: %[[PBOX:.*]] = fir.load %[[P]]#0 : !fir.ref>>> ! CHECK: %[[ELEM:.*]] = fir.box_elesize %{{.*}} : (!fir.box>>) -> index ! CHECK: %[[ELEM_I64:.*]] = fir.convert %[[ELEM]] : (index) -> i64 ! CHECK: %[[LEN:.*]] = arith.muli %{{.*}}, %[[ELEM_I64]] : i64 ! CHECK: %[[ENTRY:.*]] = omp.affinity_entry %{{.*}}, %[[LEN]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> subroutine char_const_len_affinity() character(len=7) :: a(8) !$omp task affinity(a) a(1) = "abcdefg" !$omp end task end subroutine ! CHECK-LABEL: func.func @_QPchar_const_len_affinity() ! CHECK: %[[DECLARE:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) typeparams %c7 {uniq_name = "_QFchar_const_len_affinityEa"} ! CHECK: %[[CHARLEN_I64:.*]] = fir.convert %c7 : (index) -> i64 ! CHECK: %[[ELEMSIZE:.*]] = arith.muli %[[CHARLEN_I64]], %{{.*}} : i64 ! CHECK: %[[LEN:.*]] = arith.muli %{{.*}}, %[[ELEMSIZE]] : i64 ! CHECK: %[[ENTRY:.*]] = omp.affinity_entry %{{.*}}, %[[LEN]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> subroutine char_runtime_len_affinity(n, l) integer, intent(in) :: n, l character(len=l) :: a(n) !$omp task affinity(a) a(1) = repeat("x", l) !$omp end task end subroutine ! CHECK-LABEL: func.func @_QPchar_runtime_len_affinity( ! CHECK: %[[DECLARE:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) typeparams %{{.*}} {uniq_name = "_QFchar_runtime_len_affinityEa"} ! CHECK: %[[ELEM:.*]] = fir.box_elesize %[[DECLARE]]#0 : (!fir.box>>) -> index ! CHECK: %[[ELEM_I64:.*]] = fir.convert %[[ELEM]] : (index) -> i64 ! CHECK: %[[LEN:.*]] = arith.muli %{{.*}}, %[[ELEM_I64]] : i64 ! CHECK: %[[ENTRY:.*]] = omp.affinity_entry %{{.*}}, %[[LEN]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> module task_affinity_polymorphic_mod type :: t integer :: x end type contains subroutine task_affinity_poly() class(t), allocatable :: a allocate(a) !$omp task affinity(a) shared(a) select type (a) type is (t) a%x = 1 end select !$omp end task end subroutine end module ! CHECK-LABEL: func.func @_QMtask_affinity_polymorphic_modPtask_affinity_poly() ! CHECK: %[[DECLARE:.*]]:2 = hlfir.declare %{{.*}} {fortran_attrs = #fir.var_attrs, uniq_name = "_QMtask_affinity_polymorphic_modFtask_affinity_polyEa"} ! CHECK: %[[ALOAD:.*]] = fir.load %[[DECLARE]]#0 : !fir.ref>>> ! CHECK: %[[ADDR:.*]] = fir.box_addr %[[ALOAD]] : (!fir.class>>) -> !fir.heap> ! CHECK: %[[SIZELOAD:.*]] = fir.load %[[DECLARE]]#0 : !fir.ref>>> ! CHECK: %[[SIZE:.*]] = fir.box_elesize %[[SIZELOAD]] : (!fir.class>>) -> index ! CHECK: %[[SIZE_I64:.*]] = fir.convert %[[SIZE]] : (index) -> i64 ! CHECK: %[[ADDR_I8:.*]] = fir.convert %[[ADDR]] : (!fir.heap>) -> !fir.ref ! CHECK: %[[ENTRY:.*]] = omp.affinity_entry %[[ADDR_I8]], %[[SIZE_I64]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> ! CHECK: omp.task affinity(%[[ENTRY]] : !omp.affinity_entry_ty, i64>) { ! Iterator tests subroutine task_affinity_iterator_simple() integer, parameter :: n = 16 integer :: a(n) integer :: i !$omp parallel !$omp single !$omp task affinity(iterator(i = 1:n) : a(i)) a(i) = i !$omp end task !$omp end single !$omp end parallel end subroutine ! CHECK-LABEL: func.func @_QPtask_affinity_iterator_simple() ! CHECK: %[[ITERATED:.*]] = omp.iterator(%[[IV:.*]]: index) = ({{.*}} to {{.*}} step {{.*}}) { ! CHECK: %[[IV_I32:.*]] = fir.convert %[[IV]] : (index) -> i32 ! CHECK: %[[IV_I64:.*]] = fir.convert %[[IV_I32]] : (i32) -> i64 ! CHECK: %[[SHAPE:.*]] = fir.shape %c16 : (index) -> !fir.shape<1> ! CHECK: %[[COOR:.*]] = fir.array_coor {{.*}}(%[[SHAPE]]) %[[IV_I64]] : (!fir.ref>, !fir.shape<1>, i64) -> !fir.ref ! CHECK: %[[C4:.*]] = arith.constant 4 : i64 ! CHECK: %[[ADDRI8:.*]] = fir.convert %[[COOR]] : (!fir.ref) -> !fir.ref ! CHECK: %[[ENTRY:.*]] = omp.affinity_entry %[[ADDRI8]], %[[C4]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> ! CHECK: omp.yield(%[[ENTRY]] : !omp.affinity_entry_ty, i64>) ! CHECK: } -> !omp.iterated, i64>> ! CHECK: omp.task affinity(%{{.*}} : !omp.iterated, i64>>) { subroutine task_affinity_iterator_nondefault_lb() implicit none integer, parameter :: n = 8 integer :: a(0:n) integer :: i !$omp parallel !$omp single !$omp task affinity(iterator(i = 0:n) : a(i)) a(0) = 1 !$omp end task !$omp end single !$omp end parallel end subroutine ! CHECK-LABEL: func.func @_QPtask_affinity_iterator_nondefault_lb() ! CHECK: %[[ITERATED_NDLB:.*]] = omp.iterator(%[[IV_NDLB:.*]]: index) = ({{.*}} to {{.*}} step {{.*}}) { ! CHECK: %[[IV_NDLB_I32:.*]] = fir.convert %[[IV_NDLB]] : (index) -> i32 ! CHECK: %[[IV_NDLB_I64:.*]] = fir.convert %[[IV_NDLB_I32]] : (i32) -> i64 ! CHECK: %[[SHIFT_NDLB:.*]] = fir.shape_shift %c0, %c9 : (index, index) -> !fir.shapeshift<1> ! CHECK: %[[COOR_NDLB:.*]] = fir.array_coor {{.*}}(%[[SHIFT_NDLB]]) %[[IV_NDLB_I64]] : (!fir.box>, !fir.shapeshift<1>, i64) -> !fir.ref ! CHECK: %[[ELEM_NDLB:.*]] = fir.box_elesize %{{.*}} : (!fir.box>) -> index ! CHECK: %[[ELEM_NDLB_I64:.*]] = fir.convert %[[ELEM_NDLB]] : (index) -> i64 ! CHECK: %[[ADDRI8_NDLB:.*]] = fir.convert %[[COOR_NDLB]] : (!fir.ref) -> !fir.ref ! CHECK: %[[ENTRY_NDLB:.*]] = omp.affinity_entry %[[ADDRI8_NDLB]], %[[ELEM_NDLB_I64]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> ! CHECK: omp.yield(%[[ENTRY_NDLB]] : !omp.affinity_entry_ty, i64>) ! CHECK: } -> !omp.iterated, i64>> ! CHECK: omp.task affinity(%[[ITERATED_NDLB]] : !omp.iterated, i64>>) { subroutine task_affinity_iterator_nondefault_lb_2d() implicit none integer, parameter :: n = 4, m = 6 integer :: a(0:n, -1:m) integer :: i, j !$omp parallel !$omp single !$omp task affinity(iterator(i = 0:n, j = -1:m) : a(i, j)) a(0, -1) = 1 !$omp end task !$omp end single !$omp end parallel end subroutine ! CHECK-LABEL: func.func @_QPtask_affinity_iterator_nondefault_lb_2d() ! CHECK: %[[ITERATED_NDLB2:.*]] = omp.iterator(%[[IV0_NDLB2:.*]]: index, %[[IV1_NDLB2:.*]]: index) = ({{.*}} to {{.*}} step {{.*}}, {{.*}} to {{.*}} step {{.*}}) { ! CHECK: %[[IV0_NDLB2_I32:.*]] = fir.convert %[[IV0_NDLB2]] : (index) -> i32 ! CHECK: %[[IV1_NDLB2_I32:.*]] = fir.convert %[[IV1_NDLB2]] : (index) -> i32 ! CHECK: %[[IV0_NDLB2_I64:.*]] = fir.convert %[[IV0_NDLB2_I32]] : (i32) -> i64 ! CHECK: %[[IV1_NDLB2_I64:.*]] = fir.convert %[[IV1_NDLB2_I32]] : (i32) -> i64 ! CHECK: %[[SHIFT_NDLB2:.*]] = fir.shape_shift %c0, %c5, %c-1, %c8 : (index, index, index, index) -> !fir.shapeshift<2> ! CHECK: %[[COOR_NDLB2:.*]] = fir.array_coor {{.*}}(%[[SHIFT_NDLB2]]) %[[IV0_NDLB2_I64]], %[[IV1_NDLB2_I64]] : (!fir.box>, !fir.shapeshift<2>, i64, i64) -> !fir.ref ! CHECK: %[[ELEM_NDLB2:.*]] = fir.box_elesize %{{.*}} : (!fir.box>) -> index ! CHECK: %[[ELEM_NDLB2_I64:.*]] = fir.convert %[[ELEM_NDLB2]] : (index) -> i64 ! CHECK: %[[ADDRI8_NDLB2:.*]] = fir.convert %[[COOR_NDLB2]] : (!fir.ref) -> !fir.ref ! CHECK: %[[ENTRY_NDLB2:.*]] = omp.affinity_entry %[[ADDRI8_NDLB2]], %[[ELEM_NDLB2_I64]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> ! CHECK: omp.yield(%[[ENTRY_NDLB2]] : !omp.affinity_entry_ty, i64>) ! CHECK: } -> !omp.iterated, i64>> ! CHECK: omp.task affinity(%[[ITERATED_NDLB2]] : !omp.iterated, i64>>) { subroutine task_affinity_iterator_multi_dimension() integer, parameter :: n = 4, m = 6 integer :: a(n, m) integer :: i, j !$omp parallel !$omp single !$omp task affinity(iterator(i = 3:n, j = 1:m) : a(i, j)) shared(a) do i = 1, n do j = 1, m a(i, j) = 100*i + j end do end do !$omp end task !$omp end single !$omp end parallel end subroutine ! CHECK-LABEL: func.func @_QPtask_affinity_iterator_multi_dimension() ! CHECK: %[[ITER:.*]] = omp.iterator(%[[IV0:.*]]: index, %[[IV1:.*]]: index) = ({{.*}} to {{.*}} step {{.*}}, {{.*}} to {{.*}} step {{.*}}) { ! CHECK: %[[IV0_I32:.*]] = fir.convert %[[IV0]] : (index) -> i32 ! CHECK: %[[IV1_I32:.*]] = fir.convert %[[IV1]] : (index) -> i32 ! CHECK: %[[IV0_I64:.*]] = fir.convert %[[IV0_I32]] : (i32) -> i64 ! CHECK: %[[IV1_I64:.*]] = fir.convert %[[IV1_I32]] : (i32) -> i64 ! CHECK: %[[SHAPE:.*]] = fir.shape %c4, %c6 : (index, index) -> !fir.shape<2> ! CHECK: %[[COOR:.*]] = fir.array_coor {{.*}}(%[[SHAPE]]) %[[IV0_I64]], %[[IV1_I64]] : (!fir.ref>, !fir.shape<2>, i64, i64) -> !fir.ref ! CHECK: %[[C4:.*]] = arith.constant 4 : i64 ! CHECK: %[[ADDRI8:.*]] = fir.convert %[[COOR]] : (!fir.ref) -> !fir.ref ! CHECK: %[[ENTRY:.*]] = omp.affinity_entry %[[ADDRI8]], %[[C4]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> ! CHECK: omp.yield(%[[ENTRY]] : !omp.affinity_entry_ty, i64>) ! CHECK: } -> !omp.iterated, i64>> ! CHECK: omp.task affinity(%[[ITER]] : !omp.iterated, i64>>) subroutine task_affinity_iterator_reordered() integer, parameter :: n = 4, m = 6 integer :: a(n, m) integer :: i, j !$omp parallel !$omp single !$omp task affinity(iterator(i = 1:n, j = 1:m) : a(j, i)) shared(a) a(1, 1) = 1 !$omp end task !$omp end single !$omp end parallel end subroutine ! CHECK-LABEL: func.func @_QPtask_affinity_iterator_reordered() ! CHECK: %[[ITER:.*]] = omp.iterator(%[[IV0:.*]]: index, %[[IV1:.*]]: index) = ({{.*}} to {{.*}} step {{.*}}, {{.*}} to {{.*}} step {{.*}}) { ! CHECK: %[[RO_IV0_I32:.*]] = fir.convert %[[IV0]] : (index) -> i32 ! CHECK: %[[RO_IV1_I32:.*]] = fir.convert %[[IV1]] : (index) -> i32 ! CHECK: %[[RO_IV1_I64:.*]] = fir.convert %[[RO_IV1_I32]] : (i32) -> i64 ! CHECK: %[[RO_IV0_I64:.*]] = fir.convert %[[RO_IV0_I32]] : (i32) -> i64 ! CHECK: %[[SHAPE:.*]] = fir.shape %c4, %c6 : (index, index) -> !fir.shape<2> ! CHECK: %[[COOR:.*]] = fir.array_coor {{.*}}(%[[SHAPE]]) %[[RO_IV1_I64]], %[[RO_IV0_I64]] : (!fir.ref>, !fir.shape<2>, i64, i64) -> !fir.ref subroutine task_affinity_iterator_expr_subscript() integer, parameter :: n = 5, m = 6 integer :: a(n, m) integer :: i, j !$omp parallel !$omp single !$omp task affinity(iterator(i = 1:n-1, j = 1:m) : a(i+1, j)) shared(a) a(1, 1) = 1 !$omp end task !$omp end single !$omp end parallel end subroutine ! CHECK-LABEL: func.func @_QPtask_affinity_iterator_expr_subscript() ! CHECK: %[[ITER2:.*]] = omp.iterator(%[[IVA:.*]]: index, %[[IVB:.*]]: index) = ({{.*}} to {{.*}} step {{.*}}, {{.*}} to {{.*}} step {{.*}}) { ! CHECK: %[[IVA_I32:.*]] = fir.convert %[[IVA]] : (index) -> i32 ! CHECK: %[[IVB_I32:.*]] = fir.convert %[[IVB]] : (index) -> i32 ! CHECK: %[[C1_I32:.*]] = arith.constant 1 : i32 ! CHECK: %[[IP1_I32:.*]] = arith.addi %[[IVA_I32]], %[[C1_I32]] : i32 ! CHECK: %[[IP1_I64:.*]] = fir.convert %[[IP1_I32]] : (i32) -> i64 ! CHECK: %[[IVB_I64:.*]] = fir.convert %[[IVB_I32]] : (i32) -> i64 ! CHECK: %[[SHAPE2:.*]] = fir.shape %c5, %c6 : (index, index) -> !fir.shape<2> ! CHECK: %[[COOR2:.*]] = fir.array_coor {{.*}}(%[[SHAPE2]]) %[[IP1_I64]], %[[IVB_I64]] : (!fir.ref>, !fir.shape<2>, i64, i64) -> !fir.ref subroutine task_affinity_iterator_section_subscript() integer, parameter :: n = 5, m = 6 integer :: a(n, m) integer :: i, j !$omp parallel !$omp single !$omp task affinity(iterator(i = 1:n, j = 1:m) : a(i:i+1, j+2)) shared(a) a(1, 1) = 1 !$omp end task !$omp end single !$omp end parallel end subroutine ! CHECK-LABEL: func.func @_QPtask_affinity_iterator_section_subscript() ! CHECK: %[[ITER3:.*]] = omp.iterator(%[[IVS0:.*]]: index, %[[IVS1:.*]]: index) = ({{.*}} to {{.*}} step {{.*}}, {{.*}} to {{.*}} step {{.*}}) { ! CHECK: %[[IVS0_I32:.*]] = fir.convert %[[IVS0]] : (index) -> i32 ! CHECK: %[[IVS1_I32:.*]] = fir.convert %[[IVS1]] : (index) -> i32 ! CHECK: %[[IVS0_I64:.*]] = fir.convert %[[IVS0_I32]] : (i32) -> i64 ! CHECK: %[[C2_I32:.*]] = arith.constant 2 : i32 ! CHECK: %[[JP2_I32:.*]] = arith.addi %[[IVS1_I32]], %[[C2_I32]] : i32 ! CHECK: %[[JP2_I64:.*]] = fir.convert %[[JP2_I32]] : (i32) -> i64 ! CHECK: %[[SHAPE3:.*]] = fir.shape %c5, %c6 : (index, index) -> !fir.shape<2> ! CHECK: %[[COOR3:.*]] = fir.array_coor {{.*}}(%[[SHAPE3]]) %[[IVS0_I64]], %[[JP2_I64]] : (!fir.ref>, !fir.shape<2>, i64, i64) -> !fir.ref subroutine task_affinity_iterator_section_implicit_lower() integer, parameter :: n = 5, m = 6 integer :: a(n, m) integer :: i, j !$omp parallel !$omp single !$omp task affinity(iterator(i = 1:n, j = 1:m) : a(:i+1, j+2)) shared(a) a(1, 1) = 1 !$omp end task !$omp end single !$omp end parallel end subroutine ! CHECK-LABEL: func.func @_QPtask_affinity_iterator_section_implicit_lower() ! CHECK: %[[ITER4:.*]] = omp.iterator(%[[IVT0:.*]]: index, %[[IVT1:.*]]: index) = ({{.*}} to {{.*}} step {{.*}}, {{.*}} to {{.*}} step {{.*}}) { ! CHECK: %[[IVT1_I32:.*]] = fir.convert %[[IVT1]] : (index) -> i32 ! CHECK: %[[C1_IDX:.*]] = arith.constant 1 : index ! CHECK: %[[C2_I32_2:.*]] = arith.constant 2 : i32 ! CHECK: %[[JP2_I32_2:.*]] = arith.addi %[[IVT1_I32]], %[[C2_I32_2]] : i32 ! CHECK: %[[JP2_I64_2:.*]] = fir.convert %[[JP2_I32_2]] : (i32) -> i64 ! CHECK: %[[SHAPE4:.*]] = fir.shape %c5, %c6 : (index, index) -> !fir.shape<2> ! CHECK: %[[COOR4:.*]] = fir.array_coor {{.*}}(%[[SHAPE4]]) %[[C1_IDX]], %[[JP2_I64_2]] : (!fir.ref>, !fir.shape<2>, index, i64) -> !fir.ref subroutine task_affinity_iterator_char_simple() integer, parameter :: n = 8 character(len=7) :: a(n) integer :: i !$omp parallel !$omp single !$omp task affinity(iterator(i = 1:n) : a(i)) a(1) = "abcdefg" !$omp end task !$omp end single !$omp end parallel end subroutine ! CHECK-LABEL: func.func @_QPtask_affinity_iterator_char_simple() ! CHECK: %[[ITER5:.*]] = omp.iterator(%[[IVC:.*]]: index) = ({{.*}} to {{.*}} step {{.*}}) { ! CHECK: %[[IVC_I32:.*]] = fir.convert %[[IVC]] : (index) -> i32 ! CHECK: %[[IVC_I64:.*]] = fir.convert %[[IVC_I32]] : (i32) -> i64 ! CHECK: %[[SHAPE5:.*]] = fir.shape {{.*}} : (index) -> !fir.shape<1> ! CHECK: %[[COOR5:.*]] = fir.array_coor {{.*}}(%[[SHAPE5]]) %[[IVC_I64]] : ({{.*}}, !fir.shape<1>, i64) -> !fir.ref> ! CHECK: %[[C1_I64:.*]] = arith.constant 1 : i64 ! CHECK: %[[C7_I64:.*]] = fir.convert %c7 : (index) -> i64 ! CHECK: %[[ELEM5:.*]] = arith.muli %[[C7_I64]], %[[C1_I64]] : i64 ! CHECK: %[[ADDR5:.*]] = fir.convert %[[COOR5]] : (!fir.ref>) -> !fir.ref ! CHECK: %[[ENTRY5:.*]] = omp.affinity_entry %[[ADDR5]], %[[ELEM5]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> subroutine task_affinity_iterator_char_expr_subscript() integer, parameter :: n = 8 character(len=7) :: a(n) integer :: i !$omp parallel !$omp single !$omp task affinity(iterator(i = 1:n-1) : a(i+1)) a(1) = "abcdefg" !$omp end task !$omp end single !$omp end parallel end subroutine ! CHECK-LABEL: func.func @_QPtask_affinity_iterator_char_expr_subscript() ! CHECK: %[[ITER6:.*]] = omp.iterator(%[[IVC2:.*]]: index) = ({{.*}} to {{.*}} step {{.*}}) { ! CHECK: %[[IVC2_I32:.*]] = fir.convert %[[IVC2]] : (index) -> i32 ! CHECK: %[[C1_I32_6:.*]] = arith.constant 1 : i32 ! CHECK: %[[IP1C_I32:.*]] = arith.addi %[[IVC2_I32]], %[[C1_I32_6]] : i32 ! CHECK: %[[IP1C_I64:.*]] = fir.convert %[[IP1C_I32]] : (i32) -> i64 ! CHECK: %[[SHAPE6:.*]] = fir.shape {{.*}} : (index) -> !fir.shape<1> ! CHECK: %[[COOR6:.*]] = fir.array_coor {{.*}}(%[[SHAPE6]]) %[[IP1C_I64]] : ({{.*}}, !fir.shape<1>, i64) -> !fir.ref> ! CHECK: %[[C1_I64_2:.*]] = arith.constant 1 : i64 ! CHECK: %[[C7_I64_2:.*]] = fir.convert %c7 : (index) -> i64 ! CHECK: %[[ELEM6:.*]] = arith.muli %[[C7_I64_2]], %[[C1_I64_2]] : i64 ! CHECK: %[[ADDR6:.*]] = fir.convert %[[COOR6]] : (!fir.ref>) -> !fir.ref ! CHECK: %[[ENTRY6:.*]] = omp.affinity_entry %[[ADDR6]], %[[ELEM6]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64> subroutine task_affinity_iterator_char_runtime(n, l) integer, intent(in) :: n, l character(len=l) :: a(n) integer :: i !$omp parallel !$omp single !$omp task affinity(iterator(i = 1:n) : a(i)) a(1) = repeat("x", l) !$omp end task !$omp end single !$omp end parallel end subroutine ! CHECK-LABEL: func.func @_QPtask_affinity_iterator_char_runtime( ! CHECK: %[[A:.*]]:2 = hlfir.declare %{{.*}}(%{{.*}}) typeparams %{{.*}} {uniq_name = "_QFtask_affinity_iterator_char_runtimeEa"} ! CHECK: %[[ITER:.*]] = omp.iterator(%[[IV:.*]]: index) = ({{.*}} to {{.*}} step {{.*}}) { ! CHECK: %[[COOR:.*]] = fir.array_coor %[[A]]#0({{.*}}) {{.*}} : (!fir.box>>, !fir.shape<1>, i64) -> !fir.ref> ! CHECK: %[[ELEM:.*]] = fir.box_elesize %[[A]]#0 : (!fir.box>>) -> index ! CHECK: %[[ELEM_I64:.*]] = fir.convert %[[ELEM]] : (index) -> i64 ! CHECK: %[[ADDR:.*]] = fir.convert %[[COOR]] : (!fir.ref>) -> !fir.ref ! CHECK: %[[ENTRY:.*]] = omp.affinity_entry %[[ADDR]], %[[ELEM_I64]] : (!fir.ref, i64) -> !omp.affinity_entry_ty, i64>