diff options
author | Akash Banerjee <akash.banerjee@amd.com> | 2025-02-18 17:47:32 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-02-18 17:47:32 +0000 |
commit | d6ab12c7cc7058776ad46fe0767080b1e7710cc2 (patch) | |
tree | 3bc56b314b640fda7ddca5d8a65efc78423b6bb0 /mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp | |
parent | 886b2edfbeea9f35a0495e2a531429ec9cce5e57 (diff) | |
download | llvm-d6ab12c7cc7058776ad46fe0767080b1e7710cc2.zip llvm-d6ab12c7cc7058776ad46fe0767080b1e7710cc2.tar.gz llvm-d6ab12c7cc7058776ad46fe0767080b1e7710cc2.tar.bz2 |
[MLIR][OpenMP] Add conversion support from FIR to LLVM Dialect for OMP DeclareMapper (#121005)
Add conversion support from FIR to LLVM Dialect for OMP DeclareMapper.
Depends on #121001
Diffstat (limited to 'mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp')
-rw-r--r-- | mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp | 55 |
1 files changed, 42 insertions, 13 deletions
diff --git a/mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp b/mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp index 12e3c07..7888745 100644 --- a/mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp +++ b/mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp @@ -186,6 +186,32 @@ struct MapInfoOpConversion : public ConvertOpToLLVMPattern<omp::MapInfoOp> { } }; +struct DeclMapperOpConversion + : public ConvertOpToLLVMPattern<omp::DeclareMapperOp> { + using ConvertOpToLLVMPattern<omp::DeclareMapperOp>::ConvertOpToLLVMPattern; + LogicalResult + matchAndRewrite(omp::DeclareMapperOp curOp, OpAdaptor adaptor, + ConversionPatternRewriter &rewriter) const override { + const TypeConverter *converter = ConvertToLLVMPattern::getTypeConverter(); + SmallVector<NamedAttribute> newAttrs; + newAttrs.emplace_back(curOp.getSymNameAttrName(), curOp.getSymNameAttr()); + newAttrs.emplace_back( + curOp.getTypeAttrName(), + TypeAttr::get(converter->convertType(curOp.getType()))); + + auto newOp = rewriter.create<omp::DeclareMapperOp>( + curOp.getLoc(), TypeRange(), adaptor.getOperands(), newAttrs); + rewriter.inlineRegionBefore(curOp.getRegion(), newOp.getRegion(), + newOp.getRegion().end()); + if (failed(rewriter.convertRegionTypes(&newOp.getRegion(), + *this->getTypeConverter()))) + return failure(); + + rewriter.eraseOp(curOp); + return success(); + } +}; + template <typename OpType> struct MultiRegionOpConversion : public ConvertOpToLLVMPattern<OpType> { using ConvertOpToLLVMPattern<OpType>::ConvertOpToLLVMPattern; @@ -225,19 +251,21 @@ void mlir::configureOpenMPToLLVMConversionLegality( ConversionTarget &target, const LLVMTypeConverter &typeConverter) { target.addDynamicallyLegalOp< omp::AtomicReadOp, omp::AtomicWriteOp, omp::CancellationPointOp, - omp::CancelOp, omp::CriticalDeclareOp, omp::FlushOp, omp::MapBoundsOp, - omp::MapInfoOp, omp::OrderedOp, omp::ScanOp, omp::TargetEnterDataOp, - omp::TargetExitDataOp, omp::TargetUpdateOp, omp::ThreadprivateOp, - omp::YieldOp>([&](Operation *op) { - return typeConverter.isLegal(op->getOperandTypes()) && - typeConverter.isLegal(op->getResultTypes()); - }); + omp::CancelOp, omp::CriticalDeclareOp, omp::DeclareMapperInfoOp, + omp::FlushOp, omp::MapBoundsOp, omp::MapInfoOp, omp::OrderedOp, + omp::ScanOp, omp::TargetEnterDataOp, omp::TargetExitDataOp, + omp::TargetUpdateOp, omp::ThreadprivateOp, omp::YieldOp>( + [&](Operation *op) { + return typeConverter.isLegal(op->getOperandTypes()) && + typeConverter.isLegal(op->getResultTypes()); + }); target.addDynamicallyLegalOp< - omp::AtomicUpdateOp, omp::CriticalOp, omp::DeclareReductionOp, - omp::DistributeOp, omp::LoopNestOp, omp::LoopOp, omp::MasterOp, - omp::OrderedRegionOp, omp::ParallelOp, omp::SectionOp, omp::SectionsOp, - omp::SimdOp, omp::SingleOp, omp::TargetDataOp, omp::TargetOp, - omp::TaskgroupOp, omp::TaskloopOp, omp::TaskOp, omp::TeamsOp, + omp::AtomicUpdateOp, omp::CriticalOp, omp::DeclareMapperOp, + omp::DeclareReductionOp, omp::DistributeOp, omp::LoopNestOp, omp::LoopOp, + omp::MasterOp, omp::OrderedRegionOp, omp::ParallelOp, + omp::PrivateClauseOp, omp::SectionOp, omp::SectionsOp, omp::SimdOp, + omp::SingleOp, omp::TargetDataOp, omp::TargetOp, omp::TaskgroupOp, + omp::TaskloopOp, omp::TaskOp, omp::TeamsOp, omp::WsloopOp>([&](Operation *op) { return std::all_of(op->getRegions().begin(), op->getRegions().end(), [&](Region ®ion) { @@ -267,12 +295,13 @@ void mlir::populateOpenMPToLLVMConversionPatterns(LLVMTypeConverter &converter, [&](omp::MapBoundsType type) -> Type { return type; }); patterns.add< - AtomicReadOpConversion, MapInfoOpConversion, + AtomicReadOpConversion, DeclMapperOpConversion, MapInfoOpConversion, MultiRegionOpConversion<omp::DeclareReductionOp>, MultiRegionOpConversion<omp::PrivateClauseOp>, RegionLessOpConversion<omp::CancellationPointOp>, RegionLessOpConversion<omp::CancelOp>, RegionLessOpConversion<omp::CriticalDeclareOp>, + RegionLessOpConversion<omp::DeclareMapperInfoOp>, RegionLessOpConversion<omp::OrderedOp>, RegionLessOpConversion<omp::ScanOp>, RegionLessOpConversion<omp::TargetEnterDataOp>, |