Skip to content

Commit 232aa13

Browse files
committed
[MLIR][omp] Add omp.workshare op
1 parent 87eeed1 commit 232aa13

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
@@ -287,6 +287,28 @@ def SingleOp : OpenMP_Op<"single", traits = [
287287
let hasVerifier = 1;
288288
}
289289

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

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1689,6 +1689,19 @@ LogicalResult SingleOp::verify() {
16891689
getCopyprivateSyms());
16901690
}
16911691

1692+
//===----------------------------------------------------------------------===//
1693+
// WorkshareOp
1694+
//===----------------------------------------------------------------------===//
1695+
1696+
void WorkshareOp::build(OpBuilder &builder, OperationState &state,
1697+
const WorkshareOperands &clauses) {
1698+
WorkshareOp::build(builder, state, clauses.nowait);
1699+
}
1700+
1701+
LogicalResult WorkshareOp::verify() {
1702+
return (*this)->getRegion(0).getBlocks().size() == 1 ? success() : failure();
1703+
}
1704+
16921705
//===----------------------------------------------------------------------===//
16931706
// WsloopOp
16941707
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)