[Mlir-commits] [mlir] [OpenMP][mlir] Add DynGroupPrivateClause in omp dialect (PR #153562)

llvmlistbot at llvm.org llvmlistbot at llvm.org
Thu Aug 14 03:07:41 PDT 2025


https://github.com/skc7 created https://github.com/llvm/llvm-project/pull/153562

None

>From e84c851002741e9e65c9e08398a87df4e54de629 Mon Sep 17 00:00:00 2001
From: skc7 <Krishna.Sankisa at amd.com>
Date: Thu, 14 Aug 2025 09:46:31 +0530
Subject: [PATCH 1/2] [OpenMP][mlir] Add DynGroupPrivateClause in omp dialect

---
 .../mlir/Dialect/OpenMP/OpenMPClauses.td      | 43 +++++++++++++++++++
 .../mlir/Dialect/OpenMP/OpenMPEnums.td        | 22 ++++++++++
 2 files changed, 65 insertions(+)

diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td
index 311c57fb4446c..424a490838ae5 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td
@@ -1470,4 +1470,47 @@ class OpenMP_UseDevicePtrClauseSkip<
 
 def OpenMP_UseDevicePtrClause : OpenMP_UseDevicePtrClauseSkip<>;
 
+//===----------------------------------------------------------------------===//
+// V6.1 `dyn_groupprivate` clause
+//===----------------------------------------------------------------------===//
+
+class OpenMP_DynGroupPrivateClauseSkip<
+    bit traits = false, bit arguments = false, bit assemblyFormat = false,
+    bit description = false, bit extraClassDeclaration = false
+  > : OpenMP_Clause<traits, arguments, assemblyFormat, description,
+                    extraClassDeclaration> {
+
+  let arguments = (ins
+    DynGroupPrivateModifierAttr:$modifier_first,
+    DynGroupPrivateModifierAttr:$modifier_second,
+    AnyInteger:$size
+  );
+
+  let description = [{
+    The `dyn_groupprivate` clause allows you to dynamically allocate group-private
+    memory in OpenMP parallel regions, specifically for `target` and `teams` directives.
+    This clause enables runtime-sized private memory allocation and applicable to
+    target and teams ops.
+
+    Syntax:
+    ```
+    dyn_groupprivate(modifier_first ,modifier_second : size)
+    ```
+
+    Example:
+    ```
+    omp.target dyn_groupprivate(strict, cgroup : %size : i32)
+    ```
+  }];
+
+  let optAssemblyFormat = [{
+  `dyn_groupprivate` `(`
+    $modifier_first `,` $modifier_second
+    `:` $size `:` type($size)
+  `)`
+  }];
+}
+
+def OpenMP_DynGroupPrivateClause : OpenMP_DynGroupPrivateClauseSkip<>;
+
 #endif // OPENMP_CLAUSES
diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPEnums.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPEnums.td
index c080c3fac87d4..81531dd0baf7b 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPEnums.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPEnums.td
@@ -293,4 +293,26 @@ def AllocatorHandle : OpenMP_I32EnumAttr<
     ]>;
 
 def AllocatorHandleAttr : OpenMP_EnumAttr<AllocatorHandle, "allocator_handle">;
+
+//===----------------------------------------------------------------------===//
+// dyn_groupprivate enum.
+//===----------------------------------------------------------------------===//
+
+def DynGroupPrivateCGroup : I32EnumAttrCase<"cgroup", 0>;
+def DynGroupPrivateStrict : I32EnumAttrCase<"strict", 1>;
+def DynGroupPrivateFallback : I32EnumAttrCase<"fallback", 2>;
+
+def DynGroupPrivateModifier : OpenMP_I32EnumAttr<
+    "DynGroupPrivateModifier",
+    "reduction modifier", [
+      DynGroupPrivateCGroup,
+      DynGroupPrivateStrict,
+      DynGroupPrivateFallback
+    ]>;
+
+def DynGroupPrivateModifierAttr : OpenMP_EnumAttr<DynGroupPrivateModifier,
+                                            "dyn_groupprivate_modifier"> {
+  let assemblyFormat = "`(` $value `)`";
+}
+
 #endif // OPENMP_ENUMS

>From 772c11000bbc85e3b23d3d8d3ecab1040ae3339c Mon Sep 17 00:00:00 2001
From: skc7 <Krishna.Sankisa at amd.com>
Date: Thu, 14 Aug 2025 15:36:11 +0530
Subject: [PATCH 2/2] Add dyn_groupprivate clause to teams and target ops

