Skip to content

Commit 9dd5543

Browse files
committed
[MLIR][OpenMP] NFC: Split OpenMP dialect definitions
This patch splits definitions for the OpenMP dialect into multiple files to simplify the addition of new features, reduce merge conflicts, make it easier to understand, etc. The split is based on the structure of the more mature LLVMIR dialect. Even though this change should be useful on its own, it is intended as a precursor to a follow-up PR in which operation arguments and attributes are split into clause-specific classes which are then shared by all operations to which they apply to. Without this prior change, that approach would make the OpenMPOps.td file harder to navigate.
1 parent 561b6ab commit 9dd5543

File tree

6 files changed

+371
-240
lines changed

6 files changed

+371
-240
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
//=== OpenMPAttrDefs.td - OpenMP Attributes definition -----*- tablegen -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef OPENMP_ATTR_DEFS
10+
#define OPENMP_ATTR_DEFS
11+
12+
include "mlir/Dialect/OpenMP/OpenMPDialect.td"
13+
include "mlir/Dialect/OpenMP/OpenMPEnums.td"
14+
include "mlir/Dialect/OpenMP/OpenMPOpsInterfaces.td"
15+
include "mlir/Dialect/OpenMP/OpenMPTypeInterfaces.td"
16+
include "mlir/IR/AttrTypeBase.td"
17+
include "mlir/IR/CommonAttrConstraints.td"
18+
19+
class OpenMP_Attr<string name, string attrMnemonic, list<Trait> traits = [],
20+
string baseCppClass = "::mlir::Attribute">
21+
: AttrDef<OpenMP_Dialect, name, traits, baseCppClass> {
22+
let mnemonic = attrMnemonic;
23+
}
24+
25+
//===----------------------------------------------------------------------===//
26+
// DeclareTargetAttr
27+
//===----------------------------------------------------------------------===//
28+
29+
def DeclareTargetAttr : OpenMP_Attr<"DeclareTarget", "declaretarget"> {
30+
let parameters = (ins
31+
OptionalParameter<"DeclareTargetDeviceTypeAttr">:$device_type,
32+
OptionalParameter<"DeclareTargetCaptureClauseAttr">:$capture_clause
33+
);
34+
35+
let assemblyFormat = "`<` struct(params) `>`";
36+
}
37+
38+
//===----------------------------------------------------------------------===//
39+
// FlagsAttr
40+
//===----------------------------------------------------------------------===//
41+
42+
// Runtime library flags attribute that holds information for lowering to LLVM.
43+
def FlagsAttr : OpenMP_Attr<"Flags", "flags"> {
44+
let parameters = (ins
45+
DefaultValuedParameter<"uint32_t", "0">:$debug_kind,
46+
DefaultValuedParameter<"bool", "false">:$assume_teams_oversubscription,
47+
DefaultValuedParameter<"bool", "false">:$assume_threads_oversubscription,
48+
DefaultValuedParameter<"bool", "false">:$assume_no_thread_state,
49+
DefaultValuedParameter<"bool", "false">:$assume_no_nested_parallelism,
50+
DefaultValuedParameter<"bool", "false">:$no_gpu_lib,
51+
DefaultValuedParameter<"uint32_t", "50">:$openmp_device_version
52+
);
53+
54+
let assemblyFormat = "`<` struct(params) `>`";
55+
}
56+
57+
//===----------------------------------------------------------------------===//
58+
// TaskDependArrayAttr
59+
//===----------------------------------------------------------------------===//
60+
61+
def TaskDependArrayAttr
62+
: TypedArrayAttrBase<ClauseTaskDependAttr,
63+
ClauseTaskDependAttr.summary # " array"> {
64+
let constBuilderCall = ?;
65+
}
66+
67+
//===----------------------------------------------------------------------===//
68+
// VersionAttr
69+
//===----------------------------------------------------------------------===//
70+
71+
def VersionAttr : OpenMP_Attr<"Version", "version"> {
72+
let parameters = (ins
73+
"uint32_t":$version
74+
);
75+
76+
let assemblyFormat = "`<` struct(params) `>`";
77+
}
78+
79+
#endif // OPENMP_ATTR_DEFS
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//===- OpenMPDialect.td - OpenMP dialect definition --------*- tablegen -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef OPENMP_DIALECT
10+
#define OPENMP_DIALECT
11+
12+
include "mlir/IR/DialectBase.td"
13+
14+
def OpenMP_Dialect : Dialect {
15+
let name = "omp";
16+
let cppNamespace = "::mlir::omp";
17+
let dependentDialects = ["::mlir::LLVM::LLVMDialect, ::mlir::func::FuncDialect"];
18+
let useDefaultAttributePrinterParser = 1;
19+
let useDefaultTypePrinterParser = 1;
20+
}
21+
22+
#endif // OPENMP_DIALECT
Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
//===-- OpenMPEnums.td - OpenMP dialect enum file ----------*- tablegen -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
9+
#ifndef OPENMP_ENUMS
10+
#define OPENMP_ENUMS
11+
12+
include "mlir/Dialect/OpenMP/OpenMPDialect.td"
13+
include "mlir/IR/EnumAttr.td"
14+
15+
include "mlir/Dialect/OpenMP/OmpCommon.td"
16+
17+
//===----------------------------------------------------------------------===//
18+
// Base classes for OpenMP enum attributes.
19+
//===----------------------------------------------------------------------===//
20+
21+
class OpenMP_I32EnumAttr<string name, string summary,
22+
list<I32EnumAttrCase> cases>
23+
: I32EnumAttr<name, summary, cases> {
24+
let genSpecializedAttr = 0;
25+
let cppNamespace = "::mlir::omp";
26+
}
27+
28+
class OpenMP_BitEnumAttr<string name, string summary,
29+
list<BitEnumAttrCaseBase> cases>
30+
: I32BitEnumAttr<name, summary, cases> {
31+
let genSpecializedAttr = 0;
32+
let cppNamespace = "::mlir::omp";
33+
}
34+
35+
class OpenMP_EnumAttr<EnumAttrInfo enumInfo, string name>
36+
: EnumAttr<OpenMP_Dialect, enumInfo, name>;
37+
38+
39+
//===----------------------------------------------------------------------===//
40+
// capture_clause enum.
41+
//===----------------------------------------------------------------------===//
42+
43+
def CaptureClauseTo : I32EnumAttrCase<"to", 0>;
44+
def CaptureClauseLink : I32EnumAttrCase<"link", 1>;
45+
def CaptureClauseEnter : I32EnumAttrCase<"enter", 2>;
46+
47+
def DeclareTargetCaptureClause : OpenMP_I32EnumAttr<
48+
"DeclareTargetCaptureClause",
49+
"capture clause", [
50+
CaptureClauseTo,
51+
CaptureClauseLink,
52+
CaptureClauseEnter
53+
]>;
54+
55+
def DeclareTargetCaptureClauseAttr : OpenMP_EnumAttr<DeclareTargetCaptureClause,
56+
"capture_clause"> {
57+
let assemblyFormat = "`(` $value `)`";
58+
}
59+
60+
//===----------------------------------------------------------------------===//
61+
// clause_depend enum.
62+
//===----------------------------------------------------------------------===//
63+
64+
def ClauseDependSource : I32EnumAttrCase<"dependsource", 0>;
65+
def ClauseDependSink : I32EnumAttrCase<"dependsink", 1>;
66+
67+
def ClauseDepend : OpenMP_I32EnumAttr<
68+
"ClauseDepend",
69+
"depend clause", [
70+
ClauseDependSource,
71+
ClauseDependSink
72+
]>;
73+
74+
def ClauseDependAttr : OpenMP_EnumAttr<ClauseDepend, "clause_depend"> {
75+
let assemblyFormat = "`(` $value `)`";
76+
}
77+
78+
//===----------------------------------------------------------------------===//
79+
// clause_requires enum.
80+
//===----------------------------------------------------------------------===//
81+
82+
// atomic_default_mem_order clause values not defined here because they can be
83+
// represented by the OMPC_MemoryOrder enumeration instead.
84+
def ClauseRequiresNone : I32BitEnumAttrCaseNone<"none">;
85+
def ClauseRequiresReverseOffload : I32BitEnumAttrCaseBit<"reverse_offload", 0>;
86+
def ClauseRequiresUnifiedAddress : I32BitEnumAttrCaseBit<"unified_address", 1>;
87+
def ClauseRequiresUnifiedSharedMemory
88+
: I32BitEnumAttrCaseBit<"unified_shared_memory", 2>;
89+
def ClauseRequiresDynamicAllocators
90+
: I32BitEnumAttrCaseBit<"dynamic_allocators", 3>;
91+
92+
def ClauseRequires : OpenMP_BitEnumAttr<
93+
"ClauseRequires",
94+
"requires clauses", [
95+
ClauseRequiresNone,
96+
ClauseRequiresReverseOffload,
97+
ClauseRequiresUnifiedAddress,
98+
ClauseRequiresUnifiedSharedMemory,
99+
ClauseRequiresDynamicAllocators
100+
]>;
101+
102+
def ClauseRequiresAttr : OpenMP_EnumAttr<ClauseRequires, "clause_requires">;
103+
104+
//===----------------------------------------------------------------------===//
105+
// clause_task_depend enum.
106+
//===----------------------------------------------------------------------===//
107+
108+
def ClauseTaskDependIn : I32EnumAttrCase<"taskdependin", 0>;
109+
def ClauseTaskDependOut : I32EnumAttrCase<"taskdependout", 1>;
110+
def ClauseTaskDependInOut : I32EnumAttrCase<"taskdependinout", 2>;
111+
112+
def ClauseTaskDepend : OpenMP_I32EnumAttr<
113+
"ClauseTaskDepend",
114+
"depend clause in a target or task construct", [
115+
ClauseTaskDependIn,
116+
ClauseTaskDependOut,
117+
ClauseTaskDependInOut
118+
]>;
119+
120+
def ClauseTaskDependAttr : OpenMP_EnumAttr<ClauseTaskDepend,
121+
"clause_task_depend"> {
122+
let assemblyFormat = "`(` $value `)`";
123+
}
124+
125+
//===----------------------------------------------------------------------===//
126+
// data_sharing_type enum.
127+
//===----------------------------------------------------------------------===//
128+
129+
def DataSharingTypePrivate : I32EnumAttrCase<"Private", 0, "private">;
130+
def DataSharingTypeFirstPrivate
131+
: I32EnumAttrCase<"FirstPrivate", 1, "firstprivate">;
132+
133+
def DataSharingClauseType : OpenMP_I32EnumAttr<
134+
"DataSharingClauseType",
135+
"Type of a data-sharing clause", [
136+
DataSharingTypePrivate,
137+
DataSharingTypeFirstPrivate
138+
]>;
139+
140+
def DataSharingClauseTypeAttr : OpenMP_EnumAttr<DataSharingClauseType,
141+
"data_sharing_type"> {
142+
let assemblyFormat = "`{` `type` `=` $value `}`";
143+
}
144+
145+
//===----------------------------------------------------------------------===//
146+
// device_type enum.
147+
//===----------------------------------------------------------------------===//
148+
149+
def DeviceTypeAny : I32EnumAttrCase<"any", 0>;
150+
def DeviceTypeHost : I32EnumAttrCase<"host", 1>;
151+
def DeviceTypeNoHost : I32EnumAttrCase<"nohost", 2>;
152+
153+
def DeclareTargetDeviceType : OpenMP_I32EnumAttr<
154+
"DeclareTargetDeviceType",
155+
"device_type clause", [
156+
DeviceTypeAny,
157+
DeviceTypeHost,
158+
DeviceTypeNoHost
159+
]>;
160+
161+
def DeclareTargetDeviceTypeAttr : OpenMP_EnumAttr<DeclareTargetDeviceType,
162+
"device_type"> {
163+
let assemblyFormat = "`(` $value `)`";
164+
}
165+
166+
//===----------------------------------------------------------------------===//
167+
// sched_mod enum.
168+
//===----------------------------------------------------------------------===//
169+
170+
def OpenMP_ScheduleModNone : I32EnumAttrCase<"none", 0>;
171+
def OpenMP_ScheduleModMonotonic : I32EnumAttrCase<"monotonic", 1>;
172+
def OpenMP_ScheduleModNonmonotonic : I32EnumAttrCase<"nonmonotonic", 2>;
173+
// FIXME: remove this value for the modifier because this is handled using a
174+
// separate attribute
175+
def OpenMP_ScheduleModSimd : I32EnumAttrCase<"simd", 3>;
176+
177+
def ScheduleModifier : OpenMP_I32EnumAttr<
178+
"ScheduleModifier",
179+
"OpenMP Schedule Modifier", [
180+
OpenMP_ScheduleModNone,
181+
OpenMP_ScheduleModMonotonic,
182+
OpenMP_ScheduleModNonmonotonic,
183+
OpenMP_ScheduleModSimd
184+
]>;
185+
186+
def ScheduleModifierAttr : OpenMP_EnumAttr<ScheduleModifier, "sched_mod">;
187+
188+
//===----------------------------------------------------------------------===//
189+
// variable_capture_kind enum.
190+
//===----------------------------------------------------------------------===//
191+
192+
def CaptureThis : I32EnumAttrCase<"This", 0>;
193+
def CaptureByRef : I32EnumAttrCase<"ByRef", 1>;
194+
def CaptureByCopy : I32EnumAttrCase<"ByCopy", 2>;
195+
def CaptureVLAType : I32EnumAttrCase<"VLAType", 3>;
196+
197+
def VariableCaptureKind : OpenMP_I32EnumAttr<
198+
"VariableCaptureKind",
199+
"variable capture kind", [
200+
CaptureThis,
201+
CaptureByRef,
202+
CaptureByCopy,
203+
CaptureVLAType
204+
]>;
205+
206+
def VariableCaptureKindAttr : OpenMP_EnumAttr<VariableCaptureKind,
207+
"variable_capture_kind"> {
208+
let assemblyFormat = "`(` $value `)`";
209+
}
210+
211+
#endif // OPENMP_ENUMS
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
//===- OpenMPOpBase.td - OpenMP dialect shared definitions -*- tablegen -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This file contains shared definitions for the OpenMP dialect.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#ifndef OPENMP_OP_BASE
14+
#define OPENMP_OP_BASE
15+
16+
include "mlir/Dialect/OpenMP/OpenMPAttrDefs.td"
17+
include "mlir/Dialect/OpenMP/OpenMPDialect.td"
18+
include "mlir/Dialect/OpenMP/OpenMPOpsInterfaces.td"
19+
include "mlir/Dialect/OpenMP/OpenMPTypeInterfaces.td"
20+
include "mlir/IR/OpBase.td"
21+
22+
//===----------------------------------------------------------------------===//
23+
// OpenMP dialect type constraints.
24+
//===----------------------------------------------------------------------===//
25+
26+
class OpenMP_Type<string name, string typeMnemonic> :
27+
TypeDef<OpenMP_Dialect, name> {
28+
let mnemonic = typeMnemonic;
29+
}
30+
31+
// Type which can be constraint accepting standard integers and indices.
32+
def IntLikeType : AnyTypeOf<[AnyInteger, Index]>;
33+
34+
def OpenMP_PointerLikeType : TypeAlias<OpenMP_PointerLikeTypeInterface,
35+
"OpenMP-compatible variable type">;
36+
37+
def OpenMP_MapBoundsType : OpenMP_Type<"MapBounds", "map_bounds_ty"> {
38+
let summary = "Type for representing omp map clause bounds information";
39+
}
40+
41+
//===----------------------------------------------------------------------===//
42+
// Base classes for OpenMP dialect operations.
43+
//===----------------------------------------------------------------------===//
44+
45+
class OpenMP_Op<string mnemonic, list<Trait> traits = []> :
46+
Op<OpenMP_Dialect, mnemonic, traits>;
47+
48+
#endif // OPENMP_OP_BASE

0 commit comments

Comments
 (0)