[flang] [llvm] [mlir] [MLIR][OpenMP] Introduce overlapped record type map support (PR #119588)
Jan Leyonberg via llvm-commits
llvm-commits at lists.llvm.org
Tue Oct 7 07:11:46 PDT 2025
================
@@ -4129,6 +4154,87 @@ calculateBoundsOffset(LLVM::ModuleTranslation &moduleTranslation,
return idx;
}
+static void getAsIntegers(ArrayAttr values, llvm::SmallVector<int64_t> &ints) {
+ llvm::transform(values, std::back_inserter(ints), [](Attribute value) {
+ return cast<IntegerAttr>(value).getInt();
+ });
+};
+
+// 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::SmallVectorImpl<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, ArrayAttr>> memberByIndex;
+ ArrayAttr indexAttr = parentOp.getMembersIndexAttr();
+ for (auto [memIndex, indicesAttr] : llvm::enumerate(indexAttr))
+ memberByIndex.push_back(
+ std::make_pair(memIndex, cast<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(); });
+
+ // Remove elements from the vector if there is a parent element that
+ // supersedes it. i.e. if member [0] is mapped, we can remove members [0,1],
+ // [0,2].. etc.
+ llvm::SmallVector<std::pair<int, ArrayAttr>> skipList;
+ for (auto v : memberByIndex) {
+ llvm::SmallVector<int64_t> vArr(v.second.size());
+ getAsIntegers(v.second, vArr);
+ skipList.push_back(
+ *std::find_if(memberByIndex.begin(), memberByIndex.end(), [&](auto x) {
+ if (v == x)
+ return false;
+ llvm::SmallVector<int64_t> xArr(x.second.size());
+ getAsIntegers(x.second, xArr);
+ return std::equal(vArr.begin(), vArr.end(), xArr.begin()) &&
+ xArr.size() >= vArr.size();
+ }));
+ }
+
+ // Collect the indices from mapData that we need, as we technically need the
----------------
jsjodin wrote:
Stale comment
https://github.com/llvm/llvm-project/pull/119588
More information about the llvm-commits
mailing list