MLIR  20.0.0git
Classes | Public Member Functions | List of all members
mlir::TypeConverter Class Reference

Type conversion class. More...

#include "mlir/Transforms/DialectConversion.h"

+ Inheritance diagram for mlir::TypeConverter:

Classes

class  AttributeConversionResult
 The general result of a type attribute conversion callback, allowing for early termination. More...
 
class  SignatureConversion
 This class provides all of the information necessary to convert a type signature. More...
 

Public Member Functions

virtual ~TypeConverter ()=default
 
 TypeConverter ()=default
 
 TypeConverter (const TypeConverter &other)
 
TypeConverteroperator= (const TypeConverter &other)
 
template<typename FnT , typename T = typename llvm::function_traits< std::decay_t<FnT>>::template arg_t<0>>
void addConversion (FnT &&callback)
 Register a conversion function. More...
 
template<typename FnT , typename T = typename llvm::function_traits< std::decay_t<FnT>>::template arg_t<1>>
void addArgumentMaterialization (FnT &&callback)
 All of the following materializations require function objects that are convertible to the following form: Value(OpBuilder &, T, ValueRange, Location), where T is any subclass of Type. More...
 
template<typename FnT , typename T = typename llvm::function_traits< std::decay_t<FnT>>::template arg_t<1>>
void addSourceMaterialization (FnT &&callback)
 This method registers a materialization that will be called when converting a legal replacement value back to an illegal source type. More...
 
template<typename FnT , typename T = typename llvm::function_traits< std::decay_t<FnT>>::template arg_t<1>>
void addTargetMaterialization (FnT &&callback)
 This method registers a materialization that will be called when converting an illegal (source) value to a legal (target) type. More...
 
template<typename FnT , typename T = typename llvm::function_traits<std::decay_t<FnT>>::template arg_t<0>, typename A = typename llvm::function_traits<std::decay_t<FnT>>::template arg_t<1>>
void addTypeAttributeConversion (FnT &&callback)
 Register a conversion function for attributes within types. More...
 
LogicalResult convertType (Type t, SmallVectorImpl< Type > &results) const
 Convert the given type. More...
 
Type convertType (Type t) const
 This hook simplifies defining 1-1 type conversions. More...
 
template<typename TargetType >
TargetType convertType (Type t) const
 Attempts a 1-1 type conversion, expecting the result type to be TargetType. More...
 
LogicalResult convertTypes (TypeRange types, SmallVectorImpl< Type > &results) const
 Convert the given set of types, filling 'results' as necessary. More...
 
bool isLegal (Type type) const
 Return true if the given type is legal for this type converter, i.e. More...
 
template<typename RangeT >
std::enable_if_t<!std::is_convertible< RangeT, Type >::value &&!std::is_convertible< RangeT, Operation * >::value, bool > isLegal (RangeT &&range) const
 Return true if all of the given types are legal for this type converter. More...
 
bool isLegal (Operation *op) const
 Return true if the given operation has legal operand and result types. More...
 
bool isLegal (Region *region) const
 Return true if the types of block arguments within the region are legal. More...
 
bool isSignatureLegal (FunctionType ty) const
 Return true if the inputs and outputs of the given function type are legal. More...
 
LogicalResult convertSignatureArg (unsigned inputNo, Type type, SignatureConversion &result) const
 This method allows for converting a specific argument of a signature. More...
 
LogicalResult convertSignatureArgs (TypeRange types, SignatureConversion &result, unsigned origInputOffset=0) const
 
std::optional< SignatureConversionconvertBlockSignature (Block *block) const
 This function converts the type signature of the given block, by invoking 'convertSignatureArg' for each argument. More...
 
Value materializeArgumentConversion (OpBuilder &builder, Location loc, Type resultType, ValueRange inputs) const
 Materialize a conversion from a set of types into one result type by generating a cast sequence of some kind. More...
 
Value materializeSourceConversion (OpBuilder &builder, Location loc, Type resultType, ValueRange inputs) const
 
Value materializeTargetConversion (OpBuilder &builder, Location loc, Type resultType, ValueRange inputs, Type originalType={}) const
 