---
 .../mlir/Dialect/OpenMP/OpenMPClauses.td      | 19 ++++++++++---------
 mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td |  5 +++--
 mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp  |  5 ++++-
 3 files changed, 17 insertions(+), 12 deletions(-)

diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td
index 424a490838ae5..a0ac73f5311e0 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td
@@ -1481,9 +1481,9 @@ class OpenMP_DynGroupPrivateClauseSkip<
                     extraClassDeclaration> {
 
   let arguments = (ins
-    DynGroupPrivateModifierAttr:$modifier_first,
-    DynGroupPrivateModifierAttr:$modifier_second,
-    AnyInteger:$size
+    OptionalAttr<DynGroupPrivateModifierAttr>:$modifier_first,
+    OptionalAttr<DynGroupPrivateModifierAttr>:$modifier_second,
+    Optional<AnyInteger>:$dyn_groupprivate_size
   );
 
   let description = [{
@@ -1494,20 +1494,21 @@ class OpenMP_DynGroupPrivateClauseSkip<
 
     Syntax:
     ```
-    dyn_groupprivate(modifier_first ,modifier_second : size)
+    dyn_groupprivate(modifier_first ,modifier_second : dyn_groupprivate_size)
     ```
 
     Example:
     ```
-    omp.target dyn_groupprivate(strict, cgroup : %size : i32)
+    omp.target dyn_groupprivate(strict, cgroup : %dyn_groupprivate_size : i32)
     ```
   }];
 
   let optAssemblyFormat = [{
-  `dyn_groupprivate` `(`
-    $modifier_first `,` $modifier_second
-    `:` $size `:` type($size)
-  `)`
+    `dyn_groupprivate` `(`
+      ($modifier_first^)?
+      (`,` $modifier_second^)?
+      (`:` $dyn_groupprivate_size^ `:` type($dyn_groupprivate_size))?
+    `)`
   }];
 }
 
diff --git a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
index be114ea4fb631..c5ee82d245d67 100644
--- a/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
+++ b/mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td
@@ -241,7 +241,8 @@ def TeamsOp : OpenMP_Op<"teams", traits = [
     AttrSizedOperandSegments, RecursiveMemoryEffects, OutlineableOpenMPOpInterface
   ], clauses = [
     OpenMP_AllocateClause, OpenMP_IfClause, OpenMP_NumTeamsClause,
-    OpenMP_PrivateClause, OpenMP_ReductionClause, OpenMP_ThreadLimitClause
+    OpenMP_PrivateClause, OpenMP_ReductionClause, OpenMP_ThreadLimitClause,
+    OpenMP_DynGroupPrivateClause
   ], singleRegion = true> {
   let summary = "teams construct";
   let description = [{
@@ -1464,7 +1465,7 @@ def TargetOp : OpenMP_Op<"target", traits = [
     OpenMP_DeviceClause, OpenMP_HasDeviceAddrClause, OpenMP_HostEvalClause,
     OpenMP_IfClause, OpenMP_InReductionClause, OpenMP_IsDevicePtrClause,
     OpenMP_MapClauseSkip<assemblyFormat = true>, OpenMP_NowaitClause,
-    OpenMP_PrivateClause, OpenMP_ThreadLimitClause
+    OpenMP_PrivateClause, OpenMP_ThreadLimitClause, OpenMP_DynGroupPrivateClause
   ], singleRegion = true> {
   let summary = "target construct";
   let description = [{
diff --git a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
index c1c1767ef90b0..1dfca0231b945 100644
--- a/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
+++ b/mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp
@@ -1951,6 +1951,8 @@ void TargetOp::build(OpBuilder &builder, OperationState &state,
                   clauses.mapVars, clauses.nowait, clauses.privateVars,
                   makeArrayAttr(ctx, clauses.privateSyms),
                   clauses.privateNeedsBarrier, clauses.threadLimit,
+                  clauses.modifierFirst, clauses.modifierSecond,
+                  clauses.dynGroupprivateSize,
                   /*private_maps=*/nullptr);
 }
 
@@ -2340,7 +2342,8 @@ void TeamsOp::build(OpBuilder &builder, OperationState &state,
                  clauses.reductionVars,
                  makeDenseBoolArrayAttr(ctx, clauses.reductionByref),
                  makeArrayAttr(ctx, clauses.reductionSyms),
-                 clauses.threadLimit);
+                 clauses.threadLimit, clauses.modifierFirst,
+                 clauses.modifierSecond, clauses.dynGroupprivateSize);
 }
 
 LogicalResult TeamsOp::verify() {



More information about the Mlir-commits mailing list