Skip to content

Commit a936375

Browse files
committed
Changes for inscan reduction and scan op
1 parent e4dfb51 commit a936375

File tree

6 files changed

+223
-39
lines changed

6 files changed

+223
-39
lines changed

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

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,34 @@ class OpenMP_DoacrossClauseSkip<
283283

284284
def OpenMP_DoacrossClause : OpenMP_DoacrossClauseSkip<>;
285285

286+
//===----------------------------------------------------------------------===//
287+
// V5.2: [5.4.7] `exclusive` clause
288+
//===----------------------------------------------------------------------===//
289+
290+
class OpenMP_ExclusiveClauseSkip<
291+
bit traits = false, bit arguments = false, bit assemblyFormat = false,
292+
bit description = false, bit extraClassDeclaration = false
293+
> : OpenMP_Clause<traits, arguments, assemblyFormat, description,
294+
extraClassDeclaration> {
295+
let arguments = (ins
296+
Variadic<AnyType>:$exclusive_vars
297+
);
298+
299+
let optAssemblyFormat = [{
300+
`exclusive` `(` $exclusive_vars `:` type($exclusive_vars) `)`
301+
}];
302+
303+
let description = [{
304+
The exclusive clause is used on a separating directive that separates a
305+
structured block into two structured block sequences. If it
306+
is specified, the input phase excludes the preceding structured block
307+
sequence and instead includes the following structured block sequence,
308+
while the scan phase includes the preceding structured block sequence.
309+
}];
310+
}
311+
312+
def OpenMP_ExclusiveClause : OpenMP_ExclusiveClauseSkip<>;
313+
286314
//===----------------------------------------------------------------------===//
287315
// V5.2: [10.5.1] `filter` clause
288316
//===----------------------------------------------------------------------===//
@@ -393,6 +421,34 @@ class OpenMP_HasDeviceAddrClauseSkip<
393421

394422
def OpenMP_HasDeviceAddrClause : OpenMP_HasDeviceAddrClauseSkip<>;
395423

424+
//===----------------------------------------------------------------------===//
425+
// V5.2: [5.4.7] `inclusive` clause
426+
//===----------------------------------------------------------------------===//
427+
428+
class OpenMP_InclusiveClauseSkip<
429+
bit traits = false, bit arguments = false, bit assemblyFormat = false,
430+
bit description = false, bit extraClassDeclaration = false
431+
> : OpenMP_Clause<traits, arguments, assemblyFormat, description,
432+
extraClassDeclaration> {
433+
let arguments = (ins
434+
Variadic<AnyType>:$inclusive_vars
435+
);
436+
437+
let optAssemblyFormat = [{
438+
`inclusive` `(` $inclusive_vars `:` type($inclusive_vars) `)`
439+
}];
440+
441+
let description = [{
442+
The inclusive clause is used on a separating directive that separates a
443+
structured block into two structured block sequences. If it is specified,
444+
the input phase includes the preceding structured block sequence and the
445+
scan phase includes the following structured block sequence.
446+
}];
447+
}
448+
449+
def OpenMP_InclusiveClause : OpenMP_InclusiveClauseSkip<>;
450+
451+
396452
//===----------------------------------------------------------------------===//
397453
// V5.2: [15.1.2] `hint` clause
398454
//===----------------------------------------------------------------------===//
@@ -983,6 +1039,7 @@ class OpenMP_ReductionClauseSkip<
9831039
];
9841040

9851041
let arguments = (ins
1042+
OptionalAttr<ReductionModifierAttr>:$reduction_mod,
9861043
Variadic<OpenMP_PointerLikeType>:$reduction_vars,
9871044
OptionalAttr<DenseBoolArrayAttr>:$reduction_byref,
9881045
OptionalAttr<SymbolRefArrayAttr>:$reduction_syms

mlir/include/mlir/Dialect/OpenMP/OpenMPEnums.td

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,27 @@ def OrderModifier
178178
def OrderModifierAttr : EnumAttr<OpenMP_Dialect, OrderModifier,
179179
"order_mod">;
180180

181+
//===----------------------------------------------------------------------===//
182+
// reduction_modifier enum.
183+
//===----------------------------------------------------------------------===//
184+
185+
def ReductionModifierInScan : I32EnumAttrCase<"InScan", 0>;
186+
def ReductionModifierTask : I32EnumAttrCase<"Task", 1>;
187+
def ReductionModifierDefault : I32EnumAttrCase<"Default", 2>;
188+
189+
def ReductionModifier : OpenMP_I32EnumAttr<
190+
"ReductionModifier",
191+
"reduction modifier", [
192+
ReductionModifierInScan,
193+
ReductionModifierTask,
194+
ReductionModifierDefault
195+
]>;
196+
197+
def ReductionModifierAttr : OpenMP_EnumAttr<ReductionModifier,
198+
"reduction_modifier"> {
199+
let assemblyFormat = "`(` $value `)`";
200+
}
201+
181202
//===----------------------------------------------------------------------===//
182203
// sched_mod enum.
183204
//===----------------------------------------------------------------------===//

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

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ def ParallelOp : OpenMP_Op<"parallel", traits = [
170170

171171
let assemblyFormat = clausesAssemblyFormat # [{
172172
custom<PrivateReductionRegion>($region, $private_vars, type($private_vars),
173-
$private_syms, $reduction_vars, type($reduction_vars), $reduction_byref,
173+
$private_syms, $reduction_mod, $reduction_vars, type($reduction_vars), $reduction_byref,
174174
$reduction_syms) attr-dict
175175
}];
176176

