//===-- OneToNTypeConversion.h - Utils for 1:N type conversion --*- C++ -*-===// // // Licensed under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file provides utils for implementing (poor-man's) dialect conversion // passes with 1:N type conversions. // // The main function, `applyPartialOneToNConversion`, first applies a set of // `RewritePattern`s, which produce unrealized casts to convert the operands and // results from and to the source types, and then replaces all newly added // unrealized casts by user-provided materializations. For this to work, the // main function requires a special `TypeConverter`, a special // `PatternRewriter`, and special RewritePattern`s, which extend their // respective base classes for 1:N type converions. // // Note that this is much more simple-minded than the "real" dialect conversion, // which checks for legality before applying patterns and does probably many // other additional things. Ideally, some of the extensions here could be // integrated there. // //===----------------------------------------------------------------------===// #ifndef MLIR_TRANSFORMS_ONETONTYPECONVERSION_H #define MLIR_TRANSFORMS_ONETONTYPECONVERSION_H #include "mlir/IR/PatternMatch.h" #include "mlir/Transforms/DialectConversion.h" #include "llvm/ADT/SmallVector.h" namespace mlir { /// Extends `TypeConverter` with 1:N target materializations. Such /// materializations have to provide the "reverse" of 1:N type conversions, /// i.e., they need to materialize N values with target types into one value /// with a source type (which isn't possible in the base class currently). class OneToNTypeConverter : public TypeConverter { … }; /// Stores a 1:N mapping of types and provides several useful accessors. This /// class extends `SignatureConversion`, which already supports 1:N type /// mappings but lacks some accessors into the mapping as well as access to the /// original types. class OneToNTypeMapping : public TypeConverter::SignatureConversion { … }; /// Extends the basic `RewritePattern` class with a type converter member and /// some accessors to it. This is useful for patterns that are not /// `ConversionPattern`s but still require access to a type converter. class RewritePatternWithConverter : public mlir::RewritePattern { … }; /// Specialization of `PatternRewriter` that `OneToNConversionPattern`s use. The /// class provides additional rewrite methods that are specific to 1:N type /// conversions. class OneToNPatternRewriter : public PatternRewriter { … }; /// Base class for patterns with 1:N type conversions. Derived classes have to /// overwrite the `matchAndRewrite` overlaod that provides additional /// information for 1:N type conversions. class OneToNConversionPattern : public RewritePatternWithConverter { … }; /// This class is a wrapper around `OneToNConversionPattern` for matching /// against instances of a particular op class. template <typename SourceOp> class OneToNOpConversionPattern : public OneToNConversionPattern { … }; /// Applies the given set of patterns recursively on the given op and adds user /// materializations where necessary. The patterns are expected to be /// `OneToNConversionPattern`, which help converting the types of the operands /// and results of the matched ops. The provided type converter is used to /// convert the operands of matched ops from their original types to operands /// with different types. Unlike in `DialectConversion`, this supports 1:N type /// conversions. Those conversions at the "boundary" of the pattern application, /// where converted results are not consumed by replaced ops that expect the /// converted operands or vice versa, the function inserts user materializations /// from the type converter. Also unlike `DialectConversion`, there are no legal /// or illegal types; the function simply applies the given patterns and does /// not fail if some ops or types remain unconverted (i.e., the conversion is /// only "partial"). LogicalResult applyPartialOneToNConversion(Operation *op, OneToNTypeConverter &typeConverter, const FrozenRewritePatternSet &patterns); /// Add a pattern to the given pattern list to convert the signature of a /// FunctionOpInterface op with the given type converter. This only supports /// ops which use FunctionType to represent their type. This is intended to be /// used with the 1:N dialect conversion. void populateOneToNFunctionOpInterfaceTypeConversionPattern( StringRef functionLikeOpName, const TypeConverter &converter, RewritePatternSet &patterns); template <typename FuncOpT> void populateOneToNFunctionOpInterfaceTypeConversionPattern( const TypeConverter &converter, RewritePatternSet &patterns) { … } } // namespace mlir #endif // MLIR_TRANSFORMS_ONETONTYPECONVERSION_H