@@ -200,16 +200,20 @@ 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
206
LogicalResult
207
- matchAndRewrite (omp::ReductionDeclareOp curOp, OpAdaptor adaptor,
207
+ matchAndRewrite (OpType curOp, typename OpType::Adaptor adaptor,
208
208
ConversionPatternRewriter &rewriter) const override {
209
- auto newOp = rewriter.create <omp::ReductionDeclareOp >(
209
+ auto newOp = rewriter.create <OpType >(
210
210
curOp.getLoc (), TypeRange (), curOp.getSymNameAttr (),
211
211
TypeAttr::get (this ->getTypeConverter ()->convertType (
212
212
curOp.getTypeAttr ().getValue ())));
213
+
214
+ if constexpr (std::is_same_v<OpType, mlir::omp::PrivateClauseOp>)
215
+ newOp.setDataSharingType (curOp.getDataSharingType ());
216
+
213
217
for (unsigned idx = 0 ; idx < curOp.getNumRegions (); idx++) {
214
218
rewriter.inlineRegionBefore (curOp.getRegion (idx), newOp.getRegion (idx),
215
219
newOp.getRegion (idx).end ());
@@ -231,11 +235,12 @@ void mlir::configureOpenMPToLLVMConversionLegality(
231
235
mlir::omp::DataOp, mlir::omp::OrderedRegionOp, mlir::omp::ParallelOp,
232
236
mlir::omp::WsLoopOp, mlir::omp::SimdLoopOp, mlir::omp::MasterOp,
233
237
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
- });
238
+ mlir::omp::TaskGroupOp, mlir::omp::TaskOp, mlir::omp::PrivateClauseOp>(
239
+ [&](Operation *op) {
240
+ return typeConverter.isLegal (&op->getRegion (0 )) &&
241
+ typeConverter.isLegal (op->getOperandTypes ()) &&
242
+ typeConverter.isLegal (op->getResultTypes ());
243
+ });
239
244
target.addDynamicallyLegalOp <
240
245
mlir::omp::AtomicReadOp, mlir::omp::AtomicWriteOp, mlir::omp::FlushOp,
241
246
mlir::omp::ThreadprivateOp, mlir::omp::YieldOp, mlir::omp::EnterDataOp,
@@ -267,9 +272,10 @@ void mlir::populateOpenMPToLLVMConversionPatterns(LLVMTypeConverter &converter,
267
272
268
273
patterns.add <
269
274
AtomicReadOpConversion, MapInfoOpConversion, ReductionOpConversion,
270
- ReductionDeclareOpConversion, RegionOpConversion<omp::CriticalOp>,
271
- RegionOpConversion<omp::MasterOp>, ReductionOpConversion,
272
- RegionOpConversion<omp::OrderedRegionOp>,
275
+ MultiRegionOpConversion<omp::ReductionDeclareOp>,
276
+ MultiRegionOpConversion<omp::PrivateClauseOp>,
277
+ RegionOpConversion<omp::CriticalOp>, RegionOpConversion<omp::MasterOp>,
278
+ ReductionOpConversion, RegionOpConversion<omp::OrderedRegionOp>,
273
279
RegionOpConversion<omp::ParallelOp>, RegionOpConversion<omp::WsLoopOp>,
274
280
RegionOpConversion<omp::SectionsOp>, RegionOpConversion<omp::SectionOp>,
275
281
RegionOpConversion<omp::SimdLoopOp>, RegionOpConversion<omp::SingleOp>,
0 commit comments