llvm-project/flang/test/Lower/OpenMP/task-affinity.f90
Chi-Chun, Chen 36dadddd74
[Flang][mlir][OpenMP] Add affinity clause to omp.task and Flang lowering (#179003)
- Add MLIR OpenMP affinity clause
- Lower flang task affinity to mlir
- Emit TODO for iterator modifier and update negative test
2026-02-04 10:30:35 -06:00

112 lines
3.0 KiB
Fortran

! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=52 -o - %s | FileCheck %s
! scalar element locator
subroutine omp_task_affinity_elem()
implicit none
integer, parameter :: n = 100
integer :: a(n)
!$omp parallel
!$omp single
!$omp task affinity(a(1))
a(1) = 1
!$omp end task
!$omp end single
!$omp end parallel
end subroutine omp_task_affinity_elem
! CHECK-LABEL: func.func @_QPomp_task_affinity_elem()
! CHECK: %[[A1:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFomp_task_affinity_elemEa"}
! CHECK: omp.parallel {
! CHECK: omp.single {
! CHECK: omp.task affinity(%[[A1]]#0 : !fir.ref<!fir.array<100xi32>>) {
! CHECK: omp.terminator
! CHECK: }
! CHECK: omp.terminator
! CHECK: }
! CHECK: return
! array section locator
subroutine omp_task_affinity_array_section()
implicit none
integer, parameter :: n = 100
integer :: a(n)
integer :: i
!$omp parallel
!$omp single
!$omp task affinity(a(2:50)) private(i)
do i = 2, 50
a(i) = i
end do
!$omp end task
!$omp end single
!$omp end parallel
end subroutine omp_task_affinity_array_section
! CHECK-LABEL: func.func @_QPomp_task_affinity_array_section()
! CHECK: %[[A2:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFomp_task_affinity_array_sectionEa"}
! CHECK: %[[I2:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFomp_task_affinity_array_sectionEi"}
! CHECK: omp.parallel {
! CHECK: omp.single {
! CHECK: omp.task affinity(%[[A2]]#0 : !fir.ref<!fir.array<100xi32>>) private({{.*}} %[[I2]]#0 -> %{{.*}} : !fir.ref<i32>) {
! CHECK: omp.terminator
! CHECK: }
! CHECK: omp.terminator
! CHECK: }
! CHECK: return
! scalar variable locator
subroutine omp_task_affinity_scalar()
implicit none
integer :: s
s = 7
!$omp parallel
!$omp single
!$omp task affinity(s)
s = s + 1
!$omp end task
!$omp end single
!$omp end parallel
end subroutine omp_task_affinity_scalar
! CHECK-LABEL: func.func @_QPomp_task_affinity_scalar()
! CHECK: %[[S3:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFomp_task_affinity_scalarEs"}
! CHECK: omp.parallel {
! CHECK: omp.single {
! CHECK: omp.task affinity(%[[S3]]#0 : !fir.ref<i32>) {
! CHECK: omp.terminator
! CHECK: }
! CHECK: omp.terminator
! CHECK: }
! CHECK: return
! multiple locators
subroutine omp_task_affinity_multi()
implicit none
integer, parameter :: n = 100
integer :: a(n), b(n)
!$omp parallel
!$omp single
!$omp task affinity(a(1), b(1))
a(2) = 2
b(2) = 2
!$omp end task
!$omp end single
!$omp end parallel
end subroutine omp_task_affinity_multi
! CHECK-LABEL: func.func @_QPomp_task_affinity_multi()
! CHECK: %[[A4:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFomp_task_affinity_multiEa"}
! CHECK: %[[B4:.*]]:2 = hlfir.declare {{.*}} {uniq_name = "_QFomp_task_affinity_multiEb"}
! CHECK: omp.parallel {
! CHECK: omp.single {
! CHECK: omp.task affinity(%[[A4]]#0 : !fir.ref<!fir.array<100xi32>>, %[[B4]]#0 : !fir.ref<!fir.array<100xi32>>) {
! CHECK: omp.terminator
! CHECK: }
! CHECK: omp.terminator
! CHECK: }
! CHECK: return