@@ -200,16 +200,21 @@ struct ReductionOpConversion : public ConvertOpToLLVMPattern<omp::ReductionOp> {
200
200
}
201
201
};
202
202
203
- struct ReductionDeclareOpConversion
204
- : public ConvertOpToLLVMPattern<omp::ReductionDeclareOp> {
205
- using ConvertOpToLLVMPattern<omp::ReductionDeclareOp>::ConvertOpToLLVMPattern;
203
+ template <typename OpType>
204
+ struct MultiRegionOpConversion : public ConvertOpToLLVMPattern <OpType> {
205
+ using ConvertOpToLLVMPattern<OpType>::ConvertOpToLLVMPattern;
206
+
207
+ void forwardOpAttrs (OpType curOp, OpType newOp) const {}
208
+
206
209
LogicalResult
207
- matchAndRewrite (omp::ReductionDeclareOp curOp, OpAdaptor adaptor,
210
+ matchAndRewrite (OpType curOp, typename OpType::Adaptor adaptor,
208
211
ConversionPatternRewriter &rewriter) const override {
209
- auto newOp = rewriter.create <omp::ReductionDeclareOp >(
212
+ auto newOp = rewriter.create <OpType >(
210
213
curOp.getLoc (), TypeRange (), curOp.getSymNameAttr (),
211
214
TypeAttr::get (this ->getTypeConverter ()->convertType (
212
215
curOp.getTypeAttr ().getValue ())));
216
+ forwardOpAttrs (curOp, newOp);
217
+
213
218
for (unsigned idx = 0 ; idx < curOp.getNumRegions (); idx++) {
214
219
rewriter.inlineRegionBefore (curOp.getRegion (idx), newOp.getRegion (idx),
215
220
newOp.getRegion (idx).end ());
@@ -222,20 +227,16 @@ struct ReductionDeclareOpConversion
222
227
return success ();
223
228
}
224
229
};
230
+
231
+ template <>
232
+ void MultiRegionOpConversion<omp::PrivateClauseOp>::forwardOpAttrs(
233
+ omp::PrivateClauseOp curOp, omp::PrivateClauseOp newOp) const {
234
+ newOp.setDataSharingType (curOp.getDataSharingType ());
235
+ }
225
236
} // namespace
226
237
227
238
void mlir::configureOpenMPToLLVMConversionLegality (
228
239
ConversionTarget &target, LLVMTypeConverter &typeConverter) {
229
- target.addDynamicallyLegalOp <
230
- mlir::omp::AtomicUpdateOp, mlir::omp::CriticalOp, mlir::omp::TargetOp,
231
- mlir::omp::DataOp, mlir::omp::OrderedRegionOp, mlir::omp::ParallelOp,
232
- mlir::omp::WsLoopOp, mlir::omp::SimdLoopOp, mlir::omp::MasterOp,
233
- mlir::omp::SectionOp, mlir::omp::SectionsOp, mlir::omp::SingleOp,
234
- mlir::omp::TaskGroupOp, mlir::omp::TaskOp>([&](Operation *op) {
235
- return typeConverter.isLegal (&op->getRegion (0 )) &&
236
- typeConverter.isLegal (op->getOperandTypes ()) &&
237
- typeConverter.isLegal (op->getResultTypes ());
238
- });
239
240
target.addDynamicallyLegalOp <
240
241
mlir::omp::AtomicReadOp, mlir::omp::AtomicWriteOp, mlir::omp::FlushOp,
241
242
mlir::omp::ThreadprivateOp, mlir::omp::YieldOp, mlir::omp::EnterDataOp,
@@ -247,14 +248,20 @@ void mlir::configureOpenMPToLLVMConversionLegality(
247
248
target.addDynamicallyLegalOp <mlir::omp::ReductionOp>([&](Operation *op) {
248
249
return typeConverter.isLegal (op->getOperandTypes ());
249
250
});
250
- target.addDynamicallyLegalOp <mlir::omp::ReductionDeclareOp>(
251
- [&](Operation *op) {
252
- return typeConverter.isLegal (&op->getRegion (0 )) &&
253
- typeConverter.isLegal (&op->getRegion (1 )) &&
254
- typeConverter.isLegal (&op->getRegion (2 )) &&
255
- typeConverter.isLegal (op->getOperandTypes ()) &&
256
- typeConverter.isLegal (op->getResultTypes ());
257
- });
251
+ target.addDynamicallyLegalOp <
252
+ mlir::omp::AtomicUpdateOp, mlir::omp::CriticalOp, mlir::omp::TargetOp,
253
+ mlir::omp::DataOp, mlir::omp::OrderedRegionOp, mlir::omp::ParallelOp,
254
+ mlir::omp::WsLoopOp, mlir::omp::SimdLoopOp, mlir::omp::MasterOp,
255
+ mlir::omp::SectionOp, mlir::omp::SectionsOp, mlir::omp::SingleOp,
256
+ mlir::omp::TaskGroupOp, mlir::omp::TaskOp, mlir::omp::ReductionDeclareOp,
257
+ mlir::omp::PrivateClauseOp>([&](Operation *op) {
258
+ return std::all_of (op->getRegions ().begin (), op->getRegions ().end (),
259
+ [&](Region ®ion) {
260
+ return typeConverter.isLegal (®ion);
261
+ }) &&
262
+ typeConverter.isLegal (op->getOperandTypes ()) &&
263
+ typeConverter.isLegal (op->getResultTypes ());
264
+ });
258
265
}
259
266
260
267
void mlir::populateOpenMPToLLVMConversionPatterns (LLVMTypeConverter &converter,
@@ -267,9 +274,10 @@ void mlir::populateOpenMPToLLVMConversionPatterns(LLVMTypeConverter &converter,
267
274
268
275
patterns.add <
269
276
AtomicReadOpConversion, MapInfoOpConversion, ReductionOpConversion,
270
- ReductionDeclareOpConversion, RegionOpConversion<omp::CriticalOp>,
271
- RegionOpConversion<omp::MasterOp>, ReductionOpConversion,
272
- RegionOpConversion<omp::OrderedRegionOp>,
277
+ MultiRegionOpConversion<omp::ReductionDeclareOp>,
278
+ MultiRegionOpConversion<omp::PrivateClauseOp>,
279
+ RegionOpConversion<omp::CriticalOp>, RegionOpConversion<omp::MasterOp>,
280
+ ReductionOpConversion, RegionOpConversion<omp::OrderedRegionOp>,
273
281
RegionOpConversion<omp::ParallelOp>, RegionOpConversion<omp::WsLoopOp>,
274
282
RegionOpConversion<omp::SectionsOp>, RegionOpConversion<omp::SectionOp>,
275
283
RegionOpConversion<omp::SimdLoopOp>, RegionOpConversion<omp::SingleOp>,
0 commit comments