|
23 | 23 | #define GET_ATTRDEF_CLASSES
|
24 | 24 | #include "mlir/Dialect/OpenMP/OpenMPOpsAttributes.h.inc"
|
25 | 25 |
|
| 26 | +#include "mlir/Dialect/OpenMP/OpenMPClauseOps.h.inc" |
| 27 | + |
26 | 28 | namespace mlir {
|
27 | 29 | namespace omp {
|
28 | 30 |
|
29 | 31 | //===----------------------------------------------------------------------===//
|
30 |
| -// Mixin structures defining MLIR operands associated with each OpenMP clause. |
| 32 | +// Extra clause operand structures. |
31 | 33 | //===----------------------------------------------------------------------===//
|
32 | 34 |
|
33 |
| -struct AlignedClauseOps { |
34 |
| - llvm::SmallVector<Value> alignedVars; |
35 |
| - llvm::SmallVector<Attribute> alignments; |
36 |
| -}; |
37 |
| - |
38 |
| -struct AllocateClauseOps { |
39 |
| - llvm::SmallVector<Value> allocateVars, allocatorVars; |
40 |
| -}; |
41 |
| - |
42 |
| -struct CancelDirectiveNameClauseOps { |
43 |
| - ClauseCancellationConstructTypeAttr cancelDirective; |
44 |
| -}; |
45 |
| - |
46 |
| -struct CopyprivateClauseOps { |
47 |
| - llvm::SmallVector<Value> copyprivateVars; |
48 |
| - llvm::SmallVector<Attribute> copyprivateSyms; |
49 |
| -}; |
50 |
| - |
51 |
| -struct CriticalNameClauseOps { |
52 |
| - /// This field has a generic name because it's mirroring the `sym_name` |
53 |
| - /// argument of the `OpenMP_CriticalNameClause` tablegen definition. That one |
54 |
| - /// can't be renamed to anything more specific because the `sym_name` name is |
55 |
| - /// a requirement of the `Symbol` MLIR trait associated with that clause. |
56 |
| - StringAttr symName; |
57 |
| -}; |
58 |
| - |
59 |
| -struct DependClauseOps { |
60 |
| - llvm::SmallVector<Attribute> dependKinds; |
61 |
| - llvm::SmallVector<Value> dependVars; |
62 |
| -}; |
63 |
| - |
64 |
| -struct DeviceClauseOps { |
65 |
| - Value device; |
66 |
| -}; |
67 |
| - |
68 | 35 | struct DeviceTypeClauseOps {
|
69 |
| - // The default capture type. |
| 36 | + /// The default capture type. |
70 | 37 | DeclareTargetDeviceType deviceType = DeclareTargetDeviceType::any;
|
71 | 38 | };
|
72 | 39 |
|
73 |
| -struct DistScheduleClauseOps { |
74 |
| - UnitAttr distScheduleStatic; |
75 |
| - Value distScheduleChunkSize; |
76 |
| -}; |
77 |
| - |
78 |
| -struct DoacrossClauseOps { |
79 |
| - ClauseDependAttr doacrossDependType; |
80 |
| - IntegerAttr doacrossNumLoops; |
81 |
| - llvm::SmallVector<Value> doacrossDependVars; |
82 |
| -}; |
83 |
| - |
84 |
| -struct FilterClauseOps { |
85 |
| - Value filteredThreadId; |
86 |
| -}; |
87 |
| - |
88 |
| -struct FinalClauseOps { |
89 |
| - Value final; |
90 |
| -}; |
91 |
| - |
92 |
| -struct GrainsizeClauseOps { |
93 |
| - Value grainsize; |
94 |
| -}; |
95 |
| - |
96 |
| -struct HasDeviceAddrClauseOps { |
97 |
| - llvm::SmallVector<Value> hasDeviceAddrVars; |
98 |
| -}; |
99 |
| - |
100 |
| -struct HintClauseOps { |
101 |
| - IntegerAttr hint; |
102 |
| -}; |
103 |
| - |
104 |
| -struct IfClauseOps { |
105 |
| - Value ifVar; |
106 |
| -}; |
107 |
| - |
108 |
| -struct InReductionClauseOps { |
109 |
| - llvm::SmallVector<Value> inReductionVars; |
110 |
| - llvm::SmallVector<bool> inReductionByref; |
111 |
| - llvm::SmallVector<Attribute> inReductionSyms; |
112 |
| -}; |
113 |
| - |
114 |
| -struct IsDevicePtrClauseOps { |
115 |
| - llvm::SmallVector<Value> isDevicePtrVars; |
116 |
| -}; |
117 |
| - |
118 |
| -struct LinearClauseOps { |
119 |
| - llvm::SmallVector<Value> linearVars, linearStepVars; |
120 |
| -}; |
121 |
| - |
122 |
| -struct LoopRelatedOps { |
123 |
| - llvm::SmallVector<Value> loopLowerBounds, loopUpperBounds, loopSteps; |
124 |
| - UnitAttr loopInclusive; |
125 |
| -}; |
126 |
| - |
127 |
| -struct MapClauseOps { |
128 |
| - llvm::SmallVector<Value> mapVars; |
129 |
| -}; |
130 |
| - |
131 |
| -struct MergeableClauseOps { |
132 |
| - UnitAttr mergeable; |
133 |
| -}; |
134 |
| - |
135 |
| -struct NogroupClauseOps { |
136 |
| - UnitAttr nogroup; |
137 |
| -}; |
138 |
| - |
139 |
| -struct NontemporalClauseOps { |
140 |
| - llvm::SmallVector<Value> nontemporalVars; |
141 |
| -}; |
142 |
| - |
143 |
| -struct NowaitClauseOps { |
144 |
| - UnitAttr nowait; |
145 |
| -}; |
146 |
| - |
147 |
| -struct NumTasksClauseOps { |
148 |
| - Value numTasks; |
149 |
| -}; |
150 |
| - |
151 |
| -struct NumTeamsClauseOps { |
152 |
| - Value numTeamsLower, numTeamsUpper; |
153 |
| -}; |
154 |
| - |
155 |
| -struct NumThreadsClauseOps { |
156 |
| - Value numThreads; |
157 |
| -}; |
158 |
| - |
159 |
| -struct OrderClauseOps { |
160 |
| - ClauseOrderKindAttr order; |
161 |
| - OrderModifierAttr orderMod; |
162 |
| -}; |
163 |
| - |
164 |
| -struct OrderedClauseOps { |
165 |
| - IntegerAttr ordered; |
166 |
| -}; |
167 |
| - |
168 |
| -struct ParallelizationLevelClauseOps { |
169 |
| - UnitAttr parLevelSimd; |
170 |
| -}; |
171 |
| - |
172 |
| -struct PriorityClauseOps { |
173 |
| - Value priority; |
174 |
| -}; |
175 |
| - |
176 |
| -struct PrivateClauseOps { |
177 |
| - // SSA values that correspond to "original" values being privatized. |
178 |
| - // They refer to the SSA value outside the OpenMP region from which a clone is |
179 |
| - // created inside the region. |
180 |
| - llvm::SmallVector<Value> privateVars; |
181 |
| - // The list of symbols referring to delayed privatizer ops (i.e. `omp.private` |
182 |
| - // ops). |
183 |
| - llvm::SmallVector<Attribute> privateSyms; |
184 |
| -}; |
185 |
| - |
186 |
| -struct ProcBindClauseOps { |
187 |
| - ClauseProcBindKindAttr procBindKind; |
188 |
| -}; |
189 |
| - |
190 |
| -struct ReductionClauseOps { |
191 |
| - llvm::SmallVector<Value> reductionVars; |
192 |
| - llvm::SmallVector<bool> reductionByref; |
193 |
| - llvm::SmallVector<Attribute> reductionSyms; |
194 |
| -}; |
195 |
| - |
196 |
| -struct SafelenClauseOps { |
197 |
| - IntegerAttr safelen; |
198 |
| -}; |
199 |
| - |
200 |
| -struct ScheduleClauseOps { |
201 |
| - ClauseScheduleKindAttr scheduleKind; |
202 |
| - Value scheduleChunk; |
203 |
| - ScheduleModifierAttr scheduleMod; |
204 |
| - UnitAttr scheduleSimd; |
205 |
| -}; |
206 |
| - |
207 |
| -struct SimdlenClauseOps { |
208 |
| - IntegerAttr simdlen; |
209 |
| -}; |
210 |
| - |
211 |
| -struct TaskReductionClauseOps { |
212 |
| - llvm::SmallVector<Value> taskReductionVars; |
213 |
| - llvm::SmallVector<bool> taskReductionByref; |
214 |
| - llvm::SmallVector<Attribute> taskReductionSyms; |
215 |
| -}; |
216 |
| - |
217 |
| -struct ThreadLimitClauseOps { |
218 |
| - Value threadLimit; |
219 |
| -}; |
220 |
| - |
221 |
| -struct UntiedClauseOps { |
222 |
| - UnitAttr untied; |
223 |
| -}; |
224 |
| - |
225 |
| -struct UseDeviceAddrClauseOps { |
226 |
| - llvm::SmallVector<Value> useDeviceAddrVars; |
227 |
| -}; |
228 |
| - |
229 |
| -struct UseDevicePtrClauseOps { |
230 |
| - llvm::SmallVector<Value> useDevicePtrVars; |
231 |
| -}; |
232 |
| - |
233 | 40 | //===----------------------------------------------------------------------===//
|
234 |
| -// Structures defining clause operands associated with each OpenMP leaf |
235 |
| -// construct. |
236 |
| -// |
237 |
| -// These mirror the arguments expected by the corresponding OpenMP MLIR ops. |
| 41 | +// Extra operation operand structures. |
238 | 42 | //===----------------------------------------------------------------------===//
|
239 | 43 |
|
240 |
| -namespace detail { |
241 |
| -template <typename... Mixins> |
242 |
| -struct Clauses : public Mixins... {}; |
243 |
| -} // namespace detail |
244 |
| - |
245 |
| -using CancelOperands = |
246 |
| - detail::Clauses<CancelDirectiveNameClauseOps, IfClauseOps>; |
247 |
| - |
248 |
| -using CancellationPointOperands = detail::Clauses<CancelDirectiveNameClauseOps>; |
249 |
| - |
250 |
| -using CriticalDeclareOperands = |
251 |
| - detail::Clauses<CriticalNameClauseOps, HintClauseOps>; |
252 |
| - |
253 |
| -// TODO `indirect` clause. |
| 44 | +// TODO: Add `indirect` clause. |
254 | 45 | using DeclareTargetOperands = detail::Clauses<DeviceTypeClauseOps>;
|
255 | 46 |
|
256 |
| -using DistributeOperands = |
257 |
| - detail::Clauses<AllocateClauseOps, DistScheduleClauseOps, OrderClauseOps, |
258 |
| - PrivateClauseOps>; |
259 |
| - |
260 |
| -using LoopNestOperands = detail::Clauses<LoopRelatedOps>; |
261 |
| - |
262 |
| -using MaskedOperands = detail::Clauses<FilterClauseOps>; |
263 |
| - |
264 |
| -using OrderedOperands = detail::Clauses<DoacrossClauseOps>; |
265 |
| - |
266 |
| -using OrderedRegionOperands = detail::Clauses<ParallelizationLevelClauseOps>; |
267 |
| - |
268 |
| -using ParallelOperands = |
269 |
| - detail::Clauses<AllocateClauseOps, IfClauseOps, NumThreadsClauseOps, |
270 |
| - PrivateClauseOps, ProcBindClauseOps, ReductionClauseOps>; |
271 |
| - |
272 |
| -using SectionsOperands = detail::Clauses<AllocateClauseOps, NowaitClauseOps, |
273 |
| - PrivateClauseOps, ReductionClauseOps>; |
274 |
| - |
275 |
| -using SimdOperands = |
276 |
| - detail::Clauses<AlignedClauseOps, IfClauseOps, LinearClauseOps, |
277 |
| - NontemporalClauseOps, OrderClauseOps, PrivateClauseOps, |
278 |
| - ReductionClauseOps, SafelenClauseOps, SimdlenClauseOps>; |
279 |
| - |
280 |
| -using SingleOperands = detail::Clauses<AllocateClauseOps, CopyprivateClauseOps, |
281 |
| - NowaitClauseOps, PrivateClauseOps>; |
282 |
| - |
283 |
| -// TODO `defaultmap`, `uses_allocators` clauses. |
284 |
| -using TargetOperands = |
285 |
| - detail::Clauses<AllocateClauseOps, DependClauseOps, DeviceClauseOps, |
286 |
| - HasDeviceAddrClauseOps, IfClauseOps, InReductionClauseOps, |
287 |
| - IsDevicePtrClauseOps, MapClauseOps, NowaitClauseOps, |
288 |
| - PrivateClauseOps, ThreadLimitClauseOps>; |
289 |
| - |
290 |
| -using TargetDataOperands = |
291 |
| - detail::Clauses<DeviceClauseOps, IfClauseOps, MapClauseOps, |
292 |
| - UseDeviceAddrClauseOps, UseDevicePtrClauseOps>; |
293 |
| - |
294 |
| -using TargetEnterExitUpdateDataOperands = |
295 |
| - detail::Clauses<DependClauseOps, DeviceClauseOps, IfClauseOps, MapClauseOps, |
296 |
| - NowaitClauseOps>; |
297 |
| - |
298 |
| -// TODO `affinity`, `detach` clauses. |
299 |
| -using TaskOperands = |
300 |
| - detail::Clauses<AllocateClauseOps, DependClauseOps, FinalClauseOps, |
301 |
| - IfClauseOps, InReductionClauseOps, MergeableClauseOps, |
302 |
| - PriorityClauseOps, PrivateClauseOps, UntiedClauseOps>; |
303 |
| - |
304 |
| -using TaskgroupOperands = |
305 |
| - detail::Clauses<AllocateClauseOps, TaskReductionClauseOps>; |
306 |
| - |
307 |
| -using TaskloopOperands = |
308 |
| - detail::Clauses<AllocateClauseOps, FinalClauseOps, GrainsizeClauseOps, |
309 |
| - IfClauseOps, InReductionClauseOps, MergeableClauseOps, |
310 |
| - NogroupClauseOps, NumTasksClauseOps, PriorityClauseOps, |
311 |
| - PrivateClauseOps, ReductionClauseOps, UntiedClauseOps>; |
312 |
| - |
313 |
| -using TaskwaitOperands = detail::Clauses<DependClauseOps, NowaitClauseOps>; |
314 |
| - |
315 |
| -using TeamsOperands = |
316 |
| - detail::Clauses<AllocateClauseOps, IfClauseOps, NumTeamsClauseOps, |
317 |
| - PrivateClauseOps, ReductionClauseOps, ThreadLimitClauseOps>; |
318 |
| - |
319 |
| -using WsloopOperands = |
320 |
| - detail::Clauses<AllocateClauseOps, LinearClauseOps, NowaitClauseOps, |
321 |
| - OrderClauseOps, OrderedClauseOps, PrivateClauseOps, |
322 |
| - ReductionClauseOps, ScheduleClauseOps>; |
| 47 | +/// omp.target_enter_data, omp.target_exit_data and omp.target_update take the |
| 48 | +/// same clauses, so we give the structure to be shared by all of them a |
| 49 | +/// representative name. |
| 50 | +using TargetEnterExitUpdateDataOperands = TargetEnterDataOperands; |
323 | 51 |
|
324 | 52 | } // namespace omp
|
325 | 53 | } // namespace mlir
|
|
0 commit comments