[llvm-branch-commits] [OpenMP][MLIR] Extend record member map support for omp dialect to LLVM-IR (PR #82852)
Sergio Afonso via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Tue Apr 23 07:21:34 PDT 2024
================
@@ -2306,18 +2405,81 @@ static void processMapMembersWithParent(
llvm::OpenMPIRBuilder::DeviceInfoTy::None);
combinedInfo.Names.emplace_back(
LLVM::createMappingInformation(memberClause.getLoc(), ompBuilder));
-
- combinedInfo.BasePointers.emplace_back(mapData.BasePointers[memberDataIdx]);
+ combinedInfo.BasePointers.emplace_back(mapData.BasePointers[mapDataIndex]);
combinedInfo.Pointers.emplace_back(mapData.Pointers[memberDataIdx]);
combinedInfo.Sizes.emplace_back(mapData.Sizes[memberDataIdx]);
}
}
+static void
+processIndividualMap(MapInfoData &mapData, size_t mapDataIdx,
+ llvm::OpenMPIRBuilder::MapInfosTy &combinedInfo,
+ bool isTargetParams, int mapDataParentIdx = -1) {
+ // Declare Target Mappings are excluded from being marked as
+ // OMP_MAP_TARGET_PARAM as they are not passed as parameters, they're
+ // marked with OMP_MAP_PTR_AND_OBJ instead.
+ auto mapFlag = mapData.Types[mapDataIdx];
+ auto mapInfoOp =
+ dyn_cast<mlir::omp::MapInfoOp>(mapData.MapClause[mapDataIdx]);
+
+ bool isPtrTy = checkIfPointerMap(mapInfoOp);
+ if (isPtrTy)
+ mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_PTR_AND_OBJ;
+
+ if (isTargetParams && !mapData.IsDeclareTarget[mapDataIdx])
+ mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TARGET_PARAM;
+
+ if (mapInfoOp.getMapCaptureType().value() ==
+ mlir::omp::VariableCaptureKind::ByCopy &&
+ !isPtrTy)
+ mapFlag |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_LITERAL;
+
+ // if we're provided a mapDataParentIdx, then the data being mapped is
+ // part of a larger object (in a parent <-> member mapping) and in this
+ // case our BasePointer should be the parent.
+ if (mapDataParentIdx >= 0)
+ combinedInfo.BasePointers.emplace_back(
+ mapData.BasePointers[mapDataParentIdx]);
+ else
+ combinedInfo.BasePointers.emplace_back(mapData.BasePointers[mapDataIdx]);
+
+ combinedInfo.Pointers.emplace_back(mapData.Pointers[mapDataIdx]);
+ combinedInfo.DevicePointers.emplace_back(mapData.DevicePointers[mapDataIdx]);
+ combinedInfo.Names.emplace_back(mapData.Names[mapDataIdx]);
+ combinedInfo.Types.emplace_back(mapFlag);
+ combinedInfo.Sizes.emplace_back(mapData.Sizes[mapDataIdx]);
+}
+
static void processMapWithMembersOf(
LLVM::ModuleTranslation &moduleTranslation, llvm::IRBuilderBase &builder,
llvm::OpenMPIRBuilder &ompBuilder, DataLayout &dl,
llvm::OpenMPIRBuilder::MapInfosTy &combinedInfo, MapInfoData &mapData,
uint64_t mapDataIndex, bool isTargetParams) {
+ auto parentClause =
+ mlir::dyn_cast<mlir::omp::MapInfoOp>(mapData.MapClause[mapDataIndex]);
+
+ // If we have a partial map (no parent referneced in the map clauses of the
+ // directive, only members) and only a single member, we do not need to bind
+ // the map of the member to the parent, we can pass the member seperately.
+ if (parentClause.getMembers().size() == 1 && parentClause.getPartialMap()) {
+ auto memberClause = mlir::dyn_cast<mlir::omp::MapInfoOp>(
----------------
skatrak wrote:
```suggestion
auto memberClause = mlir::cast<mlir::omp::MapInfoOp>(
```
https://github.com/llvm/llvm-project/pull/82852
More information about the llvm-branch-commits
mailing list