[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