SmallVector< ValuematerializeTargetConversion (OpBuilder &builder, Location loc, TypeRange resultType, ValueRange inputs, Type originalType={}) const
 
std::optional< AttributeconvertTypeAttribute (Type type, Attribute attr) const
 Convert an attribute present attr from within the type type using the registered conversion functions. More...
 

Detailed Description

Type conversion class.

Specific conversions and materializations can be registered using addConversion and addMaterialization, respectively.

Definition at line 41 of file DialectConversion.h.

Constructor & Destructor Documentation

◆ ~TypeConverter()

virtual mlir::TypeConverter::~TypeConverter ( )
virtualdefault

◆ TypeConverter() [1/2]

mlir::TypeConverter::TypeConverter ( )
default

◆ TypeConverter() [2/2]

mlir::TypeConverter::TypeConverter ( const TypeConverter other)
inline

Definition at line 46 of file DialectConversion.h.

Member Function Documentation

◆ addArgumentMaterialization()

template<typename FnT , typename T = typename llvm::function_traits< std::decay_t<FnT>>::template arg_t<1>>
void mlir::TypeConverter::addArgumentMaterialization ( FnT &&  callback)
inline

All of the following materializations require function objects that are convertible to the following form: Value(OpBuilder &, T, ValueRange, Location), where T is any subclass of Type.

This function is responsible for creating an operation, using the OpBuilder and Location provided, that "casts" a range of values into a single value of the given type T. It must return a Value of the type T on success and nullptr if it failed but other materialization should be attempted. Materialization functions must be provided when a type conversion may persist after the conversion has finished.

Note: Target materializations may optionally accept an additional Type parameter, which is the original type of the SSA value. Furthermore, T can be a TypeRange; in that case, the function must return a SmallVector<Value>. This method registers a materialization that will be called when converting (potentially multiple) block arguments that were the result of a signature conversion of a single block argument, to a single SSA value with the old block argument type.

Definition at line 186 of file DialectConversion.h.

Referenced by mlir::bufferization::BufferizeTypeConverter::BufferizeTypeConverter(), mlir::LLVMTypeConverter::LLVMTypeConverter(), mlir::populateEmitCSizeTTypeConversions(), and mlir::vector::populateVectorLinearizeTypeConversionsAndLegality().

◆ addConversion()

template<typename FnT , typename T = typename llvm::function_traits< std::decay_t<FnT>>::template arg_t<0>>
void mlir::TypeConverter::addConversion ( FnT &&  callback)
inline

Register a conversion function.

A conversion function must be convertible to any of the following forms (where T is a class derived from Type):

  • std::optional<Type>(T)
    • This form represents a 1-1 type conversion. It should return nullptr or std::nullopt to signify failure. If std::nullopt is returned, the converter is allowed to try another conversion function to perform the conversion.
  • std::optional<LogicalResult>(T, SmallVectorImpl<Type> &)
    • This form represents a 1-N type conversion. It should return failure or std::nullopt to signify a failed conversion. If the new set of types is empty, the type is removed and any usages of the existing value are expected to be removed during conversion. If std::nullopt is returned, the converter is allowed to try another conversion function to perform the conversion.

Note: When attempting to convert a type, e.g. via 'convertType', the mostly recently added conversions will be invoked first.

Definition at line 160 of file DialectConversion.h.

