[llvm-branch-commits] [flang] [llvm] [mlir] [MLIR][OpenMP] Introduce overlapped record type map support (PR #119588)
Jan Leyonberg via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Aug 20 10:44:51 PDT 2025
================
@@ -4027,6 +4050,91 @@ calculateBoundsOffset(LLVM::ModuleTranslation &moduleTranslation,
return idx;
}
+// Gathers members that are overlapping in the parent, excluding members that
+// themselves overlap, keeping the top-most (closest to parents level) map.
+static void getOverlappedMembers(llvm::SmallVector<size_t> &overlapMapDataIdxs,
+ MapInfoData &mapData,
+ omp::MapInfoOp parentOp) {
+ // No members mapped, no overlaps.
+ if (parentOp.getMembers().empty())
+ return;
+
+ // Single member, we can insert and return early.
+ if (parentOp.getMembers().size() == 1) {
+ overlapMapDataIdxs.push_back(0);
+ return;
+ }
+
+ // 1) collect list of top-level overlapping members from MemberOp
+ llvm::SmallVector<std::pair<int, mlir::ArrayAttr>> memberByIndex;
+ mlir::ArrayAttr indexAttr = parentOp.getMembersIndexAttr();
+ for (auto [memIndex, indicesAttr] : llvm::enumerate(indexAttr))
+ memberByIndex.push_back(
+ std::make_pair(memIndex, mlir::cast<mlir::ArrayAttr>(indicesAttr)));
+
+ // Sort the smallest first (higher up the parent -> member chain), so that
+ // when we remove members, we remove as much as we can in the initial
+ // iterations, shortening the number of passes required.
+ llvm::sort(memberByIndex.begin(), memberByIndex.end(),
+ [&](auto a, auto b) { return a.second.size() < b.second.size(); });
+
+ auto getAsIntegers = [](mlir::ArrayAttr values) {
----------------
jsjodin wrote:
This seems like it could be a static function instead of a lambda.
https://github.com/llvm/llvm-project/pull/119588
More information about the llvm-branch-commits
mailing list