Skip to content

Commit ba1c575

Browse files
committed
[MLIR][omp] Add omp.workshare op
1 parent 1c5f6cf commit ba1c575

File tree

3 files changed

+38
-0
lines changed

3 files changed

+38
-0
lines changed

mlir/include/mlir/Dialect/OpenMP/OpenMPClauseOperands.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
#include "mlir/IR/BuiltinAttributes.h"
1919
#include "llvm/ADT/SmallVector.h"
20+
#include <mlir/Dialect/OpenMP/OpenMPDialect.h>
2021

2122
#include "mlir/Dialect/OpenMP/OpenMPOpsEnums.h.inc"
2223

@@ -316,6 +317,8 @@ using TeamsOperands =
316317
detail::Clauses<AllocateClauseOps, IfClauseOps, NumTeamsClauseOps,
317318
PrivateClauseOps, ReductionClauseOps, ThreadLimitClauseOps>;
318319

320+
using WorkshareOperands = detail::Clauses<NowaitClauseOps>;
321+
319322
using WsloopOperands =
320323
detail::Clauses<AllocateClauseOps, LinearClauseOps, NowaitClauseOps,
321324
OrderClauseOps, OrderedClauseOps, PrivateClauseOps,

mlir/include/mlir/Dialect/OpenMP/OpenMPOps.td

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,28 @@ def SingleOp : OpenMP_Op<"single", traits = [
286286
let hasVerifier = 1;
287287
}
288288

289+
//===----------------------------------------------------------------------===//
290+
// 2.8.3 Workshare Construct
291+
//===----------------------------------------------------------------------===//
292+
293+
def WorkshareOp : OpenMP_Op<"workshare", clauses = [
294+
OpenMP_NowaitClause,
295+
], singleRegion = true> {
296+
let summary = "workshare directive";
297+
let description = [{
298+
The workshare construct divides the execution of the enclosed structured
299+
block into separate units of work, and causes the threads of the team to
300+
share the work such that each unit is executed only once by one thread, in
301+
the context of its implicit task
302+
}] # clausesDescription;
303+
304+
let builders = [
305+
OpBuilder<(ins CArg<"const WorkshareOperands &">:$clauses)>
306+
];
307+
308+
let hasVerifier = 1;
309+
}
310+
289311
//===----------------------------------------------------------------------===//
290312
// Loop Nest
291313
//===----------------------------------------------------------------------===//

mlir/lib/Dialect/OpenMP/IR/OpenMPDialect.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1683,6 +1683,19 @@ LogicalResult SingleOp::verify() {
16831683
getCopyprivateSyms());
16841684
}
16851685

1686+
//===----------------------------------------------------------------------===//
1687+
// WorkshareOp
1688+
//===----------------------------------------------------------------------===//
1689+
1690+
void WorkshareOp::build(OpBuilder &builder, OperationState &state,
1691+
const WorkshareOperands &clauses) {
1692+
WorkshareOp::build(builder, state, clauses.nowait);
1693+
}
1694+
1695+
LogicalResult WorkshareOp::verify() {
1696+
return (*this)->getRegion(0).getBlocks().size() == 1 ? success() : failure();
1697+
}
1698+
16861699
//===----------------------------------------------------------------------===//
16871700
// WsloopOp
16881701
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)