[flang-commits] [flang] [llvm] [Flan][OpenMP] Implement TODO support for compatible defaultmap types for implicit mappers (PR #177389)
Akash Banerjee via flang-commits
flang-commits at lists.llvm.org
Thu Jan 22 08:10:30 PST 2026
https://github.com/TIFitis created https://github.com/llvm/llvm-project/pull/177389
Make implicit default mapper generation respect defaultmap categories so unrelated defaultmap clauses no longer suppress mappers for derived types.
Added related tests.
>From 19f42fc0e8f26deb0426fbd226516e7cf06372d8 Mon Sep 17 00:00:00 2001
From: Akash Banerjee <Akash.Banerjee at amd.com>
Date: Thu, 22 Jan 2026 16:07:46 +0000
Subject: [PATCH] [Flan][OpenMP] Implement TODO support for compatible
defaultmap types for implicit mappers
Make implicit default mapper generation respect defaultmap categories so unrelated defaultmap clauses no longer suppress mappers for derived types.
Added related tests.
---
flang/lib/Lower/OpenMP/OpenMP.cpp | 7 ++-
flang/test/Lower/OpenMP/defaultmap.f90 | 22 +++++++++
.../target-defaultmap-implicit-mapper.f90 | 49 +++++++++++++++++++
3 files changed, 74 insertions(+), 4 deletions(-)
create mode 100644 offload/test/offloading/fortran/target-defaultmap-implicit-mapper.f90
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index f40279b505893..316a031fc0e82 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -2766,10 +2766,9 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
firOpBuilder, converter, defaultMaps, eleType, loc, sym);
mlir::FlatSymbolRefAttr mapperId;
- if (defaultMaps.empty()) {
- // TODO: Honor user-provided defaultmap clauses (aggregates/pointers)
- // instead of blanket-disabling implicit mapper generation whenever any
- // explicit default map is present.
+ auto defaultmapBehaviour = getDefaultmapIfPresent(defaultMaps, eleType);
+ if (defaultmapBehaviour ==
+ clause::Defaultmap::ImplicitBehavior::Default) {
const semantics::DerivedTypeSpec *typeSpec =
sym.GetType() ? sym.GetType()->AsDerived() : nullptr;
if (typeSpec) {
diff --git a/flang/test/Lower/OpenMP/defaultmap.f90 b/flang/test/Lower/OpenMP/defaultmap.f90
index 30351f5a8b415..2d464bc660d25 100644
--- a/flang/test/Lower/OpenMP/defaultmap.f90
+++ b/flang/test/Lower/OpenMP/defaultmap.f90
@@ -106,3 +106,25 @@ subroutine defaultmap_dtype_aggregate_to()
return
end subroutine
+
+subroutine defaultmap_scalar_implicit_mapper()
+ implicit none
+ type :: dtype
+ integer(4) :: array_i(10)
+ integer(4) :: k
+ end type dtype
+
+ type(dtype), allocatable :: obj
+
+! CHECK-LABEL: func.func @_QPdefaultmap_scalar_implicit_mapper
+! CHECK: %[[BASE_MAP:.*]] = omp.map.info {{.*}} map_clauses(implicit, tofrom) capture(ByRef) {{.*}} mapper(@{{.*}}) -> {{.*}} {name = ""}
+! CHECK: %[[DESC_MAP:.*]] = omp.map.info {{.*}} map_clauses(always, implicit, to) capture(ByRef) members(%[[BASE_MAP]] : [0] : {{.*}}) -> {{.*}} {name = "obj"}
+! CHECK: omp.target map_entries(%[[DESC_MAP]] -> {{.*}}, %[[BASE_MAP]] -> {{.*}})
+ allocate(obj)
+ !$omp target defaultmap(tofrom: scalar)
+ obj%k = 40
+ obj%array_i(1) = 50
+ !$omp end target
+
+ return
+end subroutine
diff --git a/offload/test/offloading/fortran/target-defaultmap-implicit-mapper.f90 b/offload/test/offloading/fortran/target-defaultmap-implicit-mapper.f90
new file mode 100644
index 0000000000000..9a5a453b53863
--- /dev/null
+++ b/offload/test/offloading/fortran/target-defaultmap-implicit-mapper.f90
@@ -0,0 +1,49 @@
+! Offload test that ensures defaultmap(scalar: tofrom) does not suppress
+! implicit default mapper generation for allocatable derived types.
+! REQUIRES: flang, amdgpu
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program defaultmap_implicit_mapper
+ implicit none
+
+ type :: payload_t
+ integer, allocatable :: arr(:)
+ end type payload_t
+
+ type(payload_t), allocatable :: obj
+ integer, parameter :: n = 8
+ integer :: i
+ integer :: scalar
+ logical :: ok
+
+ allocate(obj)
+ allocate(obj%arr(n))
+ obj%arr = 1
+ scalar = 2
+
+ !$omp target defaultmap(tofrom: scalar)
+ do i = 1, n
+ obj%arr(i) = obj%arr(i) + scalar
+ end do
+ scalar = 7
+ !$omp end target
+
+ ok = .true.
+ do i = 1, n
+ if (obj%arr(i) /= 3) ok = .false.
+ end do
+ if (scalar /= 7) ok = .false.
+
+ if (ok) then
+ print *, "Test passed!"
+ else
+ print *, "Test failed!"
+ print *, obj%arr
+ print *, scalar
+ end if
+
+ deallocate(obj%arr)
+ deallocate(obj)
+end program defaultmap_implicit_mapper
+
+! CHECK: Test passed!
More information about the flang-commits
mailing list