[flang-commits] [flang] [llvm] [Flan][OpenMP] Implement TODO support for compatible defaultmap types for implicit mappers (PR #177389)
via flang-commits
flang-commits at lists.llvm.org
Thu Jan 22 08:11:09 PST 2026
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-fir-hlfir
Author: Akash Banerjee (TIFitis)
<details>
<summary>Changes</summary>
Make implicit default mapper generation respect defaultmap categories so unrelated defaultmap clauses no longer suppress mappers for derived types.
Added related tests.
---
Full diff: https://github.com/llvm/llvm-project/pull/177389.diff
3 Files Affected:
- (modified) flang/lib/Lower/OpenMP/OpenMP.cpp (+3-4)
- (modified) flang/test/Lower/OpenMP/defaultmap.f90 (+22)
- (added) offload/test/offloading/fortran/target-defaultmap-implicit-mapper.f90 (+49)
``````````diff
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!
``````````
</details>
https://github.com/llvm/llvm-project/pull/177389
More information about the flang-commits
mailing list