[flang-commits] [flang] [llvm] [mlir] [Flang][OpenMP] Remove target implicit allocatable member mapping from MapInfoFinalization and extend lowering to support it (PR #219434)
via flang-commits
flang-commits at lists.llvm.org
Thu Sep 10 16:48:21 PDT 2026
https://github.com/agozillon updated https://github.com/llvm/llvm-project/pull/219434
>From 19d4425ff3c6214d88ed1e12adbceee11e2d4998 Mon Sep 17 00:00:00 2001
From: agozillon <Andrew.Gozillon at amd.com>
Date: Fri, 28 Aug 2026 04:06:43 -0500
Subject: [PATCH 1/2] [Flang][OpenMP] Remove old partially implemented implicit
allocatable member mapping from MapInfoFinalization
Remove partially complete implicit allocatable map code from MapInfoFinalization, it should
no longer be required as the DeclareMapper infrastructure in the frontend handles this. It is
currently propping up some odd map cases related to declare mapper that I do not believe are
legal.
---
flang/lib/Lower/OpenMP/OpenMP.cpp | 9 +-
.../Optimizer/OpenMP/MapInfoFinalization.cpp | 191 ------------------
flang/test/Lower/OpenMP/declare-mapper.f90 | 63 ++----
...licit-default-mapper-allocatable-field.f90 | 33 +++
...p-map-info-finalization-implicit-field.fir | 92 ---------
.../implicit-map-allocatable-field.f90 | 30 +++
6 files changed, 79 insertions(+), 339 deletions(-)
create mode 100644 flang/test/Lower/OpenMP/implicit-default-mapper-allocatable-field.f90
delete mode 100644 flang/test/Transforms/omp-map-info-finalization-implicit-field.fir
create mode 100644 offload/test/offloading/fortran/implicit-map-allocatable-field.f90
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index 89f768c6dc811..4ea515fb5074e 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -4296,19 +4296,18 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
if (!mapperIdName.empty()) {
bool isPointer = semantics::IsPointer(sym);
- bool isAllocatable = semantics::IsAllocatable(sym);
bool hasDefaultMapper =
converter.getModuleOp().lookupSymbol(mapperIdName);
// Avoid attaching implicit default mappers to pointer captures.
// For large pointer-based derived aggregates this can over-map
// nested payloads and conflict with explicit enter/exit maps.
//
- // For an allocatable capture, only synthesize an implicit default
- // mapper when the type requires one; a flat record does not.
+ // For other captures, make sure we require a declare mapper to
+ // map the underlying record type, this is primarily for cases
+ // where the record type contains an allocatable.
if (!isPointer &&
(hasDefaultMapper ||
- (isAllocatable &&
- requiresImplicitDefaultDeclareMapper(*typeSpec)))) {
+ (requiresImplicitDefaultDeclareMapper(*typeSpec)))) {
if (!hasDefaultMapper) {
if (auto recordType = mlir::dyn_cast_or_null<fir::RecordType>(
converter.genType(*typeSpec)))
diff --git a/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp b/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp
index e78d194c5c7ae..f01445d7c6c44 100644
--- a/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp
+++ b/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp
@@ -1446,197 +1446,6 @@ class MapInfoFinalizationPass
addImplicitMembersToTarget(op, builder, targetUser);
});
- // Next, walk `omp.map.info` ops to see if any record members should be
- // implicitly mapped.
- func->walk([&](mlir::omp::MapInfoOp op) {
- mlir::Type underlyingType =
- fir::unwrapRefType(op.getVarPtr().getType());
-
- // TODO Test with and support more complicated cases; like arrays for
- // records, for example.
- if (!fir::isRecordWithAllocatableMember(underlyingType))
- return mlir::WalkResult::advance();
-
- // TODO For now, only consider `omp.target` ops. Other ops that support
- // `map` clauses will follow later.
- mlir::omp::TargetOp target =
- mlir::dyn_cast_if_present<mlir::omp::TargetOp>(
- getFirstTargetUser(op));
-
- if (!target)
- return mlir::WalkResult::advance();
-
- auto mapClauseOwner =
- llvm::dyn_cast<mlir::omp::MapClauseOwningOpInterface>(*target);
-
- int64_t mapVarIdx = mapClauseOwner.getOperandIndexForMap(op);
- assert(mapVarIdx >= 0 &&
- mapVarIdx <
- static_cast<int64_t>(mapClauseOwner.getMapVars().size()));
-
- auto argIface =
- llvm::dyn_cast<mlir::omp::BlockArgOpenMPOpInterface>(*target);
- // TODO How should `map` block argument that correspond to: `private`,
- // `use_device_addr`, `use_device_ptr`, be handled?
- mlir::BlockArgument opBlockArg = argIface.getMapBlockArgs()[mapVarIdx];
- llvm::SetVector<mlir::Operation *> mapVarForwardSlice;
- mlir::getForwardSlice(opBlockArg, &mapVarForwardSlice);
-
- mapVarForwardSlice.remove_if([&](mlir::Operation *sliceOp) {
- // TODO Support coordinate_of ops.
- //
- // TODO Support call ops by recursively examining the forward slice of
- // the corresponding parameter to the field in the called function.
- return !mlir::isa<hlfir::DesignateOp>(sliceOp);
- });
-
- auto recordType = mlir::cast<fir::RecordType>(underlyingType);
- llvm::SmallVector<mlir::Value> newMapOpsForFields;
- llvm::SmallVector<llvm::SmallVector<int64_t>> newMemberIndexPaths;
-
- // 1) Handle direct top-level allocatable fields.
- for (auto fieldMemTyPair : recordType.getTypeList()) {
- auto &field = fieldMemTyPair.first;
- auto memTy = fieldMemTyPair.second;
-
- if (!fir::isAllocatableType(memTy))
- continue;
-
- bool referenced = llvm::any_of(mapVarForwardSlice, [&](auto *opv) {
- auto designateOp = mlir::dyn_cast<hlfir::DesignateOp>(opv);
- return designateOp && designateOp.getComponent() &&
- designateOp.getComponent()->strref() == field;
- });
- if (!referenced)
- continue;
-
- int32_t fieldIdx = recordType.getFieldIndex(field);
- builder.setInsertionPoint(op);
- fir::IntOrValue idxConst =
- mlir::IntegerAttr::get(builder.getI32Type(), fieldIdx);
- auto fieldCoord = fir::CoordinateOp::create(
- builder, op.getLoc(), builder.getRefType(memTy), op.getVarPtr(),
- llvm::SmallVector<fir::IntOrValue, 1>{idxConst});
- int64_t fieldIdx64 = static_cast<int64_t>(fieldIdx);
- llvm::SmallVector<int64_t, 1> idxPath{fieldIdx64};
- appendMemberMapIfNew(op, builder, op.getLoc(), fieldCoord, idxPath,
- field, newMapOpsForFields, newMemberIndexPaths);
- }
-
- // Handle nested allocatable fields along any component chain
- // referenced in the region via HLFIR designates.
- llvm::SmallVector<llvm::SmallVector<int64_t>> seenIndexPaths;
- for (mlir::Operation *sliceOp : mapVarForwardSlice) {
- auto designateOp = mlir::dyn_cast<hlfir::DesignateOp>(sliceOp);
- if (!designateOp || !designateOp.getComponent())
- continue;
- llvm::SmallVector<llvm::StringRef> compPathReversed;
- compPathReversed.push_back(designateOp.getComponent()->strref());
- mlir::Value curBase = designateOp.getMemref();
- bool rootedAtMapArg = false;
- while (true) {
- if (auto parentDes = curBase.getDefiningOp<hlfir::DesignateOp>()) {
- if (!parentDes.getComponent())
- break;
- compPathReversed.push_back(parentDes.getComponent()->strref());
- curBase = parentDes.getMemref();
- continue;
- }
- if (auto decl = curBase.getDefiningOp<hlfir::DeclareOp>()) {
- if (auto barg =
- mlir::dyn_cast<mlir::BlockArgument>(decl.getMemref()))
- rootedAtMapArg = (barg == opBlockArg);
- } else if (auto blockArg =
- mlir::dyn_cast_or_null<mlir::BlockArgument>(
- curBase)) {
- rootedAtMapArg = (blockArg == opBlockArg);
- }
- break;
- }
- // Only process nested paths (2+ components). Single-component paths
- // for direct fields are handled above.
- if (!rootedAtMapArg || compPathReversed.size() < 2)
- continue;
- builder.setInsertionPoint(op);
- llvm::SmallVector<int64_t> indexPath;
- mlir::Type curTy = underlyingType;
- mlir::Value coordRef = op.getVarPtr();
- bool validPath = true;
- for (llvm::StringRef compName : llvm::reverse(compPathReversed)) {
- auto recTy = mlir::dyn_cast<fir::RecordType>(curTy);
- if (!recTy) {
- validPath = false;
- break;
- }
- int32_t idx = recTy.getFieldIndex(compName);
- if (idx < 0) {
- validPath = false;
- break;
- }
- indexPath.push_back(idx);
- mlir::Type memTy = recTy.getType(idx);
- fir::IntOrValue idxConst =
- mlir::IntegerAttr::get(builder.getI32Type(), idx);
- coordRef = fir::CoordinateOp::create(
- builder, op.getLoc(), builder.getRefType(memTy), coordRef,
- llvm::SmallVector<fir::IntOrValue, 1>{idxConst});
- curTy = memTy;
- }
- if (!validPath)
- continue;
- if (auto finalRefTy =
- mlir::dyn_cast<fir::ReferenceType>(coordRef.getType())) {
- mlir::Type eleTy = finalRefTy.getElementType();
- if (fir::isAllocatableType(eleTy)) {
- if (!containsPath(seenIndexPaths, indexPath)) {
- seenIndexPaths.emplace_back(indexPath.begin(), indexPath.end());
- appendMemberMapIfNew(op, builder, op.getLoc(), coordRef,
- indexPath, compPathReversed.front(),
- newMapOpsForFields, newMemberIndexPaths);
- }
- }
- }
- }
-
- if (newMapOpsForFields.empty())
- return mlir::WalkResult::advance();
-
- // Deduplicate by index path to avoid emitting duplicate members for
- // the same component. Use a set-based key to keep this near O(n).
- llvm::SmallVector<mlir::Value> dedupMapOps;
- llvm::SmallVector<llvm::SmallVector<int64_t>> dedupIndexPaths;
- llvm::StringSet<> seenKeys;
- for (auto [i, mapOp] : llvm::enumerate(newMapOpsForFields)) {
- const auto &path = newMemberIndexPaths[i];
- llvm::SmallString<64> key;
- buildPathKey(path, key);
- if (seenKeys.contains(key))
- continue;
- seenKeys.insert(key);
- dedupMapOps.push_back(mapOp);
- dedupIndexPaths.emplace_back(path.begin(), path.end());
- }
- op.getMembersMutable().append(dedupMapOps);
- llvm::SmallVector<llvm::SmallVector<int64_t>> newMemberIndices;
- if (mlir::ArrayAttr oldAttr = op.getMembersIndexAttr())
- for (mlir::Attribute indexList : oldAttr) {
- llvm::SmallVector<int64_t> listVec;
-
- for (mlir::Attribute index : mlir::cast<mlir::ArrayAttr>(indexList))
- listVec.push_back(mlir::cast<mlir::IntegerAttr>(index).getInt());
-
- newMemberIndices.emplace_back(std::move(listVec));
- }
- for (auto &path : dedupIndexPaths)
- newMemberIndices.emplace_back(path);
-
- op.setMembersIndexAttr(builder.create2DI64ArrayAttr(newMemberIndices));
- // Set to partial map only if there is no user-defined mapper.
- op.setPartialMap(op.getMapperIdAttr() == nullptr);
-
- return mlir::WalkResult::advance();
- });
-
func->walk([&](mlir::omp::MapInfoOp op) {
// NOTE: Currently only supports a single user for the MapInfoOp. This
// is fine for the moment, as the Fortran frontend will generate a
diff --git a/flang/test/Lower/OpenMP/declare-mapper.f90 b/flang/test/Lower/OpenMP/declare-mapper.f90
index c10bcc5da3f2d..51b155ea31f48 100644
--- a/flang/test/Lower/OpenMP/declare-mapper.f90
+++ b/flang/test/Lower/OpenMP/declare-mapper.f90
@@ -6,15 +6,14 @@
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-3.f90 -o - | FileCheck %t/omp-declare-mapper-3.f90
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-4.f90 -o - | FileCheck %t/omp-declare-mapper-4.f90
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-5.f90 -o - | FileCheck %t/omp-declare-mapper-5.f90
-! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-6.f90 -o - | FileCheck %t/omp-declare-mapper-6.f90
+! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -module-dir %t %t/omp-declare-mapper-6.mod.f90 -o - >/dev/null
+! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -J %t %t/omp-declare-mapper-6.use.f90 -o - | FileCheck %t/omp-declare-mapper-6.use.f90
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -module-dir %t %t/omp-declare-mapper-7.mod.f90 -o - >/dev/null
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -J %t %t/omp-declare-mapper-7.use.f90 -o - | FileCheck %t/omp-declare-mapper-7.use.f90
-! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -module-dir %t %t/omp-declare-mapper-8.mod.f90 -o - >/dev/null
-! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 -J %t %t/omp-declare-mapper-8.use.f90 -o - | FileCheck %t/omp-declare-mapper-8.use.f90
-! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=52 %t/omp-declare-mapper-9.f90 -o - | FileCheck %t/omp-declare-mapper-9.f90
+! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=52 %t/omp-declare-mapper-8.f90 -o - | FileCheck %t/omp-declare-mapper-8.f90
+! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-9.f90 -o - | FileCheck %t/omp-declare-mapper-9.f90
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-10.f90 -o - | FileCheck %t/omp-declare-mapper-10.f90
! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-11.f90 -o - | FileCheck %t/omp-declare-mapper-11.f90
-! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %t/omp-declare-mapper-12.f90 -o - | FileCheck %t/omp-declare-mapper-12.f90
!--- omp-declare-mapper-1.f90
subroutine declare_mapper_1
@@ -274,45 +273,7 @@ subroutine use_inner()
end subroutine
end program declare_mapper_5
-!--- omp-declare-mapper-6.f90
-subroutine declare_mapper_nested_parent
- type :: inner_t
- real, allocatable :: deep_arr(:)
- end type inner_t
-
- type, abstract :: base_t
- real, allocatable :: base_arr(:)
- type(inner_t) :: inner
- end type base_t
-
- type, extends(base_t) :: real_t
- real, allocatable :: real_arr(:)
- end type real_t
-
- !$omp declare mapper (custommapper : real_t :: t) map(tofrom: t%base_arr, t%real_arr)
- ! CHECK: omp.declare_mapper @{{.*custommapper}}
- ! CHECK-DAG: omp.map.info {{.*}} name("t%base_t%base_arr")
- ! CHECK-DAG: omp.map.info {{.*}} name("t%real_arr")
- ! CHECK: omp.declare_mapper.info
-
- type(real_t) :: r
-
- allocate(r%base_arr(10))
- allocate(r%inner%deep_arr(10))
- allocate(r%real_arr(10))
- r%base_arr = 1.0
- r%inner%deep_arr = 4.0
- r%real_arr = 0.0
-
- ! Check implicit maps for deep nested allocatable payloads not covered by mapper
- ! CHECK-DAG: omp.map.info {{.*}} name("r.deep_arr.implicit_map")
- ! CHECK: omp.target kernel_type(generic)
- !$omp target map(mapper(custommapper), tofrom: r)
- r%real_arr = r%base_arr(1) + r%inner%deep_arr(1)
- !$omp end target
-end subroutine declare_mapper_nested_parent
-
-!--- omp-declare-mapper-7.mod.f90
+!--- omp-declare-mapper-6.mod.f90
! Module with DECLARE MAPPER to be compiled separately
module m_mod
implicit none
@@ -322,7 +283,7 @@ module m_mod
!$omp declare mapper(mymap : mty :: v) map(tofrom: v%x)
end module m_mod
-!--- omp-declare-mapper-7.use.f90
+!--- omp-declare-mapper-6.use.f90
! Consumer program that USEs the module and applies the mapper by name.
! CHECK: %{{.*}} = omp.map.info {{.*}} mapper(@{{.*mymap}}) name("a")
program use_module_mapper
@@ -334,7 +295,7 @@ program use_module_mapper
!$omp end target
end program use_module_mapper
-!--- omp-declare-mapper-8.mod.f90
+!--- omp-declare-mapper-7.mod.f90
! Module with a default DECLARE MAPPER to be compiled separately.
module default_mapper_mod
implicit none
@@ -344,7 +305,7 @@ module default_mapper_mod
!$omp declare mapper(dtype :: v) map(tofrom: v%x)
end module default_mapper_mod
-!--- omp-declare-mapper-8.use.f90
+!--- omp-declare-mapper-7.use.f90
! Consumer program that USEs the module and relies on the default mapper.
! CHECK: omp.declare_mapper @{{.*dtype_omp_default_mapper}} : !fir.type<_QMdefault_mapper_modTdtype{x:i32}>
! CHECK: %{{.*}} = omp.map.info {{.*}} map_clauses(tofrom) {{.*}} mapper(@{{.*dtype_omp_default_mapper}}) name("a")
@@ -367,7 +328,7 @@ program use_module_default_mapper
!$omp end target
end program use_module_default_mapper
-!--- omp-declare-mapper-9.f90
+!--- omp-declare-mapper-8.f90
! Test mapper usage in target update to/from clauses
program target_update_mapper
type :: typ
@@ -400,7 +361,7 @@ program target_update_mapper
end program target_update_mapper
-!--- omp-declare-mapper-10.f90
+!--- omp-declare-mapper-9.f90
! Test that default mapper is applied only to the matching type (dtype_a) and not to dtype_b
subroutine declare_mapper_10
type dtype_a
@@ -434,7 +395,7 @@ subroutine declare_mapper_10
!$omp target enter data map(to: dtype, var_a, var_b, dtype2)
end subroutine
-!--- omp-declare-mapper-11.f90
+!--- omp-declare-mapper-10.f90
! Test that named mapper overrides default mapper when explicitly specified
subroutine declare_mapper_11
type dtype_a
@@ -470,7 +431,7 @@ subroutine declare_mapper_11
!$omp target enter data map(mapper(testing), to: dtype, var_a, var_b, dtype2)
end subroutine
-!--- omp-declare-mapper-12.f90
+!--- omp-declare-mapper-11.f90
! Test multiple types with different mappers - each type gets its appropriate mapper
subroutine declare_mapper_12
type dtype_a
diff --git a/flang/test/Lower/OpenMP/implicit-default-mapper-allocatable-field.f90 b/flang/test/Lower/OpenMP/implicit-default-mapper-allocatable-field.f90
new file mode 100644
index 0000000000000..afc7572967bdb
--- /dev/null
+++ b/flang/test/Lower/OpenMP/implicit-default-mapper-allocatable-field.f90
@@ -0,0 +1,33 @@
+! RUN: %flang_fc1 -emit-hlfir -fopenmp -fopenmp-version=50 %s -o - | FileCheck %s
+
+program p
+ implicit none
+ type t
+ integer, allocatable :: a(:)
+ end type
+ type(t) :: x
+
+ allocate(x%a(1))
+ x%a = 0
+
+ !$omp target
+ x%a(1) = 42
+ !$omp end target
+
+ if (x%a(1) /= 42) error stop
+end program
+
+! CHECK: omp.declare_mapper @[[MAPPER:_QQFt_omp_default_mapper]] : [[TYPE:!fir\.type<_QFTt\{a:!fir\.box<!fir\.heap<!fir\.array<\?xi32>>>\}>]] {
+! CHECK: ^bb0(%[[ARG:.*]]: !fir.ref<[[TYPE]]>):
+! CHECK: %[[DECL:.*]]:2 = hlfir.declare %[[ARG]]
+! CHECK: %[[COORD:.*]] = fir.coordinate_of %[[DECL]]#0, a
+! CHECK: %[[BOUNDS:.*]] = omp.map.bounds
+! CHECK: %[[BOX_OFF:.*]] = fir.box_offset %[[COORD]] base_addr
+! CHECK: %[[MEMBER_PTR:.*]] = omp.map.info var_ptr(%[[COORD]] {{.*}}) map_clauses(implicit, tofrom) capture(ByRef) var_ptr_ptr(%[[BOX_OFF]] {{.*}}) bounds(%[[BOUNDS]]) name("")
+! CHECK: %[[DESC:.*]] = omp.map.info var_ptr(%[[COORD]] {{.*}}) map_clauses(always, implicit, to) capture(ByRef) name("")
+! CHECK: %[[ATTACH:.*]] = omp.map.info var_ptr(%[[COORD]] {{.*}}) map_clauses(attach, ref_ptr, ref_ptee) capture(ByRef) var_ptr_ptr(%[[BOX_OFF]] {{.*}}) bounds(%[[BOUNDS]]) name("")
+! CHECK: %[[PARENT:.*]] = omp.map.info var_ptr(%[[DECL]]#1 {{.*}}) map_clauses(implicit) capture(ByRef) members(%[[DESC]], %[[MEMBER_PTR]] : [0], [0, 0] {{.*}}) name("") partial_map(true)
+! CHECK: omp.declare_mapper.info map_entries(%[[PARENT]], %[[DESC]], %[[ATTACH]], %[[MEMBER_PTR]]
+
+! CHECK: %[[MAP:.*]] = omp.map.info var_ptr(%{{.*}} : !fir.ref<[[TYPE]]>, [[TYPE]]) map_clauses(implicit, tofrom) capture(ByRef) mapper(@[[MAPPER]]) name("x")
+! CHECK: omp.target {{.*}}map_entries(%[[MAP]] -> %{{.*}} : !fir.ref<[[TYPE]]>)
diff --git a/flang/test/Transforms/omp-map-info-finalization-implicit-field.fir b/flang/test/Transforms/omp-map-info-finalization-implicit-field.fir
deleted file mode 100644
index fc26cd9477377..0000000000000
--- a/flang/test/Transforms/omp-map-info-finalization-implicit-field.fir
+++ /dev/null
@@ -1,92 +0,0 @@
-// Tests that we implicitly map alloctable fields of a record when referenced in
-// a target region.
-
-// RUN: fir-opt --split-input-file --omp-map-info-finalization %s | FileCheck %s
-
-!record_t = !fir.type<_QFTrecord_t{
- not_to_implicitly_map:
- !fir.box<!fir.heap<!fir.array<?xf32>>>,
- to_implicitly_map:
- !fir.box<!fir.heap<!fir.array<?xf32>>>
-}>
-
-fir.global internal @_QFEdst_record : !record_t {
- %0 = fir.undefined !record_t
- fir.has_value %0 : !record_t
-}
-
-omp.declare_mapper @record_mapper : !record_t {
-^bb0(%arg0: !fir.ref<!record_t>):
- %0 = omp.map.info var_ptr(%arg0: !fir.ref<!record_t>, !record_t) map_clauses(implicit, tofrom) capture(ByRef) -> !fir.ref<!record_t>
- omp.declare_mapper.info map_entries(%0: !fir.ref<!record_t>)
-}
-
-func.func @_QQmain() {
- %6 = fir.address_of(@_QFEdst_record) : !fir.ref<!record_t>
- %7:2 = hlfir.declare %6 {uniq_name = "_QFEdst_record"} : (!fir.ref<!record_t>) -> (!fir.ref<!record_t>, !fir.ref<!record_t>)
- %16 = omp.map.info var_ptr(%7#1 : !fir.ref<!record_t>, !record_t) map_clauses(implicit, tofrom) capture(ByRef) name("dst_record") -> !fir.ref<!record_t>
- %17 = omp.map.info var_ptr(%7#1 : !fir.ref<!record_t>, !record_t) map_clauses(implicit, tofrom) capture(ByRef) mapper(@record_mapper) name("dst_record_with_mapper") -> !fir.ref<!record_t>
- omp.target kernel_type(generic) map_entries(%16 -> %arg0, %17 -> %arg1 : !fir.ref<!record_t>, !fir.ref<!record_t>) {
- %20:2 = hlfir.declare %arg0 {uniq_name = "_QFEdst_record"} : (!fir.ref<!record_t>) -> (!fir.ref<!record_t>, !fir.ref<!record_t>)
- %21:2 = hlfir.declare %arg1 {uniq_name = "_QFEdst_record"} : (!fir.ref<!record_t>) -> (!fir.ref<!record_t>, !fir.ref<!record_t>)
-
- %23 = hlfir.designate %20#0{"to_implicitly_map"} {fortran_attrs = #fir.var_attrs<allocatable>} : (!fir.ref<!record_t>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
-
- %24 = hlfir.designate %21#0{"to_implicitly_map"} {fortran_attrs = #fir.var_attrs<allocatable>} : (!fir.ref<!record_t>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
- omp.terminator
- }
- return
-}
-
-// CHECK: %[[RECORD_DECL:.*]]:2 = hlfir.declare %0 {uniq_name = "_QFEdst_record"}
-// CHECK: %[[FIELD_COORD:.*]] = fir.coordinate_of %[[RECORD_DECL]]#1, to_implicitly_map
-
-// CHECK: %[[UPPER_BOUND:.*]] = arith.subi %{{.*}}#1, %{{c1.*}} : index
-
-// CHECK: %[[BOUNDS:.*]] = omp.map.bounds
-// CHECK-SAME: lower_bound(%{{c0.*}} : index) upper_bound(%[[UPPER_BOUND]] : index)
-// CHECK-SAME: extent(%{{.*}}#1 : index) stride(%{{.*}}#2 : index)
-// CHECK-SAME: start_idx(%{{.*}}#0 : index) stride_in_bytes(true)
-
-// CHECK: %[[BASE_ADDR:.*]] = fir.box_offset %[[FIELD_COORD]] base_addr
-// CHECK: %[[FIELD_BASE_ADDR_MAP:.*]] = omp.map.info var_ptr(
-// CHECK-SAME: %[[FIELD_COORD]] : {{.*}}) map_clauses(
-// CHECK-SAME: implicit, tofrom) capture(ByRef) var_ptr_ptr(
-// CHECK-SAME: %[[BASE_ADDR]] : {{.*}}) bounds(
-// CHECK-SAME: %[[BOUNDS]])
-
-// CHECK: %[[FIELD_MAP:.*]] = omp.map.info var_ptr(
-// CHECK-SAME: %[[FIELD_COORD]] : {{.*}}) map_clauses(
-// CHECK-SAME: always, implicit, to) capture(ByRef)
-// CHECK-SAME: name("dst_record.to_implicitly_map.implicit_map") ->
-
-// CHECK: %[[ATTACH_MAP:.*]] = omp.map.info var_ptr(
-// CHECK-SAME: %[[FIELD_COORD]] : {{.*}}) map_clauses(
-// CHECK-SAME: attach, ref_ptr, ref_ptee) capture(ByRef)
-// CHECK-SAME: var_ptr_ptr(%[[BASE_ADDR]] : {{.*}}
-
-// CHECK: %[[RECORD_MAP:.*]] = omp.map.info var_ptr(
-// CHECK-SAME: %[[RECORD_DECL]]#1 : {{.*}}) map_clauses(
-// CHECK-SAME: implicit, tofrom) capture(ByRef) members(
-// CHECK-SAME: %[[FIELD_MAP]], %[[FIELD_BASE_ADDR_MAP]] :
-// CHECK-SAME: [1], [1, 0] : {{.*}}) name("dst_record")
-// CHECK-SAME: partial_map(true) -> {{.*}}>
-
-// Verify map ops when using a mapper:
-// Implicit field mapping is the same as for the non-mapper case.
-// CHECK: omp.map.info
-// CHECK: omp.map.info
-// CHECK: omp.map.info
-
-// Verify that partial-map is not set if the map info op uses a user-defined (or
-// compiler-emitted) mapper.
-// CHECK: %[[RECORD_MAP_MAPPER:.*]] = omp.map.info var_ptr(
-// CHECK-SAME: %[[RECORD_DECL]]#1 : {{.*}}) map_clauses(
-// CHECK-SAME: implicit, tofrom) capture(ByRef) mapper(@record_mapper)
-// CHECK-SAME: members(%{{.*}}, %{{.*}} : [1], [1, 0] : {{.*}}) name("dst_record_with_mapper") -> {{.*}}>
-
-// CHECK: omp.target kernel_type(generic) map_entries(
-// CHECK-SAME: %[[RECORD_MAP]] -> %{{[^[:space:]]+}},
-// CHECK-SAME: %[[FIELD_MAP]] -> %{{[^[:space:]]+}},
-// CHECK-SAME: %[[FIELD_BASE_ADDR_MAP]] -> %{{[^[:space:]]+}}
-// CHECK-SAME: : {{.*}})
diff --git a/offload/test/offloading/fortran/implicit-map-allocatable-field.f90 b/offload/test/offloading/fortran/implicit-map-allocatable-field.f90
new file mode 100644
index 0000000000000..0df28e5a9c35e
--- /dev/null
+++ b/offload/test/offloading/fortran/implicit-map-allocatable-field.f90
@@ -0,0 +1,30 @@
+! Verify that a derived type with an allocatable component, captured implicitly
+! by a target region, is correctly mapped to and from the device.
+! REQUIRES: flang, amdgpu
+
+! RUN: %libomptarget-compile-fortran-run-and-check-generic
+program p
+ implicit none
+ type t
+ integer, allocatable :: a(:)
+ end type
+ type(t) :: x
+
+ allocate(x%a(1))
+ x%a = 0
+
+ !$omp target
+ x%a(1) = 42
+ !$omp end target
+
+ if (x%a(1) /= 42) then
+ print *, "======= Test Failed! ======="
+ stop 1
+ end if
+
+ print *, "======= Test Passed! ======="
+
+ deallocate(x%a)
+end program
+
+! CHECK: ======= Test Passed! =======
>From e4b3776ef67b871781380b31bfbe6feccffa407e Mon Sep 17 00:00:00 2001
From: agozillon <Andrew.Gozillon at amd.com>
Date: Fri, 4 Sep 2026 00:38:24 -0500
Subject: [PATCH 2/2] [Flang][OpenMP] Extend allocatable component mapping to
better support implicit allocatable derived type capture
---
flang/lib/Utils/OpenMP.cpp | 36 ++++++++-------
.../OpenMP/map-types-and-sizes.f90 | 12 ++---
.../OpenMP/default-mapper-no-pointer-map.f90 | 45 +++++++++----------
...licit-default-mapper-allocatable-field.f90 | 9 ++--
.../OpenMP/implicit-mapper-no-pointer-map.f90 | 45 +++++++++----------
.../omp-map-info-finalization-usm.fir | 24 ----------
.../OpenMP/OpenMPToLLVMIRTranslation.cpp | 6 ++-
.../LLVMIR/omptarget-host-ref-semantics.mlir | 10 ++---
...t-nested-ptr-record-type-mapping-host.mlir | 2 +-
...arget-nested-record-type-mapping-host.mlir | 2 +-
...ptarget-overlapping-record-member-map.mlir | 2 +-
.../omptarget-record-type-mapping-host.mlir | 2 +-
...rget-record-type-with-ptr-member-host.mlir | 2 +-
13 files changed, 87 insertions(+), 110 deletions(-)
delete mode 100644 flang/test/Transforms/omp-map-info-finalization-usm.fir
diff --git a/flang/lib/Utils/OpenMP.cpp b/flang/lib/Utils/OpenMP.cpp
index 73b91ea08ac73..aa5ef994252f7 100644
--- a/flang/lib/Utils/OpenMP.cpp
+++ b/flang/lib/Utils/OpenMP.cpp
@@ -340,29 +340,35 @@ mlir::FlatSymbolRefAttr getOrGenImplicitDefaultDeclareMapper(
firOpBuilder, loc, recType, mapperIdName, mangler);
}
- auto ref =
- getFieldRef(declareOp.getBase(), memberName, memberType, recordType);
- llvm::SmallVector<mlir::Value> bounds;
- genBoundsOps(ref, bounds);
- mlir::Value mapOp = Fortran::utils::openmp::createMapInfoOp(firOpBuilder,
- loc, ref, /*varPtrPtr=*/mlir::Value{}, /*name=*/"", bounds,
- /*members=*/{},
- /*membersIndex=*/mlir::ArrayAttr{}, mapFlag, captureKind, ref.getType(),
- /*partialMap=*/false, mapperId);
- memberMapOps.emplace_back(mapOp);
- memberPlacementIndices.emplace_back(
- llvm::SmallVector<int64_t>{(int64_t)entry.index()});
+ bool isAllocatable = fir::isAllocatableType(fir::unwrapRefType(memberType));
+ if (isAllocatable ||
+ mlir::isa<fir::RecordType>(fir::getFortranElementType(memberType))) {
+ auto ref =
+ getFieldRef(declareOp.getBase(), memberName, memberType, recordType);
+ llvm::SmallVector<mlir::Value> bounds;
+ genBoundsOps(ref, bounds);
+ mlir::Value mapOp = Fortran::utils::openmp::createMapInfoOp(firOpBuilder,
+ loc, ref, /*varPtrPtr=*/mlir::Value{}, /*name=*/"", bounds,
+ /*members=*/{},
+ /*membersIndex=*/mlir::ArrayAttr{},
+ isAllocatable ? mapFlag | mlir::omp::ClauseMapFlags::ref_ptee
+ : mapFlag,
+ captureKind, ref.getType(),
+ /*partialMap=*/false, mapperId);
+ memberMapOps.emplace_back(mapOp);
+ memberPlacementIndices.emplace_back(
+ llvm::SmallVector<int64_t>{(int64_t)entry.index()});
+ }
}
llvm::SmallVector<mlir::Value> bounds;
genBoundsOps(declareOp.getOriginalBase(), bounds);
- mlir::omp::ClauseMapFlags parentMapFlag = mlir::omp::ClauseMapFlags::implicit;
mlir::omp::MapInfoOp mapOp = Fortran::utils::openmp::createMapInfoOp(
firOpBuilder, loc, declareOp.getOriginalBase(),
/*varPtrPtr=*/mlir::Value(), /*name=*/"", bounds, memberMapOps,
- firOpBuilder.create2DI64ArrayAttr(memberPlacementIndices), parentMapFlag,
+ firOpBuilder.create2DI64ArrayAttr(memberPlacementIndices), mapFlag,
captureKind, declareOp.getType(0),
- /*partialMap=*/true);
+ /*partialMap=*/false);
mlir::omp::DeclareMapperInfoOperands clauseOps;
clauseOps.mapVars.emplace_back(mapOp);
diff --git a/flang/test/Integration/OpenMP/map-types-and-sizes.f90 b/flang/test/Integration/OpenMP/map-types-and-sizes.f90
index c96e320edb7a1..1a86c7186a1f5 100644
--- a/flang/test/Integration/OpenMP/map-types-and-sizes.f90
+++ b/flang/test/Integration/OpenMP/map-types-and-sizes.f90
@@ -43,7 +43,7 @@ subroutine mapType_is_device_ptr
end subroutine mapType_is_device_ptr
!CHECK: @.offload_sizes{{.*}} = private unnamed_addr constant [5 x i64] [i64 0, i64 24, i64 0, i64 0, i64 0]
-!CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [5 x i64] [i64 32, i64 281474976711173, i64 515, i64 16384, i64 288]
+!CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [5 x i64] [i64 545, i64 281474976711173, i64 515, i64 16384, i64 288]
subroutine mapType_ptr
integer, pointer :: a
!$omp target
@@ -83,7 +83,7 @@ subroutine map_ompx_hold
end subroutine
!CHECK: @.offload_sizes{{.*}} = private unnamed_addr constant [5 x i64] [i64 0, i64 24, i64 0, i64 0, i64 0]
-!CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [5 x i64] [i64 32, i64 281474976711173, i64 515, i64 16384, i64 288]
+!CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [5 x i64] [i64 545, i64 281474976711173, i64 515, i64 16384, i64 288]
subroutine mapType_allocatable
integer, allocatable :: a
allocate(a)
@@ -94,7 +94,7 @@ subroutine mapType_allocatable
end subroutine mapType_allocatable
!CHECK: @.offload_sizes{{.*}} = private unnamed_addr constant [5 x i64] [i64 0, i64 24, i64 0, i64 0, i64 0]
-!CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [5 x i64] [i64 32, i64 281474976710661, i64 3, i64 16384, i64 288]
+!CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [5 x i64] [i64 33, i64 281474976710661, i64 3, i64 16384, i64 288]
subroutine mapType_ptr_explicit
integer, pointer :: a
!$omp target map(tofrom: a)
@@ -103,7 +103,7 @@ subroutine mapType_ptr_explicit
end subroutine mapType_ptr_explicit
!CHECK: @.offload_sizes{{.*}} = private unnamed_addr constant [5 x i64] [i64 0, i64 24, i64 0, i64 0, i64 0]
-!CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [5 x i64] [i64 32, i64 281474976710661, i64 3, i64 16384, i64 288]
+!CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [5 x i64] [i64 33, i64 281474976710661, i64 3, i64 16384, i64 288]
subroutine mapType_allocatable_explicit
integer, allocatable :: a
allocate(a)
@@ -276,7 +276,7 @@ subroutine mapType_derived_type_alloca()
end subroutine
!CHECK: @.offload_sizes{{.*}} = private unnamed_addr constant [9 x i64] [i64 0, i64 40, i64 0, i64 48, i64 0, i64 4, i64 0, i64 0, i64 0]
-!CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [9 x i64] [i64 32, i64 281474976710661, i64 0, i64 281474976710661, i64 3, i64 281474976710659, i64 16384, i64 16384, i64 288]
+!CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [9 x i64] [i64 33, i64 281474976710661, i64 0, i64 281474976710661, i64 3, i64 281474976710659, i64 16384, i64 16384, i64 288]
subroutine mapType_alloca_derived_type()
type :: one_layer
real(4) :: i
@@ -299,7 +299,7 @@ subroutine mapType_alloca_derived_type()
end subroutine
!CHECK: @.offload_sizes{{.*}} = private unnamed_addr constant [9 x i64] [i64 0, i64 40, i64 0, i64 48, i64 0, i64 4, i64 0, i64 0, i64 0]
-!CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [9 x i64] [i64 32, i64 281474976710661, i64 0, i64 281474976710661, i64 3, i64 281474976710659, i64 16384, i64 16384, i64 288]
+!CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [9 x i64] [i64 33, i64 281474976710661, i64 0, i64 281474976710661, i64 3, i64 281474976710659, i64 16384, i64 16384, i64 288]
subroutine mapType_alloca_nested_derived_type()
type :: middle_layer
real(4) :: i
diff --git a/flang/test/Lower/OpenMP/default-mapper-no-pointer-map.f90 b/flang/test/Lower/OpenMP/default-mapper-no-pointer-map.f90
index 822187082fe51..3eea0085ad0a0 100644
--- a/flang/test/Lower/OpenMP/default-mapper-no-pointer-map.f90
+++ b/flang/test/Lower/OpenMP/default-mapper-no-pointer-map.f90
@@ -38,35 +38,32 @@ program test_default_mapper_no_pointer_map
end program test_default_mapper_no_pointer_map
+! The implicit default mapper transfers the record's flat storage (trivial
+! members and descriptor bytes) via a single contiguous to/from parent map, and
+! only emits ref_ptee (pointee + attach) entries for allocatable components.
+! Trivial members (leaf_val, val, id) and pointer components get no member map.
+
! CHECK-LABEL: omp.declare_mapper @{{.*}}leaf_type_omp_default_mapper : !fir.type<_QFTleaf_type{
-! CHECK: %[[LEAF_VAL:.*]] = omp.map.info var_ptr(%{{.*}} : !fir.ref<i32>, i32){{.*}}map_clauses(implicit, tofrom)
-! CHECK: %[[LEAF_ARR_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom){{.*}}-> !fir.llvm_ptr
-! CHECK: %[[LEAF_ARR_DESC:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(always, implicit, to)
-! CHECK: %[[LEAF_ARR_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptr, ref_ptee)
-! CHECK: %[[LEAF_PARENT:.*]] = omp.map.info var_ptr({{.*}}!fir.type<_QFTleaf_type{{.*}}>){{.*}}members(%[[LEAF_VAL]], %[[LEAF_ARR_DESC]], %[[LEAF_ARR_DATA]] : [0], [1], [1, 0] :
-! CHECK: omp.declare_mapper.info map_entries(%[[LEAF_PARENT]], %[[LEAF_VAL]], %[[LEAF_ARR_DESC]], %[[LEAF_ARR_ATTACH]], %[[LEAF_ARR_DATA]] :
+! CHECK: %[[LEAF_ARR_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom, ref_ptee){{.*}}-> !fir.llvm_ptr
+! CHECK: %[[LEAF_ARR_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptee)
+! CHECK: %[[LEAF_PARENT:.*]] = omp.map.info var_ptr({{.*}}!fir.type<_QFTleaf_type{{.*}}>){{.*}}map_clauses(implicit, tofrom){{.*}}members(%[[LEAF_ARR_DATA]] : [1] :
+! CHECK: omp.declare_mapper.info map_entries(%[[LEAF_PARENT]], %[[LEAF_ARR_DATA]], %[[LEAF_ARR_ATTACH]] :
! CHECK-LABEL: omp.declare_mapper @{{.*}}inner_type_omp_default_mapper : !fir.type<_QFTinner_type{
-! CHECK: %[[INNER_VAL:.*]] = omp.map.info var_ptr(%{{.*}} : !fir.ref<i32>, i32){{.*}}map_clauses(implicit, tofrom)
-! CHECK: %[[INNER_ARR_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom){{.*}}name(""){{.*}}-> !fir.llvm_ptr
-! CHECK: %[[INNER_ARR_DESC:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(always, implicit, to){{.*}}name("")
-! CHECK: %[[INNER_ARR_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptr, ref_ptee){{.*}}name("")
-! CHECK: %[[INNER_ALLOC_LEAF_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom){{.*}}mapper(@{{.*}}leaf_type_omp_default_mapper){{.*}}-> !fir.llvm_ptr
-! CHECK: %[[INNER_ALLOC_LEAF_DESC:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(always, implicit, to){{.*}}name("")
-! CHECK: %[[INNER_ALLOC_LEAF_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptr, ref_ptee){{.*}}name("")
-! CHECK: %[[INNER_PARENT:.*]] = omp.map.info var_ptr({{.*}}!fir.type<_QFTinner_type{{.*}}>){{.*}}members(%[[INNER_VAL]], %[[INNER_ARR_DESC]], %[[INNER_ARR_DATA]], %[[INNER_ALLOC_LEAF_DESC]], %[[INNER_ALLOC_LEAF_DATA]] : [0], [1], [1, 0], [3], [3, 0] :
-! CHECK: omp.declare_mapper.info map_entries(%[[INNER_PARENT]], %[[INNER_VAL]], %[[INNER_ARR_DESC]], %[[INNER_ALLOC_LEAF_DESC]], %[[INNER_ARR_ATTACH]], %[[INNER_ALLOC_LEAF_ATTACH]], %[[INNER_ARR_DATA]], %[[INNER_ALLOC_LEAF_DATA]] :
+! CHECK: %[[INNER_ARR_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom, ref_ptee){{.*}}name(""){{.*}}-> !fir.llvm_ptr
+! CHECK: %[[INNER_ARR_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptee){{.*}}name("")
+! CHECK: %[[INNER_ALLOC_LEAF_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom, ref_ptee){{.*}}mapper(@{{.*}}leaf_type_omp_default_mapper){{.*}}name("")
+! CHECK: %[[INNER_ALLOC_LEAF_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptee){{.*}}name("")
+! CHECK: %[[INNER_PARENT:.*]] = omp.map.info var_ptr({{.*}}!fir.type<_QFTinner_type{{.*}}>){{.*}}map_clauses(implicit, tofrom){{.*}}members(%[[INNER_ARR_DATA]], %[[INNER_ALLOC_LEAF_DATA]] : [1], [3] :
+! CHECK: omp.declare_mapper.info map_entries(%[[INNER_PARENT]], %[[INNER_ARR_DATA]], %[[INNER_ALLOC_LEAF_DATA]], %[[INNER_ARR_ATTACH]], %[[INNER_ALLOC_LEAF_ATTACH]] :
! CHECK-LABEL: omp.declare_mapper @{{.*}}outer_type_omp_default_mapper : !fir.type<_QFTouter_type{
-! CHECK: %[[OUTER_ID:.*]] = omp.map.info var_ptr(%{{.*}} : !fir.ref<i32>, i32){{.*}}map_clauses(implicit, tofrom)
-! CHECK: %[[OUTER_ALLOC_INNER_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom){{.*}}mapper(@{{.*}}inner_type_omp_default_mapper){{.*}}-> !fir.llvm_ptr
-! CHECK: %[[OUTER_ALLOC_INNER_DESC:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(always, implicit, to){{.*}}name("")
-! CHECK: %[[OUTER_ALLOC_INNER_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptr, ref_ptee){{.*}}name("")
-! CHECK: %[[OUTER_ALLOC_ARR_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom){{.*}}name(""){{.*}}-> !fir.llvm_ptr
-! CHECK: %[[OUTER_ALLOC_ARR_DESC:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(always, implicit, to){{.*}}name("")
-! CHECK: %[[OUTER_ALLOC_ARR_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptr, ref_ptee){{.*}}name("")
-! CHECK: %[[OUTER_PARENT:.*]] = omp.map.info var_ptr({{.*}}!fir.type<_QFTouter_type{{.*}}>){{.*}}members(%[[OUTER_ID]], %[[OUTER_ALLOC_INNER_DESC]], %[[OUTER_ALLOC_INNER_DATA]], %[[OUTER_ALLOC_ARR_DESC]], %[[OUTER_ALLOC_ARR_DATA]] : [0], [1], [1, 0], [3], [3, 0] :
-! CHECK: omp.declare_mapper.info map_entries(%[[OUTER_PARENT]], %[[OUTER_ID]], %[[OUTER_ALLOC_INNER_DESC]], %[[OUTER_ALLOC_ARR_DESC]], %[[OUTER_ALLOC_INNER_ATTACH]], %[[OUTER_ALLOC_ARR_ATTACH]], %[[OUTER_ALLOC_INNER_DATA]], %[[OUTER_ALLOC_ARR_DATA]] :
+! CHECK: %[[OUTER_ALLOC_INNER_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom, ref_ptee){{.*}}mapper(@{{.*}}inner_type_omp_default_mapper){{.*}}name("")
+! CHECK: %[[OUTER_ALLOC_INNER_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptee){{.*}}name("")
+! CHECK: %[[OUTER_ALLOC_ARR_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom, ref_ptee){{.*}}name(""){{.*}}-> !fir.llvm_ptr
+! CHECK: %[[OUTER_ALLOC_ARR_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptee){{.*}}name("")
+! CHECK: %[[OUTER_PARENT:.*]] = omp.map.info var_ptr({{.*}}!fir.type<_QFTouter_type{{.*}}>){{.*}}map_clauses(implicit, tofrom){{.*}}members(%[[OUTER_ALLOC_INNER_DATA]], %[[OUTER_ALLOC_ARR_DATA]] : [1], [3] :
+! CHECK: omp.declare_mapper.info map_entries(%[[OUTER_PARENT]], %[[OUTER_ALLOC_INNER_DATA]], %[[OUTER_ALLOC_ARR_DATA]], %[[OUTER_ALLOC_INNER_ATTACH]], %[[OUTER_ALLOC_ARR_ATTACH]] :
! CHECK-LABEL: func.func @_QQmain
! CHECK: %[[PTR_SCALAR_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(tofrom){{.*}}-> !fir.llvm_ptr
diff --git a/flang/test/Lower/OpenMP/implicit-default-mapper-allocatable-field.f90 b/flang/test/Lower/OpenMP/implicit-default-mapper-allocatable-field.f90
index afc7572967bdb..db3ea4368e61e 100644
--- a/flang/test/Lower/OpenMP/implicit-default-mapper-allocatable-field.f90
+++ b/flang/test/Lower/OpenMP/implicit-default-mapper-allocatable-field.f90
@@ -23,11 +23,10 @@ program p
! CHECK: %[[COORD:.*]] = fir.coordinate_of %[[DECL]]#0, a
! CHECK: %[[BOUNDS:.*]] = omp.map.bounds
! CHECK: %[[BOX_OFF:.*]] = fir.box_offset %[[COORD]] base_addr
-! CHECK: %[[MEMBER_PTR:.*]] = omp.map.info var_ptr(%[[COORD]] {{.*}}) map_clauses(implicit, tofrom) capture(ByRef) var_ptr_ptr(%[[BOX_OFF]] {{.*}}) bounds(%[[BOUNDS]]) name("")
-! CHECK: %[[DESC:.*]] = omp.map.info var_ptr(%[[COORD]] {{.*}}) map_clauses(always, implicit, to) capture(ByRef) name("")
-! CHECK: %[[ATTACH:.*]] = omp.map.info var_ptr(%[[COORD]] {{.*}}) map_clauses(attach, ref_ptr, ref_ptee) capture(ByRef) var_ptr_ptr(%[[BOX_OFF]] {{.*}}) bounds(%[[BOUNDS]]) name("")
-! CHECK: %[[PARENT:.*]] = omp.map.info var_ptr(%[[DECL]]#1 {{.*}}) map_clauses(implicit) capture(ByRef) members(%[[DESC]], %[[MEMBER_PTR]] : [0], [0, 0] {{.*}}) name("") partial_map(true)
-! CHECK: omp.declare_mapper.info map_entries(%[[PARENT]], %[[DESC]], %[[ATTACH]], %[[MEMBER_PTR]]
+! CHECK: %[[MEMBER_PTR:.*]] = omp.map.info var_ptr(%[[COORD]] {{.*}}) map_clauses(implicit, tofrom, ref_ptee) capture(ByRef) var_ptr_ptr(%[[BOX_OFF]] {{.*}}) bounds(%[[BOUNDS]]) name("")
+! CHECK: %[[ATTACH:.*]] = omp.map.info var_ptr(%[[COORD]] {{.*}}) map_clauses(attach, ref_ptee) capture(ByRef) var_ptr_ptr(%[[BOX_OFF]] {{.*}}) bounds(%[[BOUNDS]]) name("")
+! CHECK: %[[PARENT:.*]] = omp.map.info var_ptr(%[[DECL]]#1 {{.*}}) map_clauses(implicit, tofrom) capture(ByRef) members(%[[MEMBER_PTR]] : [0] {{.*}}) name("")
+! CHECK: omp.declare_mapper.info map_entries(%[[PARENT]], %[[MEMBER_PTR]], %[[ATTACH]]
! CHECK: %[[MAP:.*]] = omp.map.info var_ptr(%{{.*}} : !fir.ref<[[TYPE]]>, [[TYPE]]) map_clauses(implicit, tofrom) capture(ByRef) mapper(@[[MAPPER]]) name("x")
! CHECK: omp.target {{.*}}map_entries(%[[MAP]] -> %{{.*}} : !fir.ref<[[TYPE]]>)
diff --git a/flang/test/Lower/OpenMP/implicit-mapper-no-pointer-map.f90 b/flang/test/Lower/OpenMP/implicit-mapper-no-pointer-map.f90
index 294b84e84ce6d..f57e9c7600ac1 100644
--- a/flang/test/Lower/OpenMP/implicit-mapper-no-pointer-map.f90
+++ b/flang/test/Lower/OpenMP/implicit-mapper-no-pointer-map.f90
@@ -37,35 +37,32 @@ program test_implicit_mapper_no_pointer_map
end program test_implicit_mapper_no_pointer_map
+! The implicit default mapper transfers the record's flat storage (trivial
+! members and descriptor bytes) via a single contiguous to/from parent map, and
+! only emits ref_ptee (pointee + attach) entries for allocatable components.
+! Trivial members (leaf_val, val, id) and pointer components get no member map.
+
! CHECK-LABEL: omp.declare_mapper @{{.*}}leaf_type_omp_default_mapper : !fir.type<_QFTleaf_type{
-! CHECK: %[[LEAF_VAL:.*]] = omp.map.info var_ptr(%{{.*}} : !fir.ref<i32>, i32){{.*}}map_clauses(implicit, tofrom)
-! CHECK: %[[LEAF_ARR_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom){{.*}}-> !fir.llvm_ptr
-! CHECK: %[[LEAF_ARR_DESC:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(always, implicit, to)
-! CHECK: %[[LEAF_ARR_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptr, ref_ptee)
-! CHECK: %[[LEAF_PARENT:.*]] = omp.map.info var_ptr({{.*}}!fir.type<_QFTleaf_type{{.*}}>){{.*}}members(%[[LEAF_VAL]], %[[LEAF_ARR_DESC]], %[[LEAF_ARR_DATA]] : [0], [1], [1, 0] :
-! CHECK: omp.declare_mapper.info map_entries(%[[LEAF_PARENT]], %[[LEAF_VAL]], %[[LEAF_ARR_DESC]], %[[LEAF_ARR_ATTACH]], %[[LEAF_ARR_DATA]] :
+! CHECK: %[[LEAF_ARR_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom, ref_ptee){{.*}}-> !fir.llvm_ptr
+! CHECK: %[[LEAF_ARR_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptee)
+! CHECK: %[[LEAF_PARENT:.*]] = omp.map.info var_ptr({{.*}}!fir.type<_QFTleaf_type{{.*}}>){{.*}}map_clauses(implicit, tofrom){{.*}}members(%[[LEAF_ARR_DATA]] : [1] :
+! CHECK: omp.declare_mapper.info map_entries(%[[LEAF_PARENT]], %[[LEAF_ARR_DATA]], %[[LEAF_ARR_ATTACH]] :
! CHECK-LABEL: omp.declare_mapper @{{.*}}inner_type_omp_default_mapper : !fir.type<_QFTinner_type{
-! CHECK: %[[INNER_VAL:.*]] = omp.map.info var_ptr(%{{.*}} : !fir.ref<i32>, i32){{.*}}map_clauses(implicit, tofrom)
-! CHECK: %[[INNER_ARR_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom){{.*}}name(""){{.*}}-> !fir.llvm_ptr
-! CHECK: %[[INNER_ARR_DESC:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(always, implicit, to){{.*}}name("")
-! CHECK: %[[INNER_ARR_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptr, ref_ptee){{.*}}name("")
-! CHECK: %[[INNER_ALLOC_LEAF_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom){{.*}}mapper(@{{.*}}leaf_type_omp_default_mapper){{.*}}-> !fir.llvm_ptr
-! CHECK: %[[INNER_ALLOC_LEAF_DESC:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(always, implicit, to){{.*}}name("")
-! CHECK: %[[INNER_ALLOC_LEAF_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptr, ref_ptee){{.*}}name("")
-! CHECK: %[[INNER_PARENT:.*]] = omp.map.info var_ptr({{.*}}!fir.type<_QFTinner_type{{.*}}>){{.*}}members(%[[INNER_VAL]], %[[INNER_ARR_DESC]], %[[INNER_ARR_DATA]], %[[INNER_ALLOC_LEAF_DESC]], %[[INNER_ALLOC_LEAF_DATA]] : [0], [1], [1, 0], [3], [3, 0] :
-! CHECK: omp.declare_mapper.info map_entries(%[[INNER_PARENT]], %[[INNER_VAL]], %[[INNER_ARR_DESC]], %[[INNER_ALLOC_LEAF_DESC]], %[[INNER_ARR_ATTACH]], %[[INNER_ALLOC_LEAF_ATTACH]], %[[INNER_ARR_DATA]], %[[INNER_ALLOC_LEAF_DATA]] :
+! CHECK: %[[INNER_ARR_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom, ref_ptee){{.*}}name(""){{.*}}-> !fir.llvm_ptr
+! CHECK: %[[INNER_ARR_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptee){{.*}}name("")
+! CHECK: %[[INNER_ALLOC_LEAF_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom, ref_ptee){{.*}}mapper(@{{.*}}leaf_type_omp_default_mapper){{.*}}name("")
+! CHECK: %[[INNER_ALLOC_LEAF_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptee){{.*}}name("")
+! CHECK: %[[INNER_PARENT:.*]] = omp.map.info var_ptr({{.*}}!fir.type<_QFTinner_type{{.*}}>){{.*}}map_clauses(implicit, tofrom){{.*}}members(%[[INNER_ARR_DATA]], %[[INNER_ALLOC_LEAF_DATA]] : [1], [3] :
+! CHECK: omp.declare_mapper.info map_entries(%[[INNER_PARENT]], %[[INNER_ARR_DATA]], %[[INNER_ALLOC_LEAF_DATA]], %[[INNER_ARR_ATTACH]], %[[INNER_ALLOC_LEAF_ATTACH]] :
! CHECK-LABEL: omp.declare_mapper @{{.*}}outer_type_omp_default_mapper : !fir.type<_QFTouter_type{
-! CHECK: %[[OUTER_ID:.*]] = omp.map.info var_ptr(%{{.*}} : !fir.ref<i32>, i32){{.*}}map_clauses(implicit, tofrom)
-! CHECK: %[[OUTER_ALLOC_INNER_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom){{.*}}mapper(@{{.*}}inner_type_omp_default_mapper){{.*}}-> !fir.llvm_ptr
-! CHECK: %[[OUTER_ALLOC_INNER_DESC:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(always, implicit, to){{.*}}name("")
-! CHECK: %[[OUTER_ALLOC_INNER_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptr, ref_ptee){{.*}}name("")
-! CHECK: %[[OUTER_ALLOC_ARR_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom){{.*}}name(""){{.*}}-> !fir.llvm_ptr
-! CHECK: %[[OUTER_ALLOC_ARR_DESC:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(always, implicit, to){{.*}}name("")
-! CHECK: %[[OUTER_ALLOC_ARR_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptr, ref_ptee){{.*}}name("")
-! CHECK: %[[OUTER_PARENT:.*]] = omp.map.info var_ptr({{.*}}!fir.type<_QFTouter_type{{.*}}>){{.*}}members(%[[OUTER_ID]], %[[OUTER_ALLOC_INNER_DESC]], %[[OUTER_ALLOC_INNER_DATA]], %[[OUTER_ALLOC_ARR_DESC]], %[[OUTER_ALLOC_ARR_DATA]] : [0], [1], [1, 0], [3], [3, 0] :
-! CHECK: omp.declare_mapper.info map_entries(%[[OUTER_PARENT]], %[[OUTER_ID]], %[[OUTER_ALLOC_INNER_DESC]], %[[OUTER_ALLOC_ARR_DESC]], %[[OUTER_ALLOC_INNER_ATTACH]], %[[OUTER_ALLOC_ARR_ATTACH]], %[[OUTER_ALLOC_INNER_DATA]], %[[OUTER_ALLOC_ARR_DATA]] :
+! CHECK: %[[OUTER_ALLOC_INNER_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom, ref_ptee){{.*}}mapper(@{{.*}}inner_type_omp_default_mapper){{.*}}name("")
+! CHECK: %[[OUTER_ALLOC_INNER_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptee){{.*}}name("")
+! CHECK: %[[OUTER_ALLOC_ARR_DATA:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(implicit, tofrom, ref_ptee){{.*}}name(""){{.*}}-> !fir.llvm_ptr
+! CHECK: %[[OUTER_ALLOC_ARR_ATTACH:.*]] = omp.map.info var_ptr(%{{.*}}){{.*}}map_clauses(attach, ref_ptee){{.*}}name("")
+! CHECK: %[[OUTER_PARENT:.*]] = omp.map.info var_ptr({{.*}}!fir.type<_QFTouter_type{{.*}}>){{.*}}map_clauses(implicit, tofrom){{.*}}members(%[[OUTER_ALLOC_INNER_DATA]], %[[OUTER_ALLOC_ARR_DATA]] : [1], [3] :
+! CHECK: omp.declare_mapper.info map_entries(%[[OUTER_PARENT]], %[[OUTER_ALLOC_INNER_DATA]], %[[OUTER_ALLOC_ARR_DATA]], %[[OUTER_ALLOC_INNER_ATTACH]], %[[OUTER_ALLOC_ARR_ATTACH]] :
! CHECK-LABEL: func.func @_QQmain
! CHECK: %[[DATA_MAP:.*]] = omp.map.info var_ptr({{.*}}){{.*}}map_clauses(implicit, tofrom){{.*}}mapper(@{{.*}}outer_type_omp_default_mapper){{.*}}-> !fir.llvm_ptr
diff --git a/flang/test/Transforms/omp-map-info-finalization-usm.fir b/flang/test/Transforms/omp-map-info-finalization-usm.fir
deleted file mode 100644
index 370b536af26a4..0000000000000
--- a/flang/test/Transforms/omp-map-info-finalization-usm.fir
+++ /dev/null
@@ -1,24 +0,0 @@
-// RUN: fir-opt --split-input-file --omp-map-info-finalization %s | FileCheck %s
-
-// Test that the 'close' map flag is cleared from member maps if the parent map
-// (derived type) does not have the 'close' flag. This typically happens in
-// Unified Shared Memory (USM) mode where the parent is in USM (no close) but
-// members (like descriptors) might have been initially tagged with close.
-
-module attributes {omp.requires = #omp.clause_requires<unified_shared_memory>} {
- func.func @test_usm_close_flag_cleanup(%arg0: !fir.ref<!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) {
- %map = omp.map.info var_ptr(%arg0 : !fir.ref<!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>, !fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>) map_clauses(to) capture(ByRef) name("parent") -> !fir.ref<!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>
-
- omp.target kernel_type(generic) map_entries(%map -> %arg1 : !fir.ref<!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) {
- // Simulate usage to trigger implicit map addition
- %1 = hlfir.designate %arg1{"a"} : (!fir.ref<!fir.type<t{a:!fir.box<!fir.heap<!fir.array<?xf32>>>}>>) -> !fir.ref<!fir.box<!fir.heap<!fir.array<?xf32>>>>
- omp.terminator
- }
- return
- }
-}
-
-// CHECK-LABEL: func.func @test_usm_close_flag_cleanup
-// CHECK: %[[MEMBER:.*]] = omp.map.info {{.*}} map_clauses(always, to) {{.*}} name("parent.a.implicit_map")
-// CHECK: %[[PARENT:.*]] = omp.map.info {{.*}} map_clauses(to) {{.*}} members(%[[MEMBER]], {{.*}}) name("parent") partial_map(true)
-// CHECK-NOT: close
diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index 0ec04c0a7ab7d..e2a468718e927 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -7897,8 +7897,10 @@ static void mapParentWithMembers(
baseFlag |= (parentFlags & preserve);
} else {
MapFlags parentFlags = mapData.Types[mapDataIndex];
- MapFlags preserve =
- MapFlags::OMP_MAP_PRESENT | MapFlags::OMP_MAP_RETURN_PARAM;
+ MapFlags preserve = MapFlags::OMP_MAP_TO | MapFlags::OMP_MAP_FROM |
+ MapFlags::OMP_MAP_PRESENT |
+ MapFlags::OMP_MAP_RETURN_PARAM |
+ MapFlags::OMP_MAP_IMPLICIT;
baseFlag |= (parentFlags & preserve);
}
diff --git a/mlir/test/Target/LLVMIR/omptarget-host-ref-semantics.mlir b/mlir/test/Target/LLVMIR/omptarget-host-ref-semantics.mlir
index d76fc096791ef..76ab1ff96ed9b 100644
--- a/mlir/test/Target/LLVMIR/omptarget-host-ref-semantics.mlir
+++ b/mlir/test/Target/LLVMIR/omptarget-host-ref-semantics.mlir
@@ -71,14 +71,14 @@ module attributes {omp.is_gpu = false, omp.is_target_device = false, omp.require
}
}
-// CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [5 x i64] [i64 32, i64 281474976710661, i64 3, i64 16388, i64 288]
-// CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [4 x i64] [i64 32, i64 281474976710661, i64 3, i64 288]
-// CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [5 x i64] [i64 32, i64 281474976710661, i64 3, i64 16384, i64 288]
-// CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [5 x i64] [i64 32, i64 281474976710657, i64 1, i64 16384, i64 288]
+// CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [5 x i64] [i64 33, i64 281474976710661, i64 3, i64 16388, i64 288]
+// CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [4 x i64] [i64 33, i64 281474976710661, i64 3, i64 288]
+// CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [5 x i64] [i64 33, i64 281474976710661, i64 3, i64 16384, i64 288]
+// CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [5 x i64] [i64 33, i64 281474976710657, i64 1, i64 16384, i64 288]
// CHECK: @.offload_sizes{{.*}} = private unnamed_addr constant [3 x i64] [i64 0, i64 24, i64 0]
// CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [3 x i64] [i64 16384, i64 33, i64 288]
// CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [3 x i64] [i64 16384, i64 33, i64 288]
-// CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [4 x i64] [i64 32, i64 281474976710657, i64 1, i64 288]
+// CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [4 x i64] [i64 33, i64 281474976710657, i64 1, i64 288]
// CHECK: define void @attach_always_(ptr %[[ARG0:.*]], ptr %[[ARG1:.*]])
// CHECK: %[[VAL_0:.*]] = load ptr, ptr %[[ARG1]], align 8
diff --git a/mlir/test/Target/LLVMIR/omptarget-nested-ptr-record-type-mapping-host.mlir b/mlir/test/Target/LLVMIR/omptarget-nested-ptr-record-type-mapping-host.mlir
index 8de8effd40c8d..82ed7872e29b0 100644
--- a/mlir/test/Target/LLVMIR/omptarget-nested-ptr-record-type-mapping-host.mlir
+++ b/mlir/test/Target/LLVMIR/omptarget-nested-ptr-record-type-mapping-host.mlir
@@ -28,7 +28,7 @@ module attributes {omp.is_target_device = false, omp.target_triples = ["amdgcn-a
}
// CHECK: @.offload_sizes{{.*}} = private unnamed_addr constant [4 x i64] [i64 0, i64 48, i64 0, i64 0]
-// CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [4 x i64] [i64 32, i64 281474976710659, i64 3, i64 288]
+// CHECK: @.offload_maptypes{{.*}} = private unnamed_addr constant [4 x i64] [i64 35, i64 281474976710659, i64 3, i64 288]
// CHECK: define void @omp_nested_derived_type_alloca_map(ptr %[[ARG:.*]]) {
diff --git a/mlir/test/Target/LLVMIR/omptarget-nested-record-type-mapping-host.mlir b/mlir/test/Target/LLVMIR/omptarget-nested-record-type-mapping-host.mlir
index fa6bc23be5ffd..50073748f195e 100644
--- a/mlir/test/Target/LLVMIR/omptarget-nested-record-type-mapping-host.mlir
+++ b/mlir/test/Target/LLVMIR/omptarget-nested-record-type-mapping-host.mlir
@@ -30,7 +30,7 @@ llvm.func @_QQmain() {
}
// CHECK: @.offload_sizes = private unnamed_addr constant [5 x i64] [i64 0, i64 4, i64 4, i64 16, i64 0]
-// CHECK: @.offload_maptypes = private unnamed_addr constant [5 x i64] [i64 32, i64 281474976710659, i64 281474976710659, i64 281474976710659, i64 288]
+// CHECK: @.offload_maptypes = private unnamed_addr constant [5 x i64] [i64 35, i64 281474976710659, i64 281474976710659, i64 281474976710659, i64 288]
// CHECK: define void @_QQmain()
// CHECK: %[[ALLOCA:.*]] = alloca { float, [10 x i32], { float, i32 }, i32 }, i64 1, align 8
diff --git a/mlir/test/Target/LLVMIR/omptarget-overlapping-record-member-map.mlir b/mlir/test/Target/LLVMIR/omptarget-overlapping-record-member-map.mlir
index 12432c273759b..d5a806c2b12da 100644
--- a/mlir/test/Target/LLVMIR/omptarget-overlapping-record-member-map.mlir
+++ b/mlir/test/Target/LLVMIR/omptarget-overlapping-record-member-map.mlir
@@ -15,7 +15,7 @@ module attributes {llvm.target_triple = "x86_64-unknown-linux-gnu", omp.is_gpu =
}
// CHECK: @.offload_sizes = private unnamed_addr constant [4 x i64] [i64 0, i64 8, i64 4, i64 0]
-// CHECK: @.offload_maptypes = private unnamed_addr constant [4 x i64] [i64 32, i64 281474976710657, i64 281474976710659, i64 288]
+// CHECK: @.offload_maptypes = private unnamed_addr constant [4 x i64] [i64 33, i64 281474976710657, i64 281474976710659, i64 288]
// CHECK: %[[ALLOCA:.*]] = alloca %_QFTdtype, i64 1, align 8
// CHECK: %[[ELEMENT_ACC:.*]] = getelementptr %_QFTdtype, ptr %[[ALLOCA]], i32 0, i32 1
diff --git a/mlir/test/Target/LLVMIR/omptarget-record-type-mapping-host.mlir b/mlir/test/Target/LLVMIR/omptarget-record-type-mapping-host.mlir
index ab77249730d04..4df912e1284c7 100644
--- a/mlir/test/Target/LLVMIR/omptarget-record-type-mapping-host.mlir
+++ b/mlir/test/Target/LLVMIR/omptarget-record-type-mapping-host.mlir
@@ -29,7 +29,7 @@ llvm.func @_QQmain() {
}
// CHECK: @.offload_sizes = private unnamed_addr constant [4 x i64] [i64 0, i64 4, i64 16, i64 0]
-// CHECK: @.offload_maptypes = private unnamed_addr constant [4 x i64] [i64 32, i64 281474976710659, i64 281474976710659, i64 288]
+// CHECK: @.offload_maptypes = private unnamed_addr constant [4 x i64] [i64 35, i64 281474976710659, i64 281474976710659, i64 288]
// CHECK: define void @_QQmain()
// CHECK: %[[ALLOCA:.*]] = alloca { float, [10 x i32], i32 }, i64 1, align 8
diff --git a/mlir/test/Target/LLVMIR/omptarget-record-type-with-ptr-member-host.mlir b/mlir/test/Target/LLVMIR/omptarget-record-type-with-ptr-member-host.mlir
index b7a654cea9dc3..c338761da3989 100644
--- a/mlir/test/Target/LLVMIR/omptarget-record-type-with-ptr-member-host.mlir
+++ b/mlir/test/Target/LLVMIR/omptarget-record-type-with-ptr-member-host.mlir
@@ -59,7 +59,7 @@ module attributes {omp.is_target_device = false, omp.target_triples = ["amdgcn-a
// CHECK: @[[FULL_ARR_GLOB:.*]] = internal global { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] } undef
// CHECK: @[[ARR_SECT_GLOB:.*]] = internal global { ptr, i64, i32, i8, i8, i8, i8, [1 x [3 x i64]] } undef
-// CHECK: @.offload_maptypes = private unnamed_addr constant [10 x i64] [i64 32, i64 281474976710659, i64 3, i64 32, i64 1125899906842627, i64 3, i64 32, i64 1970324836974595, i64 3, i64 288]
+// CHECK: @.offload_maptypes = private unnamed_addr constant [10 x i64] [i64 35, i64 281474976710659, i64 3, i64 35, i64 1125899906842627, i64 3, i64 35, i64 1970324836974595, i64 3, i64 288]
// CHECK: define void @main()
// CHECK: %[[SCALAR_ALLOCA:.*]] = alloca { ptr, i64, i32, i8, i8, i8, i8 }, i64 1, align 8
More information about the flang-commits
mailing list