[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