@@ -186,6 +186,32 @@ struct MapInfoOpConversion : public ConvertOpToLLVMPattern<omp::MapInfoOp> {
186186 }
187187};
188188
189+ struct DeclMapperOpConversion
190+ : public ConvertOpToLLVMPattern<omp::DeclareMapperOp> {
191+ using ConvertOpToLLVMPattern<omp::DeclareMapperOp>::ConvertOpToLLVMPattern;
192+ LogicalResult
193+ matchAndRewrite (omp::DeclareMapperOp curOp, OpAdaptor adaptor,
194+ ConversionPatternRewriter &rewriter) const override {
195+ const TypeConverter *converter = ConvertToLLVMPattern::getTypeConverter ();
196+ SmallVector<NamedAttribute> newAttrs;
197+ newAttrs.emplace_back (curOp.getSymNameAttrName (), curOp.getSymNameAttr ());
198+ newAttrs.emplace_back (
199+ curOp.getTypeAttrName (),
200+ TypeAttr::get (converter->convertType (curOp.getType ())));
201+
202+ auto newOp = rewriter.create <omp::DeclareMapperOp>(
203+ curOp.getLoc (), TypeRange (), adaptor.getOperands (), newAttrs);
204+ rewriter.inlineRegionBefore (curOp.getRegion (), newOp.getRegion (),
205+ newOp.getRegion ().end ());
206+ if (failed (rewriter.convertRegionTypes (&newOp.getRegion (),
207+ *this ->getTypeConverter ())))
208+ return failure ();
209+
210+ rewriter.eraseOp (curOp);
211+ return success ();
212+ }
213+ };
214+
189215template <typename OpType>
190216struct MultiRegionOpConversion : public ConvertOpToLLVMPattern <OpType> {
191217 using ConvertOpToLLVMPattern<OpType>::ConvertOpToLLVMPattern;
@@ -225,19 +251,21 @@ void mlir::configureOpenMPToLLVMConversionLegality(
225251 ConversionTarget &target, const LLVMTypeConverter &typeConverter) {
226252 target.addDynamicallyLegalOp <
227253 omp::AtomicReadOp, omp::AtomicWriteOp, omp::CancellationPointOp,
228- omp::CancelOp, omp::CriticalDeclareOp, omp::FlushOp, omp::MapBoundsOp,
229- omp::MapInfoOp, omp::OrderedOp, omp::ScanOp, omp::TargetEnterDataOp,
230- omp::TargetExitDataOp, omp::TargetUpdateOp, omp::ThreadprivateOp,
231- omp::YieldOp>([&](Operation *op) {
232- return typeConverter.isLegal (op->getOperandTypes ()) &&
233- typeConverter.isLegal (op->getResultTypes ());
234- });
254+ omp::CancelOp, omp::CriticalDeclareOp, omp::DeclareMapperInfoOp,
255+ omp::FlushOp, omp::MapBoundsOp, omp::MapInfoOp, omp::OrderedOp,
256+ omp::ScanOp, omp::TargetEnterDataOp, omp::TargetExitDataOp,
257+ omp::TargetUpdateOp, omp::ThreadprivateOp, omp::YieldOp>(
258+ [&](Operation *op) {
259+ return typeConverter.isLegal (op->getOperandTypes ()) &&
260+ typeConverter.isLegal (op->getResultTypes ());
261+ });
235262 target.addDynamicallyLegalOp <
236- omp::AtomicUpdateOp, omp::CriticalOp, omp::DeclareReductionOp,
237- omp::DistributeOp, omp::LoopNestOp, omp::LoopOp, omp::MasterOp,
238- omp::OrderedRegionOp, omp::ParallelOp, omp::SectionOp, omp::SectionsOp,
239- omp::SimdOp, omp::SingleOp, omp::TargetDataOp, omp::TargetOp,
240- omp::TaskgroupOp, omp::TaskloopOp, omp::TaskOp, omp::TeamsOp,
263+ omp::AtomicUpdateOp, omp::CriticalOp, omp::DeclareMapperOp,
264+ omp::DeclareReductionOp, omp::DistributeOp, omp::LoopNestOp, omp::LoopOp,
265+ omp::MasterOp, omp::OrderedRegionOp, omp::ParallelOp,
266+ omp::PrivateClauseOp, omp::SectionOp, omp::SectionsOp, omp::SimdOp,
267+ omp::SingleOp, omp::TargetDataOp, omp::TargetOp, omp::TaskgroupOp,
268+ omp::TaskloopOp, omp::TaskOp, omp::TeamsOp,
241269 omp::WsloopOp>([&](Operation *op) {
242270 return std::all_of (op->getRegions ().begin (), op->getRegions ().end (),
243271 [&](Region ®ion) {
@@ -267,12 +295,13 @@ void mlir::populateOpenMPToLLVMConversionPatterns(LLVMTypeConverter &converter,
267295 [&](omp::MapBoundsType type) -> Type { return type; });
268296
269297 patterns.add <
270- AtomicReadOpConversion, MapInfoOpConversion,
298+ AtomicReadOpConversion, DeclMapperOpConversion, MapInfoOpConversion,
271299 MultiRegionOpConversion<omp::DeclareReductionOp>,
272300 MultiRegionOpConversion<omp::PrivateClauseOp>,
273301 RegionLessOpConversion<omp::CancellationPointOp>,
274302 RegionLessOpConversion<omp::CancelOp>,
275303 RegionLessOpConversion<omp::CriticalDeclareOp>,
304+ RegionLessOpConversion<omp::DeclareMapperInfoOp>,
276305 RegionLessOpConversion<omp::OrderedOp>,
277306 RegionLessOpConversion<omp::ScanOp>,
278307 RegionLessOpConversion<omp::TargetEnterDataOp>,
0 commit comments