@@ -215,7 +215,7 @@ def TeamsOp : OpenMP_Op<"teams", traits = [
215215

216216
let assemblyFormat = clausesAssemblyFormat # [{
217217
custom<PrivateReductionRegion>($region, $private_vars, type($private_vars),
218-
$private_syms, $reduction_vars, type($reduction_vars), $reduction_byref,
218+
$private_syms, $reduction_mod, $reduction_vars, type($reduction_vars), $reduction_byref,
219219
$reduction_syms) attr-dict
220220
}];
221221

@@ -274,7 +274,7 @@ def SectionsOp : OpenMP_Op<"sections", traits = [
274274

275275
let assemblyFormat = clausesAssemblyFormat # [{
276276
custom<PrivateReductionRegion>($region, $private_vars, type($private_vars),
277-
$private_syms, $reduction_vars, type($reduction_vars), $reduction_byref,
277+
$private_syms, $reduction_mod, $reduction_vars, type($reduction_vars), $reduction_byref,
278278
$reduction_syms) attr-dict
279279
}];
280280

@@ -422,7 +422,7 @@ def WsloopOp : OpenMP_Op<"wsloop", traits = [
422422

423423
let assemblyFormat = clausesAssemblyFormat # [{
424424
custom<PrivateReductionRegion>($region, $private_vars, type($private_vars),
425-
$private_syms, $reduction_vars, type($reduction_vars), $reduction_byref,
425+
$private_syms, $reduction_mod, $reduction_vars, type($reduction_vars), $reduction_byref,
426426
$reduction_syms) attr-dict
427427
}];
428428

@@ -476,7 +476,7 @@ def SimdOp : OpenMP_Op<"simd", traits = [
476476

477477
let assemblyFormat = clausesAssemblyFormat # [{
478478
custom<PrivateReductionRegion>($region, $private_vars, type($private_vars),
479-
$private_syms, $reduction_vars, type($reduction_vars), $reduction_byref,
479+
$private_syms, $reduction_mod, $reduction_vars, type($reduction_vars), $reduction_byref,
480480
$reduction_syms) attr-dict
481481
}];
482482

@@ -680,7 +680,7 @@ def TaskloopOp : OpenMP_Op<"taskloop", traits = [
680680
custom<InReductionPrivateReductionRegion>(
681681
$region, $in_reduction_vars, type($in_reduction_vars),
682682
$in_reduction_byref, $in_reduction_syms, $private_vars,
683-
type($private_vars), $private_syms, $reduction_vars,
683+
type($private_vars), $private_syms, $reduction_mod, $reduction_vars,
684684
type($reduction_vars), $reduction_byref, $reduction_syms) attr-dict
685685
}];
686686

@@ -1560,6 +1560,26 @@ def CancellationPointOp : OpenMP_Op<"cancellation_point", clauses = [
15601560
let hasVerifier = 1;
15611561
}
15621562

1563+
def ScanOp : OpenMP_Op<"scan", [
1564+
AttrSizedOperandSegments, RecipeInterface, IsolatedFromAbove
1565+
], clauses = [
1566+
OpenMP_InclusiveClause, OpenMP_ExclusiveClause]> {
1567+
let summary = "scan directive";
1568+
let description = [{
1569+
The scan directive allows to specify scan reduction. Scan directive
1570+
should be enclosed with in a parent directive along with which , a
1571+
reduction clause with `InScan` modifier must be specified. Scan directive
1572+
allows to separate code blocks to input phase and scan phase in the region
1573+
enclosed by the parent.
1574+
}] # clausesDescription;
1575+
1576+
let builders = [
1577+
OpBuilder<(ins CArg<"const ScanOperands &">:$clauses)>
1578+
];
1579+
1580+
let hasVerifier = 1;
1581+
}
1582+
15631583
//===----------------------------------------------------------------------===//
15641584
// 2.19.5.7 declare reduction Directive
15651585
//===----------------------------------------------------------------------===//

mlir/lib/Conversion/SCFToOpenMP/SCFToOpenMP.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ struct ParallelOpLowering : public OpRewritePattern<scf::ParallelOp> {
451451
/* private_vars = */ ValueRange(),
452452
/* private_syms = */ nullptr,
453453
/* proc_bind_kind = */ omp::ClauseProcBindKindAttr{},
454+
/* reduction_mod = */ nullptr,
454455
/* reduction_vars = */ llvm::SmallVector<Value>{},
455456
/* reduction_byref = */ DenseBoolArrayAttr{},
456457
/* reduction_syms = */ ArrayAttr{});

0 commit comments

Comments
 (0)