================ @@ -2193,80 +2197,137 @@ 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 = +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); + 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) { + auto map = cast<omp::MapInfoOp>(mapValue.getDefiningOp()); ---------------- TIFitis wrote:
I've moved the logic to a lambda, hopefully that helps readability along with code divergence. I don't think we need to check for member mapOp being same as parent as that would be a peculiar scenario we aren't expecting. https://github.com/llvm/llvm-project/pull/101707 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits