Skip to content

Commit 2f3d061

Browse files
authored
[MLIR][OpenMP] Automate operand structure definition (#99508)
This patch adds the "gen-openmp-clause-ops" `mlir-tblgen` generator to produce the structure definitions previously in OpenMPClauseOperands.h automatically from the information contained in OpenMPOps.td and OpenMPClauses.td. The original header is maintained to enable the definition of similar structures that are not directly related to any single `OpenMP_Clause` or `OpenMP_Op` tablegen definition.
1 parent da69449 commit 2f3d061

File tree

7 files changed

+319
-317
lines changed

7 files changed

+319
-317
lines changed

flang/lib/Lower/OpenMP/ClauseProcessor.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,7 @@ static void addUseDeviceClause(
181181

182182
static void convertLoopBounds(lower::AbstractConverter &converter,
183183
mlir::Location loc,
184-
mlir::omp::LoopRelatedOps &result,
184+
mlir::omp::LoopRelatedClauseOps &result,
185185
std::size_t loopVarTypeSize) {
186186
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
187187
// The types of lower bound, upper bound, and step are converted into the
@@ -203,7 +203,7 @@ static void convertLoopBounds(lower::AbstractConverter &converter,
203203

204204
bool ClauseProcessor::processCollapse(
205205
mlir::Location currentLocation, lower::pft::Evaluation &eval,
206-
mlir::omp::LoopRelatedOps &result,
206+
mlir::omp::LoopRelatedClauseOps &result,
207207
llvm::SmallVectorImpl<const semantics::Symbol *> &iv) const {
208208
bool found = false;
209209
fir::FirOpBuilder &firOpBuilder = converter.getFirOpBuilder();
@@ -855,7 +855,7 @@ bool ClauseProcessor::processIf(
855855
// Assume that, at most, a single 'if' clause will be applicable to the
856856
// given directive.
857857
if (operand) {
858-
result.ifVar = operand;
858+
result.ifExpr = operand;
859859
found = true;
860860
}
861861
});

flang/lib/Lower/OpenMP/ClauseProcessor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class ClauseProcessor {
5555
// 'Unique' clauses: They can appear at most once in the clause list.
5656
bool
5757
processCollapse(mlir::Location currentLocation, lower::pft::Evaluation &eval,
58-
mlir::omp::LoopRelatedOps &result,
58+
mlir::omp::LoopRelatedClauseOps &result,
5959
llvm::SmallVectorImpl<const semantics::Symbol *> &iv) const;
6060
bool processDevice(lower::StatementContext &stmtCtx,
6161
mlir::omp::DeviceClauseOps &result) const;

mlir/include/mlir/Dialect/OpenMP/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ mlir_tablegen(OpenMPOpsDialect.h.inc -gen-dialect-decls -dialect=omp)
1717
mlir_tablegen(OpenMPOpsDialect.cpp.inc -gen-dialect-defs -dialect=omp)
1818
mlir_tablegen(OpenMPOps.h.inc -gen-op-decls)
1919
mlir_tablegen(OpenMPOps.cpp.inc -gen-op-defs)
20+
mlir_tablegen(OpenMPClauseOps.h.inc -gen-openmp-clause-ops)
2021
mlir_tablegen(OpenMPOpsTypes.h.inc -gen-typedef-decls -typedefs-dialect=omp)
2122
mlir_tablegen(OpenMPOpsTypes.cpp.inc -gen-typedef-defs -typedefs-dialect=omp)
2223
mlir_tablegen(OpenMPOpsEnums.h.inc -gen-enum-decls)

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

Lines changed: 10 additions & 282 deletions
Original file line numberDiff line numberDiff line change
@@ -23,303 +23,31 @@
2323
#define GET_ATTRDEF_CLASSES
2424
#include "mlir/Dialect/OpenMP/OpenMPOpsAttributes.h.inc"
2525

26+
#include "mlir/Dialect/OpenMP/OpenMPClauseOps.h.inc"
27+
2628
namespace mlir {
2729
namespace omp {
2830

2931
//===----------------------------------------------------------------------===//
30-
// Mixin structures defining MLIR operands associated with each OpenMP clause.
32+
// Extra clause operand structures.
3133
//===----------------------------------------------------------------------===//
3234

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-
6835
struct DeviceTypeClauseOps {
69-
// The default capture type.
36+
/// The default capture type.
7037
DeclareTargetDeviceType deviceType = DeclareTargetDeviceType::any;
7138
};
7239

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-
23340
//===----------------------------------------------------------------------===//
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.
23842
//===----------------------------------------------------------------------===//
23943

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.
25445
using DeclareTargetOperands = detail::Clauses<DeviceTypeClauseOps>;
25546

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;
32351

32452
} // namespace omp
32553
} // namespace mlir

0 commit comments

Comments
 (0)