@@ -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