@@ -200,16 +200,21 @@ struct ReductionOpConversion : public ConvertOpToLLVMPattern<omp::ReductionOp> {
200200 }
201201};
202202
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+
206209 LogicalResult
207- matchAndRewrite (omp::ReductionDeclareOp curOp, OpAdaptor adaptor,
210+ matchAndRewrite (OpType curOp, typename OpType::Adaptor adaptor,
208211 ConversionPatternRewriter &rewriter) const override {
209- auto newOp = rewriter.create <omp::ReductionDeclareOp >(
212+ auto newOp = rewriter.create <OpType >(
210213 curOp.getLoc (), TypeRange (), curOp.getSymNameAttr (),
211214 TypeAttr::get (this ->getTypeConverter ()->convertType (
212215 curOp.getTypeAttr ().getValue ())));
216+ forwardOpAttrs (curOp, newOp);
217+
213218 for (unsigned idx = 0 ; idx < curOp.getNumRegions (); idx++) {
214219 rewriter.inlineRegionBefore (curOp.getRegion (idx), newOp.getRegion (idx),
215220 newOp.getRegion (idx).end ());
@@ -222,20 +227,16 @@ struct ReductionDeclareOpConversion
222227 return success ();
223228 }
224229};
230+
231+ template <>
232+ void MultiRegionOpConversion<omp::PrivateClauseOp>::forwardOpAttrs(
233+ omp::PrivateClauseOp curOp, omp::PrivateClauseOp newOp) const {
234+ newOp.setDataSharingType (curOp.getDataSharingType ());
235+ }
225236} // namespace
226237
227238void mlir::configureOpenMPToLLVMConversionLegality (
228239 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- });
239240 target.addDynamicallyLegalOp <
240241 mlir::omp::AtomicReadOp, mlir::omp::AtomicWriteOp, mlir::omp::FlushOp,
241242 mlir::omp::ThreadprivateOp, mlir::omp::YieldOp, mlir::omp::EnterDataOp,
@@ -247,14 +248,20 @@ void mlir::configureOpenMPToLLVMConversionLegality(
247248 target.addDynamicallyLegalOp <mlir::omp::ReductionOp>([&](Operation *op) {
248249 return typeConverter.isLegal (op->getOperandTypes ());
249250 });
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+ });
258265}
259266
260267void mlir::populateOpenMPToLLVMConversionPatterns (LLVMTypeConverter &converter,
@@ -267,9 +274,10 @@ void mlir::populateOpenMPToLLVMConversionPatterns(LLVMTypeConverter &converter,
267274
268275 patterns.add <
269276 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>,
273281 RegionOpConversion<omp::ParallelOp>, RegionOpConversion<omp::WsLoopOp>,
274282 RegionOpConversion<omp::SectionsOp>, RegionOpConversion<omp::SectionOp>,
275283 RegionOpConversion<omp::SimdLoopOp>, RegionOpConversion<omp::SingleOp>,
0 commit comments