[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