[flang-commits] [flang] [OpenMP][Flang] Emit default declare mappers implicitly for derived types (PR #140562)
Akash Banerjee via flang-commits
flang-commits at lists.llvm.org
Fri Jul 4 08:40:14 PDT 2025
https://github.com/TIFitis updated https://github.com/llvm/llvm-project/pull/140562
>From 74b5144ab52d8bbf03e21754ddc4fb1676f84358 Mon Sep 17 00:00:00 2001
From: Akash Banerjee <Akash.Banerjee at amd.com>
Date: Thu, 8 May 2025 21:19:26 +0100
Subject: [PATCH 1/3] [OpenMP][Flang] Emit default declare mappers implicitly
for derived types
This patch adds support to emit default declare mappers for implicit mapping of derived types when not supplied by user. This especially helps tackle mapping of allocatables of derived types.
This supports nested derived types as well.
---
flang/lib/Lower/OpenMP/ClauseProcessor.cpp | 38 ++---
flang/lib/Lower/OpenMP/OpenMP.cpp | 132 +++++++++++++++++-
.../Optimizer/OpenMP/MapInfoFinalization.cpp | 2 +-
flang/test/Lower/OpenMP/derived-type-map.f90 | 22 ++-
4 files changed, 174 insertions(+), 20 deletions(-)
diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
index 7bea427099a28..f534e37de32c2 100644
--- a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
+++ b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
@@ -1167,24 +1167,28 @@ void ClauseProcessor::processMapObjects(
auto getDefaultMapperID = [&](const omp::Object &object,
std::string &mapperIdName) {
- if (!mlir::isa<mlir::omp::DeclareMapperOp>(
- firOpBuilder.getRegion().getParentOp())) {
- const semantics::DerivedTypeSpec *typeSpec = nullptr;
-
- if (object.sym()->owner().IsDerivedType())
- typeSpec = object.sym()->owner().derivedTypeSpec();
- else if (object.sym()->GetType() &&
- object.sym()->GetType()->category() ==
- semantics::DeclTypeSpec::TypeDerived)
- typeSpec = &object.sym()->GetType()->derivedTypeSpec();
-
- if (typeSpec) {
- mapperIdName =
- typeSpec->name().ToString() + llvm::omp::OmpDefaultMapperName;
- if (auto *sym = converter.getCurrentScope().FindSymbol(mapperIdName))
- mapperIdName = converter.mangleName(mapperIdName, sym->owner());
- }
+ const semantics::DerivedTypeSpec *typeSpec = nullptr;
+
+ if (object.sym()->GetType() && object.sym()->GetType()->category() ==
+ semantics::DeclTypeSpec::TypeDerived)
+ typeSpec = &object.sym()->GetType()->derivedTypeSpec();
+ else if (object.sym()->owner().IsDerivedType())
+ typeSpec = object.sym()->owner().derivedTypeSpec();
+
+ if (typeSpec) {
+ mapperIdName =
+ typeSpec->name().ToString() + llvm::omp::OmpDefaultMapperName;
+ if (auto *sym = converter.getCurrentScope().FindSymbol(mapperIdName))
+ mapperIdName = converter.mangleName(mapperIdName, sym->owner());
}
+
+ // Make sure we don't return a mapper to self
+ llvm::StringRef parentOpName;
+ if (auto declMapOp = mlir::dyn_cast<mlir::omp::DeclareMapperOp>(
+ firOpBuilder.getRegion().getParentOp()))
+ parentOpName = declMapOp.getSymName();
+ if (mapperIdName == parentOpName)
+ mapperIdName = "";
};
// Create the mapper symbol from its name, if specified.
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index 0a56e888ac44b..9ccccb96f7513 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -2391,6 +2391,124 @@ genSingleOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
queue, item, clauseOps);
}
+static mlir::FlatSymbolRefAttr
+genImplicitDefaultDeclareMapper(lower::AbstractConverter &converter,
+ mlir::Location loc, fir::RecordType recordType,
+ llvm::StringRef mapperNameStr) {
+ fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
+ lower::StatementContext stmtCtx;
+
+ // Save current insertion point before moving to the module scope to create
+ // the DeclareMapperOp
+ mlir::OpBuilder::InsertionGuard guard(firOpBuilder);
+
+ firOpBuilder.setInsertionPointToStart(converter.getModuleOp().getBody());
+ auto declMapperOp = firOpBuilder.create<mlir::omp::DeclareMapperOp>(
+ loc, mapperNameStr, recordType);
+ auto ®ion = declMapperOp.getRegion();
+ firOpBuilder.createBlock(®ion);
+ auto mapperArg = region.addArgument(firOpBuilder.getRefType(recordType), loc);
+
+ auto declareOp =
+ firOpBuilder.create<hlfir::DeclareOp>(loc, mapperArg, /*uniq_name=*/"");
+
+ const auto genBoundsOps = [&](mlir::Value mapVal,
+ llvm::SmallVectorImpl<mlir::Value> &bounds) {
+ fir::ExtendedValue extVal =
+ hlfir::translateToExtendedValue(mapVal.getLoc(), firOpBuilder,
+ hlfir::Entity{mapVal},
+ /*contiguousHint=*/true)
+ .first;
+ fir::factory::AddrAndBoundsInfo info = fir::factory::getDataOperandBaseAddr(
+ firOpBuilder, mapVal, /*isOptional=*/false, mapVal.getLoc());
+ bounds = fir::factory::genImplicitBoundsOps<mlir::omp::MapBoundsOp,
+ mlir::omp::MapBoundsType>(
+ firOpBuilder, info, extVal,
+ /*dataExvIsAssumedSize=*/false, mapVal.getLoc());
+ };
+
+ // Return a reference to the contents of a derived type with one field.
+ // Also return the field type.
+ const auto getFieldRef =
+ [&](mlir::Value rec,
+ unsigned index) -> std::tuple<mlir::Value, mlir::Type> {
+ auto recType = mlir::dyn_cast<fir::RecordType>(
+ fir::unwrapPassByRefType(rec.getType()));
+ auto [fieldName, fieldTy] = recType.getTypeList()[index];
+ mlir::Value field = firOpBuilder.create<fir::FieldIndexOp>(
+ loc, fir::FieldType::get(recType.getContext()), fieldName, recType,
+ fir::getTypeParams(rec));
+ return {firOpBuilder.create<fir::CoordinateOp>(
+ loc, firOpBuilder.getRefType(fieldTy), rec, field),
+ fieldTy};
+ };
+
+ mlir::omp::DeclareMapperInfoOperands clauseOps;
+ llvm::SmallVector<llvm::SmallVector<int64_t>> memberPlacementIndices;
+ llvm::SmallVector<mlir::Value> memberMapOps;
+
+ llvm::omp::OpenMPOffloadMappingFlags mapFlag =
+ llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO |
+ llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_FROM |
+ llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_IMPLICIT;
+ mlir::omp::VariableCaptureKind captureKind =
+ mlir::omp::VariableCaptureKind::ByRef;
+ int64_t index = 0;
+
+ // Populate the declareMapper region with the map information.
+ for (const auto &[memberName, memberType] :
+ mlir::dyn_cast<fir::RecordType>(recordType).getTypeList()) {
+ auto [ref, type] = getFieldRef(declareOp.getBase(), index);
+ mlir::FlatSymbolRefAttr mapperId;
+ if (auto recType = mlir::dyn_cast<fir::RecordType>(memberType)) {
+ std::string mapperIdName =
+ recType.getName().str() + ".omp.default.mapper";
+ if (auto *sym = converter.getCurrentScope().FindSymbol(mapperIdName))
+ mapperIdName = converter.mangleName(mapperIdName, sym->owner());
+ else if (auto *sym = converter.getCurrentScope().FindSymbol(memberName))
+ mapperIdName = converter.mangleName(mapperIdName, sym->owner());
+
+ if (converter.getModuleOp().lookupSymbol(mapperIdName))
+ mapperId = mlir::FlatSymbolRefAttr::get(&converter.getMLIRContext(),
+ mapperIdName);
+ else
+ mapperId = genImplicitDefaultDeclareMapper(converter, loc, recType,
+ mapperIdName);
+ }
+
+ llvm::SmallVector<mlir::Value> bounds;
+ genBoundsOps(ref, bounds);
+ mlir::Value mapOp = createMapInfoOp(
+ firOpBuilder, loc, ref, /*varPtrPtr=*/mlir::Value{}, "", bounds,
+ /*members=*/{},
+ /*membersIndex=*/mlir::ArrayAttr{},
+ static_cast<
+ std::underlying_type_t<llvm::omp::OpenMPOffloadMappingFlags>>(
+ mapFlag),
+ captureKind, ref.getType(), /*partialMap=*/false, mapperId);
+ memberMapOps.emplace_back(mapOp);
+ memberPlacementIndices.emplace_back(llvm::SmallVector<int64_t>{index++});
+ }
+
+ llvm::SmallVector<mlir::Value> bounds;
+ genBoundsOps(declareOp.getOriginalBase(), bounds);
+ mlir::omp::MapInfoOp mapOp = createMapInfoOp(
+ firOpBuilder, loc, declareOp.getOriginalBase(),
+ /*varPtrPtr=*/mlir::Value(), /*name=*/"", bounds, memberMapOps,
+ firOpBuilder.create2DI64ArrayAttr(memberPlacementIndices),
+ static_cast<std::underlying_type_t<llvm::omp::OpenMPOffloadMappingFlags>>(
+ mapFlag),
+ captureKind, declareOp.getType(0),
+ /*partialMap=*/true);
+
+ clauseOps.mapVars.emplace_back(mapOp);
+
+ firOpBuilder.create<mlir::omp::DeclareMapperInfoOp>(loc, clauseOps.mapVars);
+ // declMapperOp->dumpPretty();
+ return mlir::FlatSymbolRefAttr::get(&converter.getMLIRContext(),
+ mapperNameStr);
+}
+
static mlir::omp::TargetOp
genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
lower::StatementContext &stmtCtx,
@@ -2467,15 +2585,26 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
name << sym.name().ToString();
mlir::FlatSymbolRefAttr mapperId;
- if (sym.GetType()->category() == semantics::DeclTypeSpec::TypeDerived) {
+ if (sym.GetType()->category() == semantics::DeclTypeSpec::TypeDerived &&
+ defaultMaps.empty()) {
auto &typeSpec = sym.GetType()->derivedTypeSpec();
std::string mapperIdName =
typeSpec.name().ToString() + llvm::omp::OmpDefaultMapperName;
if (auto *sym = converter.getCurrentScope().FindSymbol(mapperIdName))
mapperIdName = converter.mangleName(mapperIdName, sym->owner());
+ else
+ mapperIdName =
+ converter.mangleName(mapperIdName, *typeSpec.GetScope());
+
if (converter.getModuleOp().lookupSymbol(mapperIdName))
mapperId = mlir::FlatSymbolRefAttr::get(&converter.getMLIRContext(),
mapperIdName);
+ else
+ mapperId = genImplicitDefaultDeclareMapper(
+ converter, loc,
+ mlir::cast<fir::RecordType>(
+ converter.genType(sym.GetType()->derivedTypeSpec())),
+ mapperIdName);
}
fir::factory::AddrAndBoundsInfo info =
@@ -3442,6 +3571,7 @@ genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
ClauseProcessor cp(converter, semaCtx, clauses);
cp.processMap(loc, stmtCtx, clauseOps);
firOpBuilder.create<mlir::omp::DeclareMapperInfoOp>(loc, clauseOps.mapVars);
+ // declMapperOp->dumpPretty();
}
static void
diff --git a/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp b/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp
index f052cf8d22d1e..2a11aff4befc0 100644
--- a/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp
+++ b/flang/lib/Optimizer/OpenMP/MapInfoFinalization.cpp
@@ -433,7 +433,7 @@ class MapInfoFinalizationPass
getDescriptorMapType(mapType, target)),
op.getMapCaptureTypeAttr(), /*varPtrPtr=*/mlir::Value{}, newMembers,
newMembersAttr, /*bounds=*/mlir::SmallVector<mlir::Value>{},
- /*mapperId*/ mlir::FlatSymbolRefAttr(), op.getNameAttr(),
+ op.getMapperIdAttr(), op.getNameAttr(),
/*partial_map=*/builder.getBoolAttr(false));
op.replaceAllUsesWith(newDescParentMapOp.getResult());
op->erase();
diff --git a/flang/test/Lower/OpenMP/derived-type-map.f90 b/flang/test/Lower/OpenMP/derived-type-map.f90
index 279cddec51fcf..1dd73229d8251 100644
--- a/flang/test/Lower/OpenMP/derived-type-map.f90
+++ b/flang/test/Lower/OpenMP/derived-type-map.f90
@@ -1,9 +1,11 @@
!RUN: %flang_fc1 -emit-hlfir -fopenmp %s -o - | FileCheck %s
+!CHECK: omp.declare_mapper @[[MAPPER1:_QQFmaptype_derived_implicit_allocatablescalar_and_array.omp.default.mapper]] : !fir.type<_QFmaptype_derived_implicit_allocatableTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}> {
+!CHECK: omp.declare_mapper @[[MAPPER2:_QQFmaptype_derived_implicitscalar_and_array.omp.default.mapper]] : !fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}> {
!CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}> {bindc_name = "scalar_arr", uniq_name = "_QFmaptype_derived_implicitEscalar_arr"}
!CHECK: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]] {uniq_name = "_QFmaptype_derived_implicitEscalar_arr"} : (!fir.ref<!fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>) -> (!fir.ref<!fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>, !fir.ref<!fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>)
-!CHECK: %[[MAP:.*]] = omp.map.info var_ptr(%[[DECLARE]]#1 : !fir.ref<!fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>, !fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>) map_clauses(implicit, tofrom) capture(ByRef) -> !fir.ref<!fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>> {name = "scalar_arr"}
+!CHECK: %[[MAP:.*]] = omp.map.info var_ptr(%[[DECLARE]]#1 : !fir.ref<!fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>, !fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>) map_clauses(implicit, tofrom) capture(ByRef) mapper(@[[MAPPER2]]) -> !fir.ref<!fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>> {name = "scalar_arr"}
!CHECK: omp.target map_entries(%[[MAP]] -> %[[ARG0:.*]] : !fir.ref<!fir.type<_QFmaptype_derived_implicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>) {
subroutine mapType_derived_implicit
type :: scalar_and_array
@@ -18,6 +20,24 @@ subroutine mapType_derived_implicit
!$omp end target
end subroutine mapType_derived_implicit
+!CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.box<!fir.heap<!fir.type<_QFmaptype_derived_implicit_allocatableTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>> {bindc_name = "scalar_arr", uniq_name = "_QFmaptype_derived_implicit_allocatableEscalar_arr"}
+!CHECK: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]] {fortran_attrs = #fir.var_attrs<allocatable>, uniq_name = "_QFmaptype_derived_implicit_allocatableEscalar_arr"} : {{.*}}
+!CHECK: %[[MAP:.*]] = omp.map.info var_ptr(%[[DECLARE]]#1 : {{.*}}) map_clauses(implicit, to) capture(ByRef) mapper(@[[MAPPER1]])
+!CHECK: omp.target map_entries(%[[MAP]] -> %[[ARG0:.*]] : !fir.ref<!fir.box<!fir.heap<!fir.type<_QFmaptype_derived_implicit_allocatableTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>>>, !fir.llvm_ptr<!fir.ref<!fir.type<_QFmaptype_derived_implicit_allocatableTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>>) {
+subroutine mapType_derived_implicit_allocatable
+ type :: scalar_and_array
+ real(4) :: real
+ integer(4) :: array(10)
+ integer(4) :: int
+ end type scalar_and_array
+ type(scalar_and_array), allocatable :: scalar_arr
+
+ allocate (scalar_arr)
+ !$omp target
+ scalar_arr%int = 1
+ !$omp end target
+end subroutine mapType_derived_implicit_allocatable
+
!CHECK: %[[ALLOCA:.*]] = fir.alloca !fir.type<_QFmaptype_derived_explicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}> {bindc_name = "scalar_arr", uniq_name = "_QFmaptype_derived_explicitEscalar_arr"}
!CHECK: %[[DECLARE:.*]]:2 = hlfir.declare %[[ALLOCA]] {uniq_name = "_QFmaptype_derived_explicitEscalar_arr"} : (!fir.ref<!fir.type<_QFmaptype_derived_explicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>) -> (!fir.ref<!fir.type<_QFmaptype_derived_explicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>, !fir.ref<!fir.type<_QFmaptype_derived_explicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>)
!CHECK: %[[MAP:.*]] = omp.map.info var_ptr(%[[DECLARE]]#1 : !fir.ref<!fir.type<_QFmaptype_derived_explicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>>, !fir.type<_QFmaptype_derived_explicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>) map_clauses(tofrom) capture(ByRef) -> !fir.ref<!fir.type<_QFmaptype_derived_explicitTscalar_and_array{real:f32,array:!fir.array<10xi32>,int:i32}>> {name = "scalar_arr"}
>From 138250f6eed33a589541c60c5290ea2b183c60c6 Mon Sep 17 00:00:00 2001
From: Akash Banerjee <Akash.Banerjee at amd.com>
Date: Wed, 21 May 2025 16:48:27 +0100
Subject: [PATCH 2/3] Minor cleanup.
---
flang/lib/Lower/OpenMP/ClauseProcessor.cpp | 33 +++++++++++++---------
flang/lib/Lower/OpenMP/OpenMP.cpp | 3 --
2 files changed, 20 insertions(+), 16 deletions(-)
diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
index f534e37de32c2..f0a90887eeeec 100644
--- a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
+++ b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
@@ -1167,19 +1167,26 @@ void ClauseProcessor::processMapObjects(
auto getDefaultMapperID = [&](const omp::Object &object,
std::string &mapperIdName) {
- const semantics::DerivedTypeSpec *typeSpec = nullptr;
-
- if (object.sym()->GetType() && object.sym()->GetType()->category() ==
- semantics::DeclTypeSpec::TypeDerived)
- typeSpec = &object.sym()->GetType()->derivedTypeSpec();
- else if (object.sym()->owner().IsDerivedType())
- typeSpec = object.sym()->owner().derivedTypeSpec();
-
- if (typeSpec) {
- mapperIdName =
- typeSpec->name().ToString() + llvm::omp::OmpDefaultMapperName;
- if (auto *sym = converter.getCurrentScope().FindSymbol(mapperIdName))
- mapperIdName = converter.mangleName(mapperIdName, sym->owner());
+ if (!mlir::isa<mlir::omp::DeclareMapperOp>(
+ firOpBuilder.getRegion().getParentOp())) {
+ const semantics::DerivedTypeSpec *typeSpec = nullptr;
+
+ if (object.sym()->owner().IsDerivedType())
+ typeSpec = object.sym()->owner().derivedTypeSpec();
+ else if (object.sym()->GetType() &&
+ object.sym()->GetType()->category() ==
+ semantics::DeclTypeSpec::TypeDerived)
+ typeSpec = &object.sym()->GetType()->derivedTypeSpec();
+
+ if (typeSpec) {
+ mapperIdName =
+ typeSpec->name().ToString() + llvm::omp::OmpDefaultMapperName;
+ if (auto *sym = converter.getCurrentScope().FindSymbol(mapperIdName))
+ mapperIdName = converter.mangleName(mapperIdName, sym->owner());
+ else
+ mapperIdName =
+ converter.mangleName(mapperIdName, *typeSpec->GetScope());
+ }
}
// Make sure we don't return a mapper to self
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index 9ccccb96f7513..9f5bb017a3e74 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -2396,7 +2396,6 @@ genImplicitDefaultDeclareMapper(lower::AbstractConverter &converter,
mlir::Location loc, fir::RecordType recordType,
llvm::StringRef mapperNameStr) {
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
- lower::StatementContext stmtCtx;
// Save current insertion point before moving to the module scope to create
// the DeclareMapperOp
@@ -2504,7 +2503,6 @@ genImplicitDefaultDeclareMapper(lower::AbstractConverter &converter,
clauseOps.mapVars.emplace_back(mapOp);
firOpBuilder.create<mlir::omp::DeclareMapperInfoOp>(loc, clauseOps.mapVars);
- // declMapperOp->dumpPretty();
return mlir::FlatSymbolRefAttr::get(&converter.getMLIRContext(),
mapperNameStr);
}
@@ -3571,7 +3569,6 @@ genOMP(lower::AbstractConverter &converter, lower::SymMap &symTable,
ClauseProcessor cp(converter, semaCtx, clauses);
cp.processMap(loc, stmtCtx, clauseOps);
firOpBuilder.create<mlir::omp::DeclareMapperInfoOp>(loc, clauseOps.mapVars);
- // declMapperOp->dumpPretty();
}
static void
>From c2ca1e8a3ab5ffd64f308c79e3a0931c5bcdfd9c Mon Sep 17 00:00:00 2001
From: Akash Banerjee <Akash.Banerjee at amd.com>
Date: Fri, 4 Jul 2025 16:39:47 +0100
Subject: [PATCH 3/3] Rebased. Addressed reviewer comments.
---
flang/lib/Lower/OpenMP/ClauseProcessor.cpp | 4 +-
flang/lib/Lower/OpenMP/OpenMP.cpp | 57 +++++++++++-----------
2 files changed, 30 insertions(+), 31 deletions(-)
diff --git a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
index f0a90887eeeec..58f3d9d5e62f3 100644
--- a/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
+++ b/flang/lib/Lower/OpenMP/ClauseProcessor.cpp
@@ -1189,7 +1189,7 @@ void ClauseProcessor::processMapObjects(
}
}
- // Make sure we don't return a mapper to self
+ // Make sure we don't return a mapper to self.
llvm::StringRef parentOpName;
if (auto declMapOp = mlir::dyn_cast<mlir::omp::DeclareMapperOp>(
firOpBuilder.getRegion().getParentOp()))
@@ -1299,7 +1299,7 @@ bool ClauseProcessor::processMap(
llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_NONE;
std::string mapperIdName = "__implicit_mapper";
// If the map type is specified, then process it else set the appropriate
- // default value
+ // default value.
Map::MapType type;
if (directive == llvm::omp::Directive::OMPD_target_enter_data &&
semaCtx.langOptions().OpenMPVersion >= 52)
diff --git a/flang/lib/Lower/OpenMP/OpenMP.cpp b/flang/lib/Lower/OpenMP/OpenMP.cpp
index 9f5bb017a3e74..3b40f9dda8bb2 100644
--- a/flang/lib/Lower/OpenMP/OpenMP.cpp
+++ b/flang/lib/Lower/OpenMP/OpenMP.cpp
@@ -2391,14 +2391,17 @@ genSingleOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
queue, item, clauseOps);
}
-static mlir::FlatSymbolRefAttr
-genImplicitDefaultDeclareMapper(lower::AbstractConverter &converter,
- mlir::Location loc, fir::RecordType recordType,
- llvm::StringRef mapperNameStr) {
+static mlir::FlatSymbolRefAttr getOrGenImplicitDefaultDeclareMapper(
+ lower::AbstractConverter &converter, mlir::Location loc,
+ fir::RecordType recordType, llvm::StringRef mapperNameStr) {
+ if (converter.getModuleOp().lookupSymbol(mapperNameStr))
+ return mlir::FlatSymbolRefAttr::get(&converter.getMLIRContext(),
+ mapperNameStr);
+
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
// Save current insertion point before moving to the module scope to create
- // the DeclareMapperOp
+ // the DeclareMapperOp.
mlir::OpBuilder::InsertionGuard guard(firOpBuilder);
firOpBuilder.setInsertionPointToStart(converter.getModuleOp().getBody());
@@ -2429,11 +2432,8 @@ genImplicitDefaultDeclareMapper(lower::AbstractConverter &converter,
// Return a reference to the contents of a derived type with one field.
// Also return the field type.
const auto getFieldRef =
- [&](mlir::Value rec,
- unsigned index) -> std::tuple<mlir::Value, mlir::Type> {
- auto recType = mlir::dyn_cast<fir::RecordType>(
- fir::unwrapPassByRefType(rec.getType()));
- auto [fieldName, fieldTy] = recType.getTypeList()[index];
+ [&](mlir::Value rec, llvm::StringRef fieldName, mlir::Type fieldTy,
+ mlir::Type recType) -> std::tuple<mlir::Value, mlir::Type> {
mlir::Value field = firOpBuilder.create<fir::FieldIndexOp>(
loc, fir::FieldType::get(recType.getContext()), fieldName, recType,
fir::getTypeParams(rec));
@@ -2452,33 +2452,32 @@ genImplicitDefaultDeclareMapper(lower::AbstractConverter &converter,
llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_IMPLICIT;
mlir::omp::VariableCaptureKind captureKind =
mlir::omp::VariableCaptureKind::ByRef;
- int64_t index = 0;
// Populate the declareMapper region with the map information.
- for (const auto &[memberName, memberType] :
- mlir::dyn_cast<fir::RecordType>(recordType).getTypeList()) {
- auto [ref, type] = getFieldRef(declareOp.getBase(), index);
+ for (const auto &entry : llvm::enumerate(
+ mlir::dyn_cast<fir::RecordType>(recordType).getTypeList())) {
+ const auto &memberName = entry.value().first;
+ const auto &memberType = entry.value().second;
+ auto [ref, type] =
+ getFieldRef(declareOp.getBase(), memberName, memberType, recordType);
mlir::FlatSymbolRefAttr mapperId;
if (auto recType = mlir::dyn_cast<fir::RecordType>(memberType)) {
std::string mapperIdName =
- recType.getName().str() + ".omp.default.mapper";
+ recType.getName().str() + llvm::omp::OmpDefaultMapperName;
if (auto *sym = converter.getCurrentScope().FindSymbol(mapperIdName))
mapperIdName = converter.mangleName(mapperIdName, sym->owner());
else if (auto *sym = converter.getCurrentScope().FindSymbol(memberName))
mapperIdName = converter.mangleName(mapperIdName, sym->owner());
- if (converter.getModuleOp().lookupSymbol(mapperIdName))
- mapperId = mlir::FlatSymbolRefAttr::get(&converter.getMLIRContext(),
- mapperIdName);
- else
- mapperId = genImplicitDefaultDeclareMapper(converter, loc, recType,
- mapperIdName);
+ mapperId = getOrGenImplicitDefaultDeclareMapper(converter, loc, recType,
+ mapperIdName);
}
llvm::SmallVector<mlir::Value> bounds;
genBoundsOps(ref, bounds);
mlir::Value mapOp = createMapInfoOp(
- firOpBuilder, loc, ref, /*varPtrPtr=*/mlir::Value{}, "", bounds,
+ firOpBuilder, loc, ref, /*varPtrPtr=*/mlir::Value{}, /*name=*/"",
+ bounds,
/*members=*/{},
/*membersIndex=*/mlir::ArrayAttr{},
static_cast<
@@ -2486,7 +2485,8 @@ genImplicitDefaultDeclareMapper(lower::AbstractConverter &converter,
mapFlag),
captureKind, ref.getType(), /*partialMap=*/false, mapperId);
memberMapOps.emplace_back(mapOp);
- memberPlacementIndices.emplace_back(llvm::SmallVector<int64_t>{index++});
+ memberPlacementIndices.emplace_back(
+ llvm::SmallVector<int64_t>{(int64_t)entry.index()});
}
llvm::SmallVector<mlir::Value> bounds;
@@ -2597,12 +2597,11 @@ genTargetOp(lower::AbstractConverter &converter, lower::SymMap &symTable,
if (converter.getModuleOp().lookupSymbol(mapperIdName))
mapperId = mlir::FlatSymbolRefAttr::get(&converter.getMLIRContext(),
mapperIdName);
- else
- mapperId = genImplicitDefaultDeclareMapper(
- converter, loc,
- mlir::cast<fir::RecordType>(
- converter.genType(sym.GetType()->derivedTypeSpec())),
- mapperIdName);
+ mapperId = getOrGenImplicitDefaultDeclareMapper(
+ converter, loc,
+ mlir::cast<fir::RecordType>(
+ converter.genType(sym.GetType()->derivedTypeSpec())),
+ mapperIdName);
}
fir::factory::AddrAndBoundsInfo info =
More information about the flang-commits
mailing list