! This test checks correct propagation of location information in OpenACC
! operations.
! RUN: bbc -fopenacc -emit-hlfir --mlir-print-debuginfo --mlir-print-local-scope %s -o - | FileCheck %s
module acc_locations
implicit none
contains
subroutine standalone_data_directive_locations(arr)
real, dimension(10) :: arr
!$acc enter data create(arr)
!CHECK-LABEL: acc.enter_data
!CHECK-SAME: loc("{{.*}}locations.f90":14:11)
!$acc update device(arr)
!CHECK-LABEL: acc.update_device varPtr
!CHECK-SAME: loc("{{.*}}locations.f90":18:25)
!CHECK-LABEL: acc.update dataOperands
!CHECK-SAME: loc("{{.*}}locations.f90":18:11)
!$acc update host(arr)
!CHECK-LABEL: acc.getdeviceptr varPtr
!CHECK-SAME: loc("{{.*}}locations.f90":24:23)
!CHECK-LABEL: acc.update dataOperands
!CHECK-SAME: loc("{{.*}}locations.f90":24:11)
!CHECK-LABEL: acc.update_host
!CHECK-SAME: loc("{{.*}}locations.f90":24:23)
!$acc exit data delete(arr)
!CHECK-LABEL: acc.exit_data
!CHECK-SAME: loc("{{.*}}locations.f90":32:11)
end subroutine
subroutine nested_acc_locations(arr1d)
real, dimension(10) :: arr1d
integer :: i
!$acc data copy(arr1d)
!$acc parallel
!$acc loop
do i = 1, 10
arr1d(i) = arr1d(i) * 2
end do
!$acc end parallel
!$acc end data
!CHECK: acc.data
!CHECK: acc.parallel
!CHECK: acc.loop
!CHECK: acc.yield loc("{{.*}}locations.f90":44:11)
!CHECK-NEXT: } attributes {{.*}} loc(fused["{{.*}}locations.f90":44:11, "{{.*}}locations.f90":45:5])
!CHECK: acc.yield loc("{{.*}}locations.f90":43:11)
!CHECK-NEXT: } loc("{{.*}}locations.f90":43:11)
!CHECK-NEXT: acc.terminator loc("{{.*}}locations.f90":42:11)
!CHECK-NEXT: } loc("{{.*}}locations.f90":42:11)
end subroutine
subroutine runtime_directive()
!$acc init
!CHECK-LABEL: acc.init
!CHECK-SAME: loc("{{.*}}locations.f90":68:11)
!$acc shutdown
!CHECK-LABEL: acc.shutdown
!CHECK-SAME: loc("{{.*}}locations.f90":72:11)
end subroutine
subroutine combined_directive_locations(arr)
real :: arr(:)
integer :: i
!$acc parallel loop
do i = 1, size(arr)
arr(i) = arr(i) * arr(i)
end do
!CHECK: acc.parallel
!CHECK: acc.loop
!CHECK: acc.yield loc("{{.*}}locations.f90":82:11)
!CHECK-NEXT: } {{.*}} loc(fused["{{.*}}locations.f90":82:11, "{{.*}}locations.f90":83:5])
!CHECK: acc.yield loc("{{.*}}locations.f90":82:11)
!CHECK-NEXT: } loc("{{.*}}locations.f90":82:11)
end subroutine
subroutine if_clause_expr_location(arr)
real :: arr(:)
integer :: i
!$acc parallel loop if(.true.)
do i = 1, size(arr)
arr(i) = arr(i) * arr(i)
end do
!CHECK: %{{.*}} = arith.constant true loc("{{.*}}locations.f90":99:25)
!CHECK: acc.parallel
!CHECK: acc.loop
!CHECK: acc.yield loc("{{.*}}locations.f90":99:11)
!CHECK-NEXT: } {{.*}} loc(fused["{{.*}}locations.f90":99:11, "{{.*}}locations.f90":100:5])
!CHECK: acc.yield loc("{{.*}}locations.f90":99:11)
!CHECK-NEXT: } loc("{{.*}}locations.f90":99:11)
end subroutine
subroutine atomic_read_loc()
integer(4) :: x
integer(8) :: y
!$acc atomic read
y = x
end
!CHECK: acc.atomic.read {{.*}} loc("{{.*}}locations.f90":118:11)
subroutine atomic_capture_loc()
implicit none
integer :: k, v, i
k = 1
v = 0
!$acc atomic capture
v = k
k = (i + 1) * 3.14
!$acc end atomic
! CHECK: acc.atomic.capture {
! CHECK: acc.atomic.read {{.*}} loc("{{.*}}locations.f90":130:11)
! CHECK: acc.atomic.write {{.*}} loc("{{.*}}locations.f90":130:11)
! CHECK: } loc("{{.*}}locations.f90":130:11)
end subroutine
subroutine atomic_update_loc()
implicit none
integer :: x, y, z
!$acc atomic
y = y + 1
! CHECK: acc.atomic.update %{{.*}} : !fir.ref<i32> {
! CHECK: ^bb0(%{{.*}}: i32 loc("{{.*}}locations.f90":142:3)):
! CHECK: } loc("{{.*}}locations.f90":142:3)
!$acc atomic update
z = x * z
end subroutine
subroutine acc_loop_fused_locations(arr)
real, dimension(10,10,10) :: arr
integer :: i, j, k
!$acc loop collapse(3)
do i = 1, 10
do j = 1, 10
do k = 1, 10
arr(i,j,k) = arr(i,j,k) * 2
end do
end do
end do
end subroutine
! CHECK-LABEL: func.func @_QMacc_locationsPacc_loop_fused_locations
! CHECK: acc.loop
! CHECK: } attributes {collapse = [3]{{.*}}} loc(fused["{{.*}}locations.f90":160:11, "{{.*}}locations.f90":161:5, "{{.*}}locations.f90":162:7, "{{.*}}locations.f90":163:9])
end module