[clang] [Clang][OpenMP] Handle check for non-contiguous mapping in pointer-based array sections (PR #157443)
Amit Tiwari via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 24 00:41:03 PST 2025
https://github.com/amitamd7 updated https://github.com/llvm/llvm-project/pull/157443
>From 57bd313653a208eefbd5d349704ea984f499d08a Mon Sep 17 00:00:00 2001
From: amtiwari <amtiwari at amd.com>
Date: Mon, 8 Sep 2025 08:23:21 -0400
Subject: [PATCH 1/2] handle_array_pointer_var_check
---
clang/lib/CodeGen/CGOpenMPRuntime.cpp | 10 ++++++----
1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index b38eb54036e60..416a8c1ad4a03 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -7930,10 +7930,12 @@ class MappableExprsHandler {
ElementType = CAT->getElementType().getTypePtr();
else if (VAT)
ElementType = VAT->getElementType().getTypePtr();
- else
- assert(&Component == &*Components.begin() &&
- "Only expect pointer (non CAT or VAT) when this is the "
- "first Component");
+ else if (&Component == &*Components.begin()) {
+ // Handle pointer-based array sections like data[a:b:c]
+ if (const auto *PtrType = Ty->getAs<PointerType>()) {
+ ElementType = PtrType->getPointeeType().getTypePtr();
+ }
+ }
// If ElementType is null, then it means the base is a pointer
// (neither CAT nor VAT) and we'll attempt to get ElementType again
// for next iteration.
>From 70e1552ba597def7484278b90411b5ed47dacb5e Mon Sep 17 00:00:00 2001
From: amtiwari <amtiwari at amd.com>
Date: Fri, 21 Nov 2025 06:47:59 -0500
Subject: [PATCH 2/2] plugin_interface_issue_fix
---
clang/lib/CodeGen/CGOpenMPRuntime.cpp | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 416a8c1ad4a03..b2660265cd21f 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -8551,8 +8551,15 @@ class MappableExprsHandler {
// If there is an entry in PartialStruct it means we have a struct with
// individual members mapped. Emit an extra combined entry.
if (PartialStruct.Base.isValid()) {
- UnionCurInfo.NonContigInfo.Dims.push_back(0);
- // Emit a combined entry:
+ // Prepend a synthetic dimension of length 1 to represent the
+ // aggregated struct object. Using 1 (not 0, as 0 produced an
+ // incorrect non-contiguous descriptor (DimSize==1), causing the
+ // non-contiguous motion clause path to be skipped.) is important:
+ // * It preserves the correct rank so targetDataUpdate() computes
+ // DimSize == 2 for cases like strided array sections originating
+ // from user-defined mappers (e.g. test with s.data[0:8:2]).
+ UnionCurInfo.NonContigInfo.Dims.insert(
+ UnionCurInfo.NonContigInfo.Dims.begin(), 1);
emitCombinedEntry(CombinedInfo, UnionCurInfo.Types, PartialStruct,
/*IsMapThis*/ !VD, OMPBuilder, VD);
}
More information about the cfe-commits
mailing list