aboutsummaryrefslogtreecommitdiff
path: root/mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp
diff options
context:
space:
mode:
authorAkash Banerjee <akash.banerjee@amd.com>2025-02-18 17:47:32 +0000
committerGitHub <noreply@github.com>2025-02-18 17:47:32 +0000
commitd6ab12c7cc7058776ad46fe0767080b1e7710cc2 (patch)
tree3bc56b314b640fda7ddca5d8a65efc78423b6bb0 /mlir/lib/Conversion/OpenMPToLLVM/OpenMPToLLVM.cpp
parent886b2edfbeea9f35a0495e2a531429ec9cce5e57 (diff)
downloadllvm-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.cpp55
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 &region) {
@@ -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>,