Skip to content

Commit 28305ec

Browse files
committed
Adding MLIR Op definition for scan
1 parent ab82f83 commit 28305ec

File tree

5 files changed

+95
-0
lines changed

5 files changed

+95
-0
lines changed

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,13 @@ struct IfClauseOps {
105105
Value ifVar;
106106
};
107107

108+
struct InclusiveClauseOps {
109+
llvm::SmallVector<Value> inclusiveVars;
110+
};
111+
112+
struct ExclusiveClauseOps {
113+
llvm::SmallVector<Value> exclusiveVars;
114+
};
108115
struct InReductionClauseOps {
109116
llvm::SmallVector<Value> inReductionVars;
110117
llvm::SmallVector<bool> inReductionByref;
@@ -261,6 +268,8 @@ using LoopNestOperands = detail::Clauses<LoopRelatedOps>;
261268

262269
using MaskedOperands = detail::Clauses<FilterClauseOps>;
263270

271+
using ScanOperands = detail::Clauses<InclusiveClauseOps, ExclusiveClauseOps>;
272+
264273
using OrderedOperands = detail::Clauses<DoacrossClauseOps>;
265274

266275
using OrderedRegionOperands = detail::Clauses<ParallelizationLevelClauseOps>;

mlir/include/mlir/Dialect/OpenMP/OpenMPClauses.td

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,61 @@ class OpenMP_IsDevicePtrClauseSkip<
503503

504504
def OpenMP_IsDevicePtrClause : OpenMP_IsDevicePtrClauseSkip<>;
505505

506+
//===----------------------------------------------------------------------===//
507+
// V5.2: [5.4.7] `inclusive` clause
508+
//===----------------------------------------------------------------------===//
509+
510+
class OpenMP_InclusiveClauseSkip<
511+
bit traits = false, bit arguments = false, bit assemblyFormat = false,
512+
bit description = false, bit extraClassDeclaration = false
513+
> : OpenMP_Clause</*isRequired=*/false, traits, arguments, assemblyFormat,
514+
description, extraClassDeclaration> {
515+
let arguments = (ins
516+
Variadic<AnyType>:$inclusive_vars
517+
);
518+
519+
let assemblyFormat = [{
520+
`inclusive` `(` $inclusive_vars `:` type($inclusive_vars) `)`
521+
}];
522+
523+
let description = [{
524+
The inclusive clause is used on a separating directive that separates a
525+
structured block into two structured block sequences. If the inclusive
526+
clause is specified, the input phase includes the preceding structured block
527+
sequence and the scan phase includes the following structured block sequence.
528+
}];
529+
}
530+
531+
def OpenMP_InclusiveClause : OpenMP_InclusiveClauseSkip<>;
532+
533+
//===----------------------------------------------------------------------===//
534+
// V5.2: [5.4.7] `exclusive` clause
535+
//===----------------------------------------------------------------------===//
536+
537+
class OpenMP_ExclusiveClauseSkip<
538+
bit traits = false, bit arguments = false, bit assemblyFormat = false,
539+
bit description = false, bit extraClassDeclaration = false
540+
> : OpenMP_Clause</*isRequired=*/false, traits, arguments, assemblyFormat,
541+
description, extraClassDeclaration> {
542+
let arguments = (ins
543+
Variadic<AnyType>:$exclusive_vars
544+
);
545+
546+
let assemblyFormat = [{
547+
`exclusive` `(` $exclusive_vars `:` type($exclusive_vars) `)`
548+
}];
549+
550+
let description = [{
551+
The exclusive clause is used on a separating directive that separates a
552+
structured block into two structured block sequences. If the exclusive clause
553+
is specified, the input phase excludes the preceding structured block
554+
sequence and instead includes the following structured block sequence,
555+
while the scan phase includes the preceding structured block sequence.
556+
}];
557+
}
558+
559+
def OpenMP_ExclusiveClause : OpenMP_ExclusiveClauseSkip<>;
560+
506561
//===----------------------------------------------------------------------===//
507562
// V5.2: [5.4.6] `linear` clause
508563
//===----------------------------------------------------------------------===//

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,6 +1202,20 @@ def OrderedRegionOp : OpenMP_Op<"ordered.region", clauses = [
12021202
let hasVerifier = 1;
12031203
}
12041204

1205+
def ScanOp : OpenMP_Op<"scan", traits = [
1206+
AttrSizedOperandSegments
1207+
], clauses = [OpenMP_InclusiveClause, OpenMP_ExclusiveClause]> {
1208+
let summary = "scan construct with the region";
1209+
let description = [{
1210+
The scan without region is a stand-alone directive that
1211+
}] # clausesDescription;
1212+
1213+
let builders = [
1214+
OpBuilder<(ins CArg<"const ScanOperands &">:$clauses)>
1215+
];
1216+
1217+
}
1218+
12051219
//===----------------------------------------------------------------------===//
12061220
// 2.17.5 taskwait Construct
12071221
//===----------------------------------------------------------------------===//

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2619,6 +2619,15 @@ LogicalResult PrivateClauseOp::verify() {
26192619
return success();
26202620
}
26212621

2622+
//===----------------------------------------------------------------------===//
2623+
// Spec 5.2: Scan construct (5.6)
2624+
//===----------------------------------------------------------------------===//
2625+
2626+
void ScanOp::build(OpBuilder &builder, OperationState &state,
2627+
const ScanOperands &clauses) {
2628+
ScanOp::build(builder, state, clauses.inclusiveVars, clauses.exclusiveVars);
2629+
}
2630+
26222631
//===----------------------------------------------------------------------===//
26232632
// Spec 5.2: Masked construct (10.5)
26242633
//===----------------------------------------------------------------------===//

mlir/test/Dialect/OpenMP/ops.mlir

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ func.func @omp_masked(%filtered_thread_id : i32) -> () {
3030
return
3131
}
3232

33+
func.func @omp_scan(%arg0 : memref<i32>) -> () {
34+
// CHECK: omp.scan inclusive(%{{.*}} : memref<i32>)
35+
omp.scan inclusive(%arg0 : memref<i32>)
36+
// CHECK: omp.scan exclusive(%{{.*}} : memref<i32>)
37+
omp.scan exclusive(%arg0 : memref<i32>)
38+
return
39+
}
40+
3341
func.func @omp_taskwait() -> () {
3442
// CHECK: omp.taskwait
3543
omp.taskwait

0 commit comments

Comments
 (0)