23#define GEN_PASS_DEF_CONVERTOPENMPTOLLVMPASS
24#include "mlir/Conversion/Passes.h.inc"
42 using ConvertOpToLLVMPattern<T>::ConvertOpToLLVMPattern;
44 OpenMPOpConversion(LLVMTypeConverter &typeConverter,
45 PatternBenefit benefit = 1)
46 : ConvertOpToLLVMPattern<T>(typeConverter, benefit) {
50 typeConverter.addConversion(
51 [&](::mlir::omp::CanonicalLoopInfoType type) {
return type; });
55 matchAndRewrite(T op,
typename T::Adaptor adaptor,
56 ConversionPatternRewriter &rewriter)
const override {
59 SmallVector<Type> resTypes;
60 if (
failed(converter->convertTypes(op->getResultTypes(), resTypes)))
65 SmallVector<NamedAttribute> convertedAttrs;
66 for (NamedAttribute attr : op->getAttrs()) {
67 if (
auto typeAttr = dyn_cast<TypeAttr>(attr.getValue())) {
68 Type convertedType = converter->convertType(typeAttr.getValue());
69 convertedAttrs.emplace_back(attr.getName(),
70 TypeAttr::get(convertedType));
72 convertedAttrs.push_back(attr);
77 SmallVector<Value> convertedOperands;
78 convertedOperands.reserve(op->getNumOperands());
79 for (
auto [originalOperand, convertedOperand] :
80 llvm::zip_equal(op->getOperands(), adaptor.getOperands())) {
86 if constexpr (llvm::is_one_of<T, omp::AtomicUpdateOp, omp::AtomicWriteOp,
87 omp::FlushOp, omp::MapBoundsOp,
88 omp::ThreadprivateOp>::value) {
89 if (isa<MemRefType>(originalOperand.getType())) {
91 return rewriter.notifyMatchFailure(op,
"memref is not supported yet");
94 convertedOperands.push_back(convertedOperand);
98 auto newOp = T::create(rewriter, op.getLoc(), resTypes, convertedOperands,
102 for (
auto [originalRegion, convertedRegion] :
103 llvm::zip_equal(op->getRegions(), newOp->getRegions())) {
104 rewriter.inlineRegionBefore(originalRegion, convertedRegion,
105 convertedRegion.end());
106 if (
failed(rewriter.convertRegionTypes(&convertedRegion,
107 *this->getTypeConverter())))
112 rewriter.replaceOp(op, newOp->getResults());
121 target.addDynamicallyLegalOp<
123#include "mlir/Dialect/OpenMP/OpenMPOps.cpp.inc"
125 return typeConverter.isLegal(op->getOperandTypes()) &&
126 typeConverter.isLegal(op->getResultTypes()) &&
127 llvm::all_of(op->getRegions(),
129 return typeConverter.isLegal(®ion);
132 auto typeAttr = dyn_cast<TypeAttr>(attr.getValue());
133 return !typeAttr || typeConverter.isLegal(typeAttr.getValue());
140template <
typename... Ts>
144 return patterns.add<OpenMPOpConversion<Ts>...>(converter);
152 converter.addConversion(
153 [&](omp::MapBoundsType type) ->
Type {
return type; });
158#include "mlir/Dialect/OpenMP/OpenMPOps.cpp.inc"
163struct ConvertOpenMPToLLVMPass
167 void runOnOperation()
override;
171void ConvertOpenMPToLLVMPass::runOnOperation() {
172 auto module = getOperation();
177 arith::populateArithToLLVMConversionPatterns(converter,
patterns);
185 target.addLegalOp<omp::BarrierOp, omp::FlushOp, omp::TaskwaitOp,
186 omp::TaskyieldOp, omp::TerminatorOp>();
197struct OpenMPToLLVMDialectInterface :
public ConvertToLLVMPatternInterface {
199 void loadDependentDialects(MLIRContext *context)
const final {
200 context->loadDialect<LLVM::LLVMDialect>();
205 void populateConvertToLLVMConversionPatterns(
206 ConversionTarget &
target, LLVMTypeConverter &typeConverter,
207 RewritePatternSet &
patterns)
const final {
216 dialect->addInterfaces<OpenMPToLLVMDialectInterface>();
static RewritePatternSet & addOpenMPOpConversions(LLVMTypeConverter &converter, RewritePatternSet &patterns)
Add an OpenMPOpConversion<T> conversion pattern for each operation type passed as template argument.
Utility class for operation conversions targeting the LLVM dialect that match exactly one source oper...
ConvertToLLVMPatternInterface(Dialect *dialect)
const LLVMTypeConverter * getTypeConverter() const
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
bool addExtension(TypeID extensionID, std::unique_ptr< DialectExtensionBase > extension)
Add the given extension to the registry.
Conversion from types to the LLVM IR dialect.
MLIRContext is the top-level object for a collection of MLIR operations.
NamedAttribute represents a combination of a name and an Attribute value.
Operation is the basic unit of execution within MLIR.
This class contains a list of basic blocks and a link to the parent operation it is attached to.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
void populateControlFlowToLLVMConversionPatterns(const LLVMTypeConverter &converter, RewritePatternSet &patterns)
Collect the patterns to convert from the ControlFlow dialect to LLVM.
void populateAssertToLLVMConversionPattern(const LLVMTypeConverter &converter, RewritePatternSet &patterns, bool abortOnFailure=true, SymbolTableCollection *symbolTables=nullptr)
Populate the cf.assert to LLVM conversion pattern.
Include the generated interface declarations.
void populateOpenMPToLLVMConversionPatterns(LLVMTypeConverter &converter, RewritePatternSet &patterns)
Populate the given list with patterns that convert from OpenMP to LLVM.
void populateFuncToLLVMConversionPatterns(const LLVMTypeConverter &converter, RewritePatternSet &patterns, SymbolTableCollection *symbolTables=nullptr)
Collect the patterns to convert from the Func dialect to LLVM.
void populateFinalizeMemRefToLLVMConversionPatterns(const LLVMTypeConverter &converter, RewritePatternSet &patterns, SymbolTableCollection *symbolTables=nullptr)
Collect a set of patterns to convert memory-related operations from the MemRef dialect to the LLVM di...
const FrozenRewritePatternSet & patterns
void registerConvertOpenMPToLLVMInterface(DialectRegistry ®istry)
Registers the ConvertToLLVMPatternInterface interface in the OpenMP dialect.
void configureOpenMPToLLVMConversionLegality(ConversionTarget &target, const LLVMTypeConverter &typeConverter)
Configure dynamic conversion legality of regionless operations from OpenMP to LLVM.