Referenced by addOpaquePointerConversion(), mlir::bufferization::BufferizeTypeConverter::BufferizeTypeConverter(), mlir::LLVMTypeConverter::LLVMTypeConverter(), mlir::spirv::MemorySpaceToStorageClassConverter::MemorySpaceToStorageClassConverter(), mlir::arith::NarrowTypeEmulationConverter::NarrowTypeEmulationConverter(), mlir::populateAMXLegalizeForLLVMExportPatterns(), mlir::populateArmSMEToLLVMConversionPatterns(), mlir::populateAsyncStructuralTypeConversionsAndLegality(), mlir::populateEmitCSizeTTypeConversions(), mlir::arith::populateEmulateUnsupportedFloatsConversions(), mlir::math::populateExtendToSupportedTypesTypeConverter(), mlir::memref::populateMemRefNarrowTypeEmulationConversions(), mlir::populateMemRefToEmitCTypeConversion(), mlir::memref::populateMemRefWideIntEmulationConversions(), mlir::populateMMAToSPIRVCoopMatrixTypeConversion(), mlir::populateOpenMPToLLVMConversionPatterns(), mlir::populateSPIRVToLLVMTypeConversion(), mlir::tosa::populateTosaTypeConversion(), mlir::vector::populateVectorLinearizeTypeConversionsAndLegality(), mlir::SPIRVTypeConverter::SPIRVTypeConverter(), and mlir::arith::WideIntEmulationConverter::WideIntEmulationConverter().

◆ addSourceMaterialization()

template<typename FnT , typename T = typename llvm::function_traits< std::decay_t<FnT>>::template arg_t<1>>
void mlir::TypeConverter::addSourceMaterialization ( FnT &&  callback)
inline

This method registers a materialization that will be called when converting a legal replacement value back to an illegal source type.

This is used when some uses of the original, illegal value must persist beyond the main conversion.

Definition at line 197 of file DialectConversion.h.

Referenced by mlir::bufferization::BufferizeTypeConverter::BufferizeTypeConverter(), mlir::LLVMTypeConverter::LLVMTypeConverter(), mlir::populateEmitCSizeTTypeConversions(), mlir::tosa::populateTosaTypeConversion(), mlir::vector::populateVectorLinearizeTypeConversionsAndLegality(), and mlir::SPIRVTypeConverter::SPIRVTypeConverter().

◆ addTargetMaterialization()

template<typename FnT , typename T = typename llvm::function_traits< std::decay_t<FnT>>::template arg_t<1>>
void mlir::TypeConverter::addTargetMaterialization ( FnT &&  callback)
inline

This method registers a materialization that will be called when converting an illegal (source) value to a legal (target) type.

Note: For target materializations, users can optionally take the original type. This type may be different from the type of the input. For example, let's assume that a conversion pattern "P1" replaced an SSA value "v1" (type "t1") with "v2" (type "t2"). Then a different conversion pattern "P2" matches an op that has "v1" as an operand. Let's furthermore assume that "P2" determines that the legalized type of "t1" is "t3", which may be different from "t2". In this example, the target materialization will be invoked with: outputType = "t3", inputs = "v2", from just "t3" and "v2"; that's why the originalType parameter exists.

Note: During a 1:N conversion, the result types can be a TypeRange. In that case the materialization produces a SmallVector<Value>.

Definition at line 220 of file DialectConversion.h.

Referenced by mlir::bufferization::BufferizeTypeConverter::BufferizeTypeConverter(), mlir::LLVMTypeConverter::LLVMTypeConverter(), mlir::populateEmitCSizeTTypeConversions(), mlir::arith::populateEmulateUnsupportedFloatsConversions(), mlir::math::populateExtendToSupportedTypesTypeConverter(), mlir::tosa::populateTosaTypeConversion(), mlir::vector::populateVectorLinearizeTypeConversionsAndLegality(), and mlir::SPIRVTypeConverter::SPIRVTypeConverter().

◆ addTypeAttributeConversion()

template<typename FnT , typename T = typename llvm::function_traits<std::decay_t<FnT>>::template arg_t<0>, typename A = typename llvm::function_traits<std::decay_t<FnT>>::template arg_t<1>>
void mlir::TypeConverter::addTypeAttributeConversion ( FnT &&  callback)
inline

Register a conversion function for attributes within types.

Type converters may call this function in order to allow hoking into the translation of attributes that exist within types. For example, a type converter for the memref type could use these conversions to convert memory spaces or layouts in an extensible way.

The conversion functions take a non-null Type or subclass of Type and a non-null Attribute (or subclass of Attribute), and returns a AttributeConversionResult. This result can either contan an Attribute, which may be nullptr, representing the conversion's success, AttributeConversionResult::na() (the default empty value), indicating that the conversion function did not apply and that further conversion functions should be checked, or AttributeConversionResult::abort() indicating that the conversion process should be aborted.

Registered conversion functions are callled in the reverse of the order in which they were registered.

Definition at line 248 of file DialectConversion.h.

Referenced by mlir::LLVMTypeConverter::LLVMTypeConverter(), and mlir::populateGpuMemorySpaceAttributeConversions().

◆ convertBlockSignature()

std::optional< TypeConverter::SignatureConversion > TypeConverter::convertBlockSignature ( Block block) const

This function converts the type signature of the given block, by invoking 'convertSignatureArg' for each argument.

This function should return a valid conversion for the signature on success, std::nullopt otherwise.

Definition at line 2934 of file DialectConversion.cpp.

References convertSignatureArgs(), mlir::Block::getArgumentTypes(), and mlir::Block::getNumArguments().

Referenced by mlir::detail::ConversionPatternRewriterImpl::convertRegionTypes().

◆ convertSignatureArg()

LogicalResult TypeConverter::convertSignatureArg ( unsigned  inputNo,
Type  type,
SignatureConversion result 
) const

This method allows for converting a specific argument of a signature.

It takes as inputs the original argument input number, type. On success, it populates 'result' with any new mappings.

Definition at line 2858 of file DialectConversion.cpp.

References mlir::TypeConverter::SignatureConversion::addInputs(), and convertType().

Referenced by convertSignatureArgs().

◆ convertSignatureArgs()

LogicalResult TypeConverter::convertSignatureArgs ( TypeRange  types,
SignatureConversion result,
unsigned  origInputOffset = 0 
) const

Definition at line 2874 of file DialectConversion.cpp.

References convertSignatureArg().

Referenced by convertBlockSignature(), and convertFuncOpTypes().

◆ convertType() [1/3]

Type TypeConverter::convertType ( Type  t) const

This hook simplifies defining 1-1 type conversions.

This function returns the type to convert to on success, and a null type on failure.

Definition at line 2821 of file DialectConversion.cpp.

References convertType().

◆ convertType() [2/3]

template<typename TargetType >
TargetType mlir::TypeConverter::convertType ( Type  t) const
inline

Attempts a 1-1 type conversion, expecting the result type to be TargetType.

Returns the converted type cast to TargetType on success, and a null type on conversion or cast failure.

Definition at line 267 of file DialectConversion.h.

References convertType().

◆ convertType() [3/3]

LogicalResult TypeConverter::convertType ( Type  t,
SmallVectorImpl< Type > &  results 
) const

Convert the given type.

This function should return failure if no valid conversion exists, success otherwise. If the new set of types is empty, the type is removed and any usages of the existing value are expected to be removed during conversion.

Definition at line 2776 of file DialectConversion.cpp.

References mlir::Type::getContext(), and mlir::MLIRContext::isMultithreadingEnabled().

Referenced by adjustAccessChainForBitwidth(), broadcast(), convertArrayType(), mlir::spirv::convertMemRefTypesAndAttrs(), convertRuntimeArrayType(), convertSignatureArg(), convertType(), convertTypes(), mlir::ConvertToLLVMPattern::createMemRefDescriptor(), decomposeValue(), emitElementwiseComputation(), mlir::bufferization::getGlobalFor(), mlir::ConvertToLLVMPattern::getMemRefDescriptorSizes(), mlir::ConvertToLLVMPattern::getSizeInBytes(), mlir::detail::ConversionPatternRewriterImpl::insertNTo1Materialization(), mlir::ConvertToLLVMPattern::isConvertibleAndHasIdentityMaps(), isLegal(), legalizeBlockArguments(), lowerAsEntryFunction(), mlir::GPUDynamicSharedMemoryOpLowering::matchAndRewrite(), mlir::GPUFuncOpLowering::matchAndRewrite(), mlir::GPUPrintfOpToHIPLowering::matchAndRewrite(), mlir::GPUPrintfOpToLLVMCallLowering::matchAndRewrite(), mlir::GPUPrintfOpToVPrintfLowering::matchAndRewrite(), mlir::spirv::ElementwiseOpPattern< Op, SPIRVOp >::matchAndRewrite(), mlir::populateAsyncStructuralTypeConversionsAndLegality(), mlir::populateMemRefToEmitCTypeConversion(), mlir::memref::populateMemRefWideIntEmulationConversions(), mlir::tosa::populateTosaTypeConversion(), mlir::registerConversionPDLFunctions(), mlir::detail::ConversionPatternRewriterImpl::remapValues(), replaceWithLoadOrStore(), and wmmaPushInputOperand().

◆ convertTypeAttribute()

std::optional< Attribute > TypeConverter::convertTypeAttribute ( Type  type,
Attribute  attr 
) const

Convert an attribute present attr from within the type type using the registered conversion functions.

If no applicable conversion has been registered, return std::nullopt. Note that the empty attribute/nullptr is a valid return value for this function.

Definition at line 2977 of file DialectConversion.cpp.

References mlir::TypeConverter::AttributeConversionResult::getResult(), mlir::TypeConverter::AttributeConversionResult::hasResult(), and mlir::TypeConverter::AttributeConversionResult::isAbort().

Referenced by mlir::LLVMTypeConverter::getMemRefAddressSpace().

◆ convertTypes()

LogicalResult TypeConverter::convertTypes ( TypeRange  types,
SmallVectorImpl< Type > &  results 
) const

◆ isLegal() [1/4]

bool TypeConverter::isLegal ( Operation op) const

Return true if the given operation has legal operand and result types.

Definition at line 2843 of file DialectConversion.cpp.

References mlir::Operation::getOperandTypes(), mlir::Operation::getResultTypes(), and isLegal().

◆ isLegal() [2/4]

template<typename RangeT >
std::enable_if_t<!std::is_convertible<RangeT, Type>::value && !std::is_convertible<RangeT, Operation *>::value, bool> mlir::TypeConverter::isLegal ( RangeT &&  range) const
inline

Return true if all of the given types are legal for this type converter.

Definition at line 286 of file DialectConversion.h.

References isLegal().

◆ isLegal() [3/4]

bool TypeConverter::isLegal ( Region region) const

Return true if the types of block arguments within the region are legal.

Definition at line 2847 of file DialectConversion.cpp.

References mlir::Block::getArgumentTypes(), and isLegal().

◆ isLegal() [4/4]

bool TypeConverter::isLegal ( Type  type) const

◆ isSignatureLegal()

bool TypeConverter::isSignatureLegal ( FunctionType  ty) const

Return true if the inputs and outputs of the given function type are legal.

Definition at line 2853 of file DialectConversion.cpp.

References isLegal().

◆ materializeArgumentConversion()

Value TypeConverter::materializeArgumentConversion ( OpBuilder builder,
Location  loc,
Type  resultType,
ValueRange  inputs 
) const

Materialize a conversion from a set of types into one result type by generating a cast sequence of some kind.

See the respective add*Materialization for more information on the context for these methods.

Definition at line 2883 of file DialectConversion.cpp.

Referenced by mlir::applyPartialOneToNConversion(), and legalizeUnresolvedMaterialization().

◆ materializeSourceConversion()

Value TypeConverter::materializeSourceConversion ( OpBuilder builder,
Location  loc,
Type  resultType,
ValueRange  inputs 
) const

◆ materializeTargetConversion() [1/2]

Value TypeConverter::materializeTargetConversion ( OpBuilder builder,
Location  loc,
Type  resultType,
ValueRange  inputs,
Type  originalType = {} 
) const

◆ materializeTargetConversion() [2/2]

SmallVector< Value > TypeConverter::materializeTargetConversion ( OpBuilder builder,
Location  loc,
TypeRange  resultType,
ValueRange  inputs,
Type  originalType = {} 
) const

Definition at line 2916 of file DialectConversion.cpp.

◆ operator=()

TypeConverter& mlir::TypeConverter::operator= ( const TypeConverter other)
inline

Definition at line 52 of file DialectConversion.h.


The documentation for this class was generated from the following files: