17 #include "llvm/Support/DebugLog.h"
20 #define DEBUG_TYPE "convert-to-llvm"
23 #define GEN_PASS_DEF_CONVERTTOLLVMPASS
24 #include "mlir/Conversion/Passes.h.inc"
32 class ConvertToLLVMPassInterface {
36 bool allowPatternRollback =
true);
37 virtual ~ConvertToLLVMPassInterface() =
default;
45 virtual LogicalResult initialize() = 0;
52 virtual LogicalResult transform(
Operation *op,
60 LogicalResult visitInterfaces(
67 bool allowPatternRollback;
83 LDBG() <<
"Convert to LLVM extension load";
84 for (
Dialect *dialect : dialects) {
85 auto *iface = dyn_cast<ConvertToLLVMPatternInterface>(dialect);
88 LDBG() <<
"Convert to LLVM found dialect interface for "
89 << dialect->getNamespace();
90 iface->loadDependentDialects(context);
95 std::unique_ptr<DialectExtensionBase>
clone() const final {
96 return std::make_unique<LoadDependentDialectExtension>(*
this);
106 struct StaticConvertToLLVM :
public ConvertToLLVMPassInterface {
108 std::shared_ptr<const FrozenRewritePatternSet>
patterns;
110 std::shared_ptr<const ConversionTarget> target;
112 std::shared_ptr<const LLVMTypeConverter> typeConverter;
113 using ConvertToLLVMPassInterface::ConvertToLLVMPassInterface;
116 LogicalResult initialize() final {
117 auto target = std::make_shared<ConversionTarget>(*context);
118 auto typeConverter = std::make_shared<LLVMTypeConverter>(context);
120 target->addLegalDialect<LLVM::LLVMDialect>();
124 *target, *typeConverter, tempPatterns);
128 std::make_unique<FrozenRewritePatternSet>(std::move(tempPatterns));
129 this->target = target;
130 this->typeConverter = typeConverter;
137 config.allowPatternRollback = allowPatternRollback;
150 struct DynamicConvertToLLVM :
public ConvertToLLVMPassInterface {
153 std::shared_ptr<const SmallVector<ConvertToLLVMPatternInterface *>>
155 using ConvertToLLVMPassInterface::ConvertToLLVMPassInterface;
158 LogicalResult initialize() final {
160 std::make_shared<SmallVector<ConvertToLLVMPatternInterface *>>();
163 interfaces->push_back(iface);
166 this->interfaces = interfaces;
174 target.addLegalDialect<LLVM::LLVMDialect>();
177 const DataLayout &dl = dlAnalysis.getAtOrAbove(op);
192 config.allowPatternRollback = allowPatternRollback;
206 class ConvertToLLVMPass
207 :
public impl::ConvertToLLVMPassBase<ConvertToLLVMPass> {
208 std::shared_ptr<const ConvertToLLVMPassInterface>
impl;
211 using impl::ConvertToLLVMPassBase<ConvertToLLVMPass>::ConvertToLLVMPassBase;
213 ConvertToLLVMPassInterface::getDependentDialects(registry);
216 LogicalResult initialize(
MLIRContext *context)
final {
217 std::shared_ptr<ConvertToLLVMPassInterface>
impl;
220 impl = std::make_shared<DynamicConvertToLLVM>(context, filterDialects,
221 allowPatternRollback);
223 impl = std::make_shared<StaticConvertToLLVM>(context, filterDialects,
224 allowPatternRollback);
231 void runOnOperation() final {
232 if (
failed(
impl->transform(getOperation(), getAnalysisManager())))
233 return signalPassFailure();
243 ConvertToLLVMPassInterface::ConvertToLLVMPassInterface(
245 bool allowPatternRollback)
246 : context(context), filterDialects(filterDialects),
247 allowPatternRollback(allowPatternRollback) {}
249 void ConvertToLLVMPassInterface::getDependentDialects(
251 registry.
insert<LLVM::LLVMDialect>();
255 LogicalResult ConvertToLLVMPassInterface::visitInterfaces(
257 if (!filterDialects.empty()) {
261 for (StringRef dialectName : filterDialects) {
262 Dialect *dialect = context->getLoadedDialect(dialectName);
265 <<
"dialect not loaded: " << dialectName <<
"\n";
266 auto *iface = dyn_cast<ConvertToLLVMPatternInterface>(dialect);
269 <<
"dialect does not implement ConvertToLLVMPatternInterface: "
270 << dialectName <<
"\n";
276 for (
Dialect *dialect : context->getLoadedDialects()) {
279 auto *iface = dyn_cast<ConvertToLLVMPatternInterface>(dialect);
static llvm::ManagedStatic< PassManagerOptions > options
#define MLIR_DEFINE_EXPLICIT_INTERNAL_INLINE_TYPE_ID(CLASS_NAME)
This class represents an analysis manager for a particular operation instance.
This class describes a specific conversion target.
Base class for dialect interfaces providing translation to LLVM IR.
virtual void populateConvertToLLVMConversionPatterns(ConversionTarget &target, LLVMTypeConverter &typeConverter, RewritePatternSet &patterns) const =0
Hook for derived dialect interface to provide conversion patterns and mark dialect legal for the conv...
Stores data layout objects for each operation that specifies the data layout above and below the give...
The main mechanism for performing data layout queries.
This class represents an opaque dialect extension.
The DialectRegistry maps a dialect namespace to a constructor for the matching dialect.
void addExtensions()
Add the given extensions to the registry.
Dialects are groups of MLIR operations, types and attributes, as well as behavior associated with the...
Conversion from types to the LLVM IR dialect.
Options to control the LLVM lowering.
MLIRContext is the top-level object for a collection of MLIR operations.
Operation is the basic unit of execution within MLIR.
Include the generated interface declarations.
const FrozenRewritePatternSet GreedyRewriteConfig config
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
const FrozenRewritePatternSet & patterns
void registerConvertToLLVMDependentDialectLoading(DialectRegistry ®istry)
Register the extension that will load dependent dialects for LLVM conversion.
Operation * clone(OpBuilder &b, Operation *op, TypeRange newResultTypes, ValueRange newOperands)
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...
void populateOpConvertToLLVMConversionPatterns(Operation *op, ConversionTarget &target, LLVMTypeConverter &typeConverter, RewritePatternSet &patterns)
Helper function for populating LLVM conversion patterns.
LogicalResult applyPartialConversion(ArrayRef< Operation * > ops, const ConversionTarget &target, const FrozenRewritePatternSet &patterns, ConversionConfig config=ConversionConfig())
Below we define several entry points for operation conversion.
Dialect conversion configuration.