[flang-commits] [flang] c03fd37 - [flang] Changes to map variables in link clause of declare target (#83643)
via flang-commits
flang-commits at lists.llvm.org
Thu Mar 7 08:24:02 PST 2024
Author: Anchu Rajendran S
Date: 2024-03-07T08:23:58-08:00
New Revision: c03fd37d9b61bc6063e4d6e983846f877e83ac67
URL: https://github.com/llvm/llvm-project/commit/c03fd37d9b61bc6063e4d6e983846f877e83ac67
DIFF: https://github.com/llvm/llvm-project/commit/c03fd37d9b61bc6063e4d6e983846f877e83ac67.diff
LOG: [flang] Changes to map variables in link clause of declare target (#83643)
As per the OpenMP standard, "If a variable appears in a link clause on a
declare target directive that does not have a device_type clause with
the nohost device-type-description then it is treated as if it had
appeared in a map clause with a map-type of tofrom" is an implicit
mapping rule. Before this change, such variables were mapped as to by
default.
Added:
flang/test/Lower/OpenMP/declare-target-link-tarop-cap.f90
openmp/libomptarget/test/offloading/fortran/declare-target-vars-in-target-region.f90
Modified:
flang/lib/Lower/OpenMP/OpenMP.cpp
Removed:
openmp/libomptarget/test/offloading/fortran/declare-target-array-in-target-region.f90
################################################################################
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index 185e0316870e94..5cff95c7d125b0 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -1120,7 +1120,21 @@ genTargetOp(Fortran::lower::AbstractConverter &converter,
if (auto refType = baseOp.getType().dyn_cast<fir::ReferenceType>())
eleType = refType.getElementType();
- if (fir::isa_trivial(eleType) || fir::isa_char(eleType)) {
+ // If a variable is specified in declare target link and if device
+ // type is not specified as `nohost`, it needs to be mapped tofrom
+ mlir::ModuleOp mod = converter.getFirOpBuilder().getModule();
+ mlir::Operation *op = mod.lookupSymbol(converter.mangleName(sym));
+ auto declareTargetOp =
+ llvm::dyn_cast_if_present<mlir::omp::DeclareTargetInterface>(op);
+ if (declareTargetOp && declareTargetOp.isDeclareTarget()) {
+ if (declareTargetOp.getDeclareTargetCaptureClause() ==
+ mlir::omp::DeclareTargetCaptureClause::link &&
+ declareTargetOp.getDeclareTargetDeviceType() !=
+ mlir::omp::DeclareTargetDeviceType::nohost) {
+ mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO;
+ mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_FROM;
+ }
+ } else if (fir::isa_trivial(eleType) || fir::isa_char(eleType)) {
captureKind = mlir::omp::VariableCaptureKind::ByCopy;
} else if (!fir::isa_builtin_cptr_type(eleType)) {
mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO;
diff --git a/flang/test/Lower/OpenMP/declare-target-link-tarop-cap.f90 b/flang/test/Lower/OpenMP/declare-target-link-tarop-cap.f90
new file mode 100644
index 00000000000000..7cd0597161578d
--- /dev/null
+++ b/flang/test/Lower/OpenMP/declare-target-link-tarop-cap.f90
@@ -0,0 +1,55 @@
+!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
+!RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-is-device %s -o - | FileCheck %s
+!RUN: bbc -emit-hlfir -fopenmp %s -o - | FileCheck %s
+!RUN: bbc -emit-hlfir -fopenmp -fopenmp-is-target-device %s -o - | FileCheck %s
+
+program test_link
+
+ integer :: test_int = 1
+ !$omp declare target link(test_int)
+
+ integer :: test_array_1d(3) = (/1,2,3/)
+ !$omp declare target link(test_array_1d)
+
+ integer, pointer :: test_ptr1
+ !$omp declare target link(test_ptr1)
+
+ integer, target :: test_target = 1
+ !$omp declare target link(test_target)
+
+ integer, pointer :: test_ptr2
+ !$omp declare target link(test_ptr2)
+
+ !CHECK-DAG: {{%.*}} = omp.map_info var_ptr({{%.*}} : !fir.ref<i32>, i32) map_clauses(implicit, tofrom) capture(ByRef) -> !fir.ref<i32> {name = "test_int"}
+ !$omp target
+ test_int = test_int + 1
+ !$omp end target
+
+
+ !CHECK-DAG: {{%.*}} = omp.map_info var_ptr({{%.*}} : !fir.ref<!fir.array<3xi32>>, !fir.array<3xi32>) map_clauses(implicit, tofrom) capture(ByRef) bounds({{%.*}}) -> !fir.ref<!fir.array<3xi32>> {name = "test_array_1d"}
+ !$omp target
+ do i = 1,3
+ test_array_1d(i) = i * 2
+ end do
+ !$omp end target
+
+ allocate(test_ptr1)
+ test_ptr1 = 1
+ !CHECK-DAG: {{%.*}} = omp.map_info var_ptr({{%.*}} : !fir.ref<!fir.box<!fir.ptr<i32>>>, !fir.box<!fir.ptr<i32>>) map_clauses(implicit, tofrom) capture(ByRef) members({{%.*}} : !fir.llvm_ptr<!fir.ref<i32>>) -> !fir.ref<!fir.box<!fir.ptr<i32>>> {name = "test_ptr1"}
+ !$omp target
+ test_ptr1 = test_ptr1 + 1
+ !$omp end target
+
+ !CHECK-DAG: {{%.*}} = omp.map_info var_ptr({{%.*}} : !fir.ref<i32>, i32) map_clauses(implicit, tofrom) capture(ByRef) -> !fir.ref<i32> {name = "test_target"}
+ !$omp target
+ test_target = test_target + 1
+ !$omp end target
+
+
+ !CHECK-DAG: {{%.*}} = omp.map_info var_ptr({{%.*}} : !fir.ref<!fir.box<!fir.ptr<i32>>>, !fir.box<!fir.ptr<i32>>) map_clauses(implicit, tofrom) capture(ByRef) members({{%.*}} : !fir.llvm_ptr<!fir.ref<i32>>) -> !fir.ref<!fir.box<!fir.ptr<i32>>> {name = "test_ptr2"}
+ test_ptr2 => test_target
+ !$omp target
+ test_ptr2 = test_ptr2 + 1
+ !$omp end target
+
+end
diff --git a/openmp/libomptarget/test/offloading/fortran/declare-target-array-in-target-region.f90 b/openmp/libomptarget/test/offloading/fortran/declare-target-array-in-target-region.f90
deleted file mode 100644
index c09146198768b0..00000000000000
--- a/openmp/libomptarget/test/offloading/fortran/declare-target-array-in-target-region.f90
+++ /dev/null
@@ -1,33 +0,0 @@
-! Offloading test with a target region mapping a declare target
-! Fortran array writing some values to it and checking the host
-! correctly receives the updates made on the device.
-! REQUIRES: flang
-! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
-! UNSUPPORTED: aarch64-unknown-linux-gnu
-! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
-! UNSUPPORTED: x86_64-pc-linux-gnu
-! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
-
-! RUN: %libomptarget-compile-fortran-run-and-check-generic
-module test_0
- implicit none
- INTEGER :: sp(10) = (/0,0,0,0,0,0,0,0,0,0/)
- !$omp declare target link(sp)
-end module test_0
-
-program main
- use test_0
- integer :: i = 1
- integer :: j = 11
-!$omp target map(tofrom:sp, i, j)
- do while (i <= j)
- sp(i) = i;
- i = i + 1
- end do
-!$omp end target
-
-PRINT *, sp(:)
-
-end program
-
-! CHECK: 1 2 3 4 5 6 7 8 9 10
diff --git a/openmp/libomptarget/test/offloading/fortran/declare-target-vars-in-target-region.f90 b/openmp/libomptarget/test/offloading/fortran/declare-target-vars-in-target-region.f90
new file mode 100644
index 00000000000000..f524deac3bcce9
--- /dev/null
+++ b/openmp/libomptarget/test/offloading/fortran/declare-target-vars-in-target-region.f90
@@ -0,0 +1,81 @@
+! Offloading test with a target region mapping a declare target
+! Fortran array writing some values to it and checking the host
+! correctly receives the updates made on the device.
+! REQUIRES: flang
+! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
+! UNSUPPORTED: aarch64-unknown-linux-gnu
+! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
+! UNSUPPORTED: x86_64-pc-linux-gnu
+! UNSUPPORTED: x86_64-pc-linux-gnu-LTO
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+module test_0
+ implicit none
+ INTEGER :: arr1(10) = (/0,0,0,0,0,0,0,0,0,0/)
+ INTEGER :: arr2(10) = (/0,0,0,0,0,0,0,0,0,0/)
+ !$omp declare target link(arr1) enter(arr2)
+ INTEGER :: scalar = 1
+ !$omp declare target link(scalar)
+end module test_0
+
+subroutine test_with_array_link_and_tofrom()
+ use test_0
+ integer :: i = 1
+ integer :: j = 11
+ !$omp target map(tofrom:arr1, i, j)
+ do while (i <= j)
+ arr1(i) = i;
+ i = i + 1
+ end do
+ !$omp end target
+
+ ! CHECK: 1 2 3 4 5 6 7 8 9 10
+ PRINT *, arr1(:)
+end subroutine test_with_array_link_and_tofrom
+
+subroutine test_with_array_link_only()
+ use test_0
+ integer :: i = 1
+ integer :: j = 11
+ !$omp target map(i, j)
+ do while (i <= j)
+ arr1(i) = i + 1;
+ i = i + 1
+ end do
+ !$omp end target
+
+ ! CHECK: 2 3 4 5 6 7 8 9 10 11
+ PRINT *, arr1(:)
+end subroutine test_with_array_link_only
+
+subroutine test_with_array_enter_only()
+ use test_0
+ integer :: i = 1
+ integer :: j = 11
+ !$omp target map(i, j)
+ do while (i <= j)
+ arr2(i) = i + 1;
+ i = i + 1
+ end do
+ !$omp end target
+
+ ! CHECK: 0 0 0 0 0 0 0 0 0 0
+ PRINT *, arr2(:)
+end subroutine test_with_array_enter_only
+
+subroutine test_with_scalar_link_only()
+ use test_0
+ !$omp target
+ scalar = 10
+ !$omp end target
+
+ ! CHECK: 10
+ PRINT *, scalar
+end subroutine test_with_scalar_link_only
+
+program main
+ call test_with_array_link_and_tofrom()
+ call test_with_array_link_only()
+ call test_with_array_enter_only()
+ call test_with_scalar_link_only()
+end program
More information about the flang-commits
mailing list