[flang-commits] [flang] [mlir] [OpenACC] Add a map flag for the attach/detach clause (PR #224433)
via flang-commits
flang-commits at lists.llvm.org
Thu Sep 17 15:47:15 PDT 2026
https://github.com/khaki3 updated https://github.com/llvm/llvm-project/pull/224433
>From 60c0c843c0291708c9d5082cafb0b91b524ae04d Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Thu, 17 Sep 2026 14:11:33 -0700
Subject: [PATCH 1/7] [OpenACC] Add a map flag for the attach clause
Example:
```fortran
!$acc enter data create(arr)
p => arr(:,1)
!$acc enter data attach(p)
```
In this code, computeDataClauseMapFlags returns no flag for acc_attach, so the
resulting acc.map_info is indistinguishable from one formed for a create of the
target, and the clause itself is gone by that point.
Fix: give the attach clause its own map flag.
---
mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td | 3 ++-
mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp | 1 +
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td
index 31b0523480c79c..aae4fbe768d7b3 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td
@@ -60,6 +60,7 @@ def OpenACC_MapFlagsIfPresent : I32BitEnumAttrCaseBit<"if_present", 19>;
def OpenACC_MapFlagsPresent : I32BitEnumAttrCaseBit<"present", 20>;
def OpenACC_MapFlagsDescriptor : I32BitEnumAttrCaseBit<"descriptor", 21>;
def OpenACC_MapFlagsReduction : I32BitEnumAttrCaseBit<"reduction", 22>;
+def OpenACC_MapFlagsAttach : I32BitEnumAttrCaseBit<"attach", 23>;
def OpenACC_MapFlagsEnum : I32BitEnumAttr<
"MapFlags", "OpenACC offload map-type flags",
@@ -71,7 +72,7 @@ def OpenACC_MapFlagsEnum : I32BitEnumAttr<
OpenACC_MapFlagsVectorPrivate, OpenACC_MapFlagsInitZero,
OpenACC_MapFlagsDeviceResident, OpenACC_MapFlagsIfPresent,
OpenACC_MapFlagsPresent, OpenACC_MapFlagsDescriptor,
- OpenACC_MapFlagsReduction]> {
+ OpenACC_MapFlagsReduction, OpenACC_MapFlagsAttach]> {
let separator = ",";
let cppNamespace = "::mlir::acc";
let genSpecializedAttr = 0;
diff --git a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
index 7f0106b0a5083a..e5efcd3f959337 100644
--- a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
+++ b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
@@ -666,6 +666,7 @@ MapFlags computeDataClauseMapFlags(Operation *entryOp, bool ptrAndObj) {
flags = flags | MapFlags::no_create;
break;
case DataClause::acc_attach:
+ flags = flags | MapFlags::attach;
break;
default:
break;
>From 8dc63a2892424c1a4a2b8d122c5f0362ef38dca3 Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Thu, 17 Sep 2026 14:35:04 -0700
Subject: [PATCH 2/7] [OpenACC] Set the attach map flag for the detach clause
too
In this code only acc_attach carried the flag, so a consumer acting on it sees
one half of an attach/detach pair and cannot treat the two symmetrically.
Fix: set the flag for acc_detach as well, matching how hasAttachPoint already
pairs the two clauses.
---
mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp | 1 +
1 file changed, 1 insertion(+)
diff --git a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
index e5efcd3f959337..1d8b75a3f48b78 100644
--- a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
+++ b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
@@ -666,6 +666,7 @@ MapFlags computeDataClauseMapFlags(Operation *entryOp, bool ptrAndObj) {
flags = flags | MapFlags::no_create;
break;
case DataClause::acc_attach:
+ case DataClause::acc_detach:
flags = flags | MapFlags::attach;
break;
default:
>From edf3d55fb679f4d7fb50c38a9997613f81fd574a Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Thu, 17 Sep 2026 14:44:11 -0700
Subject: [PATCH 3/7] [OpenACC] Give the detach clause its own map flag
In this code acc_detach reused the attach flag, so a consumer could not tell
the two halves of a pair apart, nor act on one of them alone.
Fix: add a detach map flag and set it for acc_detach.
---
mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td | 4 +++-
mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp | 4 +++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td
index aae4fbe768d7b3..77d7850a943300 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td
@@ -61,6 +61,7 @@ def OpenACC_MapFlagsPresent : I32BitEnumAttrCaseBit<"present", 20>;
def OpenACC_MapFlagsDescriptor : I32BitEnumAttrCaseBit<"descriptor", 21>;
def OpenACC_MapFlagsReduction : I32BitEnumAttrCaseBit<"reduction", 22>;
def OpenACC_MapFlagsAttach : I32BitEnumAttrCaseBit<"attach", 23>;
+def OpenACC_MapFlagsDetach : I32BitEnumAttrCaseBit<"detach", 24>;
def OpenACC_MapFlagsEnum : I32BitEnumAttr<
"MapFlags", "OpenACC offload map-type flags",
@@ -72,7 +73,8 @@ def OpenACC_MapFlagsEnum : I32BitEnumAttr<
OpenACC_MapFlagsVectorPrivate, OpenACC_MapFlagsInitZero,
OpenACC_MapFlagsDeviceResident, OpenACC_MapFlagsIfPresent,
OpenACC_MapFlagsPresent, OpenACC_MapFlagsDescriptor,
- OpenACC_MapFlagsReduction, OpenACC_MapFlagsAttach]> {
+ OpenACC_MapFlagsReduction, OpenACC_MapFlagsAttach,
+ OpenACC_MapFlagsDetach]> {
let separator = ",";
let cppNamespace = "::mlir::acc";
let genSpecializedAttr = 0;
diff --git a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
index 1d8b75a3f48b78..6d302b86e475a1 100644
--- a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
+++ b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
@@ -666,9 +666,11 @@ MapFlags computeDataClauseMapFlags(Operation *entryOp, bool ptrAndObj) {
flags = flags | MapFlags::no_create;
break;
case DataClause::acc_attach:
- case DataClause::acc_detach:
flags = flags | MapFlags::attach;
break;
+ case DataClause::acc_detach:
+ flags = flags | MapFlags::detach;
+ break;
default:
break;
}
>From 93f72a2be4551c782737573aa612c193e1c33856 Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Thu, 17 Sep 2026 14:51:48 -0700
Subject: [PATCH 4/7] [OpenACC] Use the attach map flag for the detach clause
In this code acc_detach had a flag of its own, but the direction is already
given by the op that consumes the mapping, so the second flag states nothing
the consumer does not have.
Fix: drop the detach flag and set the attach flag for both clauses.
---
mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td | 4 +---
mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp | 6 +++---
2 files changed, 4 insertions(+), 6 deletions(-)
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td
index 77d7850a943300..aae4fbe768d7b3 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td
@@ -61,7 +61,6 @@ def OpenACC_MapFlagsPresent : I32BitEnumAttrCaseBit<"present", 20>;
def OpenACC_MapFlagsDescriptor : I32BitEnumAttrCaseBit<"descriptor", 21>;
def OpenACC_MapFlagsReduction : I32BitEnumAttrCaseBit<"reduction", 22>;
def OpenACC_MapFlagsAttach : I32BitEnumAttrCaseBit<"attach", 23>;
-def OpenACC_MapFlagsDetach : I32BitEnumAttrCaseBit<"detach", 24>;
def OpenACC_MapFlagsEnum : I32BitEnumAttr<
"MapFlags", "OpenACC offload map-type flags",
@@ -73,8 +72,7 @@ def OpenACC_MapFlagsEnum : I32BitEnumAttr<
OpenACC_MapFlagsVectorPrivate, OpenACC_MapFlagsInitZero,
OpenACC_MapFlagsDeviceResident, OpenACC_MapFlagsIfPresent,
OpenACC_MapFlagsPresent, OpenACC_MapFlagsDescriptor,
- OpenACC_MapFlagsReduction, OpenACC_MapFlagsAttach,
- OpenACC_MapFlagsDetach]> {
+ OpenACC_MapFlagsReduction, OpenACC_MapFlagsAttach]> {
let separator = ",";
let cppNamespace = "::mlir::acc";
let genSpecializedAttr = 0;
diff --git a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
index 6d302b86e475a1..9646c2e69c59e7 100644
--- a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
+++ b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
@@ -666,10 +666,10 @@ MapFlags computeDataClauseMapFlags(Operation *entryOp, bool ptrAndObj) {
flags = flags | MapFlags::no_create;
break;
case DataClause::acc_attach:
- flags = flags | MapFlags::attach;
- break;
case DataClause::acc_detach:
- flags = flags | MapFlags::detach;
+ // The consuming op gives the direction; this only states that the mapping
+ // is a pointer attachment rather than a mapping of the target.
+ flags = flags | MapFlags::attach;
break;
default:
break;
>From 6b8280b371770c81d559c62a5a925f5837ea7cce Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Thu, 17 Sep 2026 15:08:00 -0700
Subject: [PATCH 5/7] [OpenACC] Restore the detach map flag
In this code acc_detach shared the attach flag, leaving the mapping to be read
through the op that consumes it rather than stating the clause it came from.
Fix: give acc_detach its own flag again.
---
mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td | 4 +++-
mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp | 6 +++---
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td b/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td
index aae4fbe768d7b3..77d7850a943300 100644
--- a/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td
+++ b/mlir/include/mlir/Dialect/OpenACC/OpenACCCGEnums.td
@@ -61,6 +61,7 @@ def OpenACC_MapFlagsPresent : I32BitEnumAttrCaseBit<"present", 20>;
def OpenACC_MapFlagsDescriptor : I32BitEnumAttrCaseBit<"descriptor", 21>;
def OpenACC_MapFlagsReduction : I32BitEnumAttrCaseBit<"reduction", 22>;
def OpenACC_MapFlagsAttach : I32BitEnumAttrCaseBit<"attach", 23>;
+def OpenACC_MapFlagsDetach : I32BitEnumAttrCaseBit<"detach", 24>;
def OpenACC_MapFlagsEnum : I32BitEnumAttr<
"MapFlags", "OpenACC offload map-type flags",
@@ -72,7 +73,8 @@ def OpenACC_MapFlagsEnum : I32BitEnumAttr<
OpenACC_MapFlagsVectorPrivate, OpenACC_MapFlagsInitZero,
OpenACC_MapFlagsDeviceResident, OpenACC_MapFlagsIfPresent,
OpenACC_MapFlagsPresent, OpenACC_MapFlagsDescriptor,
- OpenACC_MapFlagsReduction, OpenACC_MapFlagsAttach]> {
+ OpenACC_MapFlagsReduction, OpenACC_MapFlagsAttach,
+ OpenACC_MapFlagsDetach]> {
let separator = ",";
let cppNamespace = "::mlir::acc";
let genSpecializedAttr = 0;
diff --git a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
index 9646c2e69c59e7..6d302b86e475a1 100644
--- a/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
+++ b/mlir/lib/Dialect/OpenACC/Utils/OpenACCUtilsCG.cpp
@@ -666,11 +666,11 @@ MapFlags computeDataClauseMapFlags(Operation *entryOp, bool ptrAndObj) {
flags = flags | MapFlags::no_create;
break;
case DataClause::acc_attach:
- case DataClause::acc_detach:
- // The consuming op gives the direction; this only states that the mapping
- // is a pointer attachment rather than a mapping of the target.
flags = flags | MapFlags::attach;
break;
+ case DataClause::acc_detach:
+ flags = flags | MapFlags::detach;
+ break;
default:
break;
}
>From 32a4605bbf1e6f4ff660020be3f94ad7f745a5ad Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Thu, 17 Sep 2026 15:28:38 -0700
Subject: [PATCH 6/7] [OpenACC] Update the conversion tests for the attach map
flag
The attach mapping now carries the attach flag alongside ptr_and_obj, so its
ArgType is 8388624 rather than 16.
---
mlir/test/Conversion/OpenACCToLLVM/data-runtime.mlir | 6 +++---
mlir/test/Conversion/OpenACCToLLVM/data.mlir | 2 +-
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/mlir/test/Conversion/OpenACCToLLVM/data-runtime.mlir b/mlir/test/Conversion/OpenACCToLLVM/data-runtime.mlir
index 19bd764843c026..4b3952a250c9b8 100644
--- a/mlir/test/Conversion/OpenACCToLLVM/data-runtime.mlir
+++ b/mlir/test/Conversion/OpenACCToLLVM/data-runtime.mlir
@@ -466,12 +466,12 @@ func.func @mapping_names(%arg0: !llvm.ptr, %arg1: !llvm.ptr) {
// -----
// create allocates without a copy, copyin_readonly copies to the device, and
-// attach/detach state the attachment address as PTR_AND_OBJ.
+// attach/detach state the attachment address, and the attach clause.
// CHECK-LABEL: llvm.func @create_readonly_detach
// CHECK-DAG: %[[TO:.*]] = llvm.mlir.constant(1 : i64) : i64
-// CHECK-DAG: %[[PTR_AND_OBJ:.*]] = llvm.mlir.constant(16 : i64) : i64
+// CHECK-DAG: %[[ATTACH:.*]] = llvm.mlir.constant(8388624 : i64) : i64
// CHECK-DAG: llvm.store %[[TO]], %{{.*}} : i64, !llvm.ptr
-// CHECK-DAG: llvm.store %[[PTR_AND_OBJ]], %{{.*}} : i64, !llvm.ptr
+// CHECK-DAG: llvm.store %[[ATTACH]], %{{.*}} : i64, !llvm.ptr
// CHECK-NOT: llvm.mlir.constant(3 : i64)
// CHECK: llvm.call @__tgt_acc_data_begin
func.func @create_readonly_detach(%arg0: !llvm.ptr, %arg1: !llvm.ptr,
diff --git a/mlir/test/Conversion/OpenACCToLLVM/data.mlir b/mlir/test/Conversion/OpenACCToLLVM/data.mlir
index 320ebbd91072e8..49ecea14ea16d6 100644
--- a/mlir/test/Conversion/OpenACCToLLVM/data.mlir
+++ b/mlir/test/Conversion/OpenACCToLLVM/data.mlir
@@ -184,7 +184,7 @@ func.func @enter_data_wait_all(%arg0: !llvm.ptr) {
// CHECK-DAG: llvm.mlir.constant(1048576 : i64) : i64
// CHECK-DAG: llvm.mlir.constant(8192 : i64) : i64
// CHECK-DAG: llvm.mlir.constant(1024 : i64) : i64
-// CHECK-DAG: llvm.mlir.constant(16 : i64) : i64
+// CHECK-DAG: llvm.mlir.constant(8388624 : i64) : i64
// CHECK-DAG: llvm.store %arg2, %{{.*}} : !llvm.ptr, !llvm.ptr
// CHECK: llvm.call @__tgt_acc_data_begin
// CHECK: llvm.call @__tgt_acc_data_end
>From e1b5e8577b81941cf3c5a06d1e92786bd3c05ee8 Mon Sep 17 00:00:00 2001
From: Kazuaki Matsumura <kmatsumura at nvidia.com>
Date: Thu, 17 Sep 2026 15:46:59 -0700
Subject: [PATCH 7/7] [OpenACC] Update the map-info-prep tests for the attach
and detach map flags
The attach and detach maps now state their clause alongside ptr_and_obj.
---
flang/test/Fir/OpenACC/acc-fir-map-info-prep-clauses.mlir | 2 +-
flang/test/Fir/OpenACC/acc-fir-map-info-prep-types.mlir | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/flang/test/Fir/OpenACC/acc-fir-map-info-prep-clauses.mlir b/flang/test/Fir/OpenACC/acc-fir-map-info-prep-clauses.mlir
index 2aaf3bc71c48d6..f3507c8a982a71 100644
--- a/flang/test/Fir/OpenACC/acc-fir-map-info-prep-clauses.mlir
+++ b/flang/test/Fir/OpenACC/acc-fir-map-info-prep-clauses.mlir
@@ -130,7 +130,7 @@ func.func @deviceptr() {
// CHECK-LABEL: func.func @detach
// CHECK: %[[MAP:.*]] = acc.map_info varPtr(%{{.*}} : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>)
// CHECK-SAME: descKind(cfi)
-// CHECK-SAME: mapFlags(ptr_and_obj)
+// CHECK-SAME: mapFlags(ptr_and_obj,detach)
// CHECK: acc.exit_data dataOperands(%[[MAP]]
// CHECK-NOT: acc.detach
func.func @detach() {
diff --git a/flang/test/Fir/OpenACC/acc-fir-map-info-prep-types.mlir b/flang/test/Fir/OpenACC/acc-fir-map-info-prep-types.mlir
index 91b257a9c31657..3fe8c172a354bf 100644
--- a/flang/test/Fir/OpenACC/acc-fir-map-info-prep-types.mlir
+++ b/flang/test/Fir/OpenACC/acc-fir-map-info-prep-types.mlir
@@ -124,7 +124,7 @@ func.func @cptr_copyin() {
// CHECK: acc.map_info varPtr(%[[SLOT]] : !fir.ref<!fir.box<!fir.ptr<!fir.array<?xf32>>>>)
// CHECK-SAME: elementSize(4)
// CHECK-SAME: descKind(cfi)
-// CHECK-SAME: mapFlags(ptr_and_obj)
+// CHECK-SAME: mapFlags(ptr_and_obj,attach)
// CHECK-NOT: acc.attach
// CHECK: acc.data
func.func @attach_pointer() {
More information about the flang-commits
mailing list