================ @@ -1783,6 +1783,98 @@ void collectMapDataFromMapOperands(MapInfoData &mapData, } } +static int getMapDataMemberIdx(MapInfoData &mapData, + mlir::omp::MapInfoOp memberOp) { + int memberDataIdx = -1; + for (size_t i = 0; i < mapData.MapClause.size(); ++i) { + if (mapData.MapClause[i] == memberOp) + memberDataIdx = i; + } + return memberDataIdx; +} + +static mlir::omp::MapInfoOp +getFirstOrLastMappedMemberPtr(mlir::omp::MapInfoOp mapInfo, bool first) { + // Only 1 member has been mapped, we can return it. + if (mapInfo.getMembersIndex()->size() == 1) + if (auto mapOp = mlir::dyn_cast<mlir::omp::MapInfoOp>( + mapInfo.getMembers()[0].getDefiningOp())) + return mapOp; + + int64_t curPos = + mapInfo.getMembersIndex()->begin()->cast<mlir::IntegerAttr>().getInt(); + + int64_t idx = 1, curIdx = 0, memberPlacement = 0; + for (const auto *iter = std::next(mapInfo.getMembersIndex()->begin()); + iter != mapInfo.getMembersIndex()->end(); iter++) { + memberPlacement = iter->cast<mlir::IntegerAttr>().getInt(); + if (first) { + if (memberPlacement < curPos) { + curIdx = idx; + curPos = memberPlacement; + } + } else { + if (memberPlacement > curPos) { + curIdx = idx; + curPos = memberPlacement; + } + } + idx++; + } + + if (auto mapOp = mlir::dyn_cast<mlir::omp::MapInfoOp>( + mapInfo.getMembers()[curIdx].getDefiningOp())) + return mapOp; + + return {}; +} + +std::vector<llvm::Value *> +calculateBoundsOffset(LLVM::ModuleTranslation &moduleTranslation, + llvm::IRBuilderBase &builder, bool isArrayTy, + mlir::OperandRange bounds) { + std::vector<llvm::Value *> idx; + llvm::Value *offsetAddress = nullptr; + if (!bounds.empty()) { + idx.push_back(builder.getInt64(0)); + if (isArrayTy) { + for (int i = bounds.size() - 1; i >= 0; --i) { + if (auto boundOp = mlir::dyn_cast_if_present<mlir::omp::DataBoundsOp>( + bounds[i].getDefiningOp())) { + idx.push_back(moduleTranslation.lookupValue(boundOp.getLowerBound())); + } + } + } else { + std::vector<llvm::Value *> dimensionIndexSizeOffset{builder.getInt64(1)}; + for (size_t i = 1; i < bounds.size(); ++i) { + if (auto boundOp = mlir::dyn_cast_if_present<mlir::omp::DataBoundsOp>( + bounds[i].getDefiningOp())) { + dimensionIndexSizeOffset.push_back(builder.CreateMul( + moduleTranslation.lookupValue(boundOp.getExtent()), + dimensionIndexSizeOffset[i - 1])); + } + } + + for (int i = bounds.size() - 1; i >= 0; --i) { + if (auto boundOp = mlir::dyn_cast_if_present<mlir::omp::DataBoundsOp>( + bounds[i].getDefiningOp())) { + if (!offsetAddress) + offsetAddress = builder.CreateMul( + moduleTranslation.lookupValue(boundOp.getLowerBound()), + dimensionIndexSizeOffset[i]); + else + offsetAddress = builder.CreateAdd( + offsetAddress, builder.CreateMul(moduleTranslation.lookupValue( + boundOp.getLowerBound()), + dimensionIndexSizeOffset[i])); ---------------- ergawy wrote:
I think you can get rid of `offsetAddress` this way: ```suggestion if (idx.empty()) idx.emplace_back(builder.CreateMul( moduleTranslation.lookupValue(boundOp.getLowerBound()), dimensionIndexSizeOffset[i])); else offsetAddress.back() = builder.CreateAdd( offsetAddress.back(), builder.CreateMul(moduleTranslation.lookupValue( boundOp.getLowerBound()), dimensionIndexSizeOffset[i])); ``` https://github.com/llvm/llvm-project/pull/81510 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits