[llvm-branch-commits] [llvm] [mlir] [OpenMP]Update use_device_clause lowering (PR #101707)
Sergio Afonso via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Thu Aug 29 06:00:54 PDT 2024
================
@@ -2193,80 +2197,141 @@ llvm::Value *getSizeInBytes(DataLayout &dl, const mlir::Type &type,
return builder.getInt64(dl.getTypeSizeInBits(type) / 8);
}
-void collectMapDataFromMapVars(MapInfoData &mapData,
- llvm::SmallVectorImpl<Value> &mapVars,
- LLVM::ModuleTranslation &moduleTranslation,
- DataLayout &dl, llvm::IRBuilderBase &builder) {
- for (mlir::Value mapValue : mapVars) {
- if (auto mapOp = mlir::dyn_cast_if_present<mlir::omp::MapInfoOp>(
- mapValue.getDefiningOp())) {
- mlir::Value offloadPtr =
- mapOp.getVarPtrPtr() ? mapOp.getVarPtrPtr() : mapOp.getVarPtr();
- mapData.OriginalValue.push_back(
- moduleTranslation.lookupValue(offloadPtr));
- mapData.Pointers.push_back(mapData.OriginalValue.back());
-
- if (llvm::Value *refPtr =
- getRefPtrIfDeclareTarget(offloadPtr,
- moduleTranslation)) { // declare target
- mapData.IsDeclareTarget.push_back(true);
- mapData.BasePointers.push_back(refPtr);
- } else { // regular mapped variable
- mapData.IsDeclareTarget.push_back(false);
- mapData.BasePointers.push_back(mapData.OriginalValue.back());
- }
+static void collectMapDataFromMapOperands(
+ MapInfoData &mapData, SmallVectorImpl<Value> &mapVars,
+ LLVM::ModuleTranslation &moduleTranslation, DataLayout &dl,
+ llvm::IRBuilderBase &builder, const ArrayRef<Value> &useDevPtrOperands = {},
+ const ArrayRef<Value> &useDevAddrOperands = {}) {
+ // Process MapOperands
+ for (Value mapValue : mapVars) {
+ auto mapOp = cast<omp::MapInfoOp>(mapValue.getDefiningOp());
+ Value offloadPtr =
+ mapOp.getVarPtrPtr() ? mapOp.getVarPtrPtr() : mapOp.getVarPtr();
+ mapData.OriginalValue.push_back(moduleTranslation.lookupValue(offloadPtr));
+ mapData.Pointers.push_back(mapData.OriginalValue.back());
+
+ if (llvm::Value *refPtr =
+ getRefPtrIfDeclareTarget(offloadPtr,
+ moduleTranslation)) { // declare target
+ mapData.IsDeclareTarget.push_back(true);
+ mapData.BasePointers.push_back(refPtr);
+ } else { // regular mapped variable
+ mapData.IsDeclareTarget.push_back(false);
+ mapData.BasePointers.push_back(mapData.OriginalValue.back());
+ }
- mapData.BaseType.push_back(
- moduleTranslation.convertType(mapOp.getVarType()));
- mapData.Sizes.push_back(
- getSizeInBytes(dl, mapOp.getVarType(), mapOp, mapData.Pointers.back(),
- mapData.BaseType.back(), builder, moduleTranslation));
- mapData.MapClause.push_back(mapOp.getOperation());
- mapData.Types.push_back(
- llvm::omp::OpenMPOffloadMappingFlags(mapOp.getMapType().value()));
- mapData.Names.push_back(LLVM::createMappingInformation(
- mapOp.getLoc(), *moduleTranslation.getOpenMPBuilder()));
- mapData.DevicePointers.push_back(
- llvm::OpenMPIRBuilder::DeviceInfoTy::None);
-
- // Check if this is a member mapping and correctly assign that it is, if
- // it is a member of a larger object.
- // TODO: Need better handling of members, and distinguishing of members
- // that are implicitly allocated on device vs explicitly passed in as
- // arguments.
- // TODO: May require some further additions to support nested record
- // types, i.e. member maps that can have member maps.
- mapData.IsAMember.push_back(false);
- for (mlir::Value mapValue : mapVars) {
- if (auto map = mlir::dyn_cast_if_present<mlir::omp::MapInfoOp>(
- mapValue.getDefiningOp())) {
- for (auto member : map.getMembers()) {
- if (member == mapOp) {
- mapData.IsAMember.back() = true;
- }
+ mapData.BaseType.push_back(
+ moduleTranslation.convertType(mapOp.getVarType()));
+ mapData.Sizes.push_back(
+ getSizeInBytes(dl, mapOp.getVarType(), mapOp, mapData.Pointers.back(),
+ mapData.BaseType.back(), builder, moduleTranslation));
+ mapData.MapClause.push_back(mapOp.getOperation());
+ mapData.Types.push_back(
+ llvm::omp::OpenMPOffloadMappingFlags(mapOp.getMapType().value()));
+ mapData.Names.push_back(LLVM::createMappingInformation(
+ mapOp.getLoc(), *moduleTranslation.getOpenMPBuilder()));
+ mapData.DevicePointers.push_back(llvm::OpenMPIRBuilder::DeviceInfoTy::None);
+ mapData.IsAMapping.push_back(true);
+
+ // Check if this is a member mapping and correctly assign that it is, if
+ // it is a member of a larger object.
+ // TODO: Need better handling of members, and distinguishing of members
+ // that are implicitly allocated on device vs explicitly passed in as
+ // arguments.
+ // TODO: May require some further additions to support nested record
+ // types, i.e. member maps that can have member maps.
+ mapData.IsAMember.push_back(false);
+ for (Value mapValue : mapVars) {
+ if (auto map =
+ dyn_cast_if_present<omp::MapInfoOp>(mapValue.getDefiningOp())) {
+ for (auto member : map.getMembers()) {
+ if (member == mapOp) {
+ mapData.IsAMember.back() = true;
}
}
}
}
}
+
+ auto findMapInfo = [&mapData](llvm::Value *val,
+ llvm::OpenMPIRBuilder::DeviceInfoTy devInfoTy) {
+ unsigned index = 0;
+ bool found = false;
+ for (llvm::Value *basePtr : mapData.OriginalValue) {
+ if (basePtr == val && mapData.IsAMapping[index]) {
+ found = true;
+ mapData.Types[index] |=
+ llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_RETURN_PARAM;
+ mapData.DevicePointers[index] = devInfoTy;
+ }
+ index++;
+ }
+ return found;
+ };
+
+ // Process useDevPtr(Addr)Operands
+ auto addDevInfos = [&](const llvm::ArrayRef<Value> &useDevOperands,
----------------
skatrak wrote:
I guess we can leave it as is for now, since everything is contained in the same function. Hopefully when support for this matures a bit more we'll be able to see what we can share.
https://github.com/llvm/llvm-project/pull/101707
More information about the llvm-branch-commits
mailing list