MLIR  20.0.0git
Public Member Functions | Static Public Member Functions | Protected Member Functions | Protected Attributes | Friends | List of all members
mlir::LLVMTypeConverter Class Reference

Conversion from types to the LLVM IR dialect. More...

#include "mlir/Conversion/LLVMCommon/TypeConverter.h"

+ Inheritance diagram for mlir::LLVMTypeConverter:

Public Member Functions

 LLVMTypeConverter (MLIRContext *ctx, const DataLayoutAnalysis *analysis=nullptr)
 Create an LLVMTypeConverter using the default LowerToLLVMOptions. More...
 
 LLVMTypeConverter (MLIRContext *ctx, const LowerToLLVMOptions &options, const DataLayoutAnalysis *analysis=nullptr)
 Create an LLVMTypeConverter using custom LowerToLLVMOptions. More...
 
Type convertFunctionSignature (FunctionType funcTy, bool isVariadic, bool useBarePtrCallConv, SignatureConversion &result) const
 Convert a function type. More...
 
Type convertFunctionSignature (FunctionOpInterface funcOp, bool isVariadic, bool useBarePtrCallConv, LLVMTypeConverter::SignatureConversion &result, SmallVectorImpl< std::optional< NamedAttribute >> &byValRefNonPtrAttrs) const
 Convert a function type. More...
 
Type packFunctionResults (TypeRange types, bool useBarePointerCallConv=false) const
 Convert a non-empty list of types to be returned from a function into an LLVM-compatible type. More...
 
Type packOperationResults (TypeRange types) const
 Convert a non-empty list of types of values produced by an operation into an LLVM-compatible type. More...
 
Type convertCallingConventionType (Type type, bool useBarePointerCallConv=false) const
 Convert a type in the context of the default or bare pointer calling convention. More...
 
void promoteBarePtrsToDescriptors (ConversionPatternRewriter &rewriter, Location loc, ArrayRef< Type > stdTypes, SmallVectorImpl< Value > &values) const
 Promote the bare pointers in 'values' that resulted from memrefs to descriptors. More...
 
MLIRContextgetContext () const
 Returns the MLIR context. More...
 
LLVM::LLVMDialect * getDialect () const
 Returns the LLVM dialect. More...
 
const LowerToLLVMOptionsgetOptions () const
 
SmallVector< Value, 4 > promoteOperands (Location loc, ValueRange opOperands, ValueRange operands, OpBuilder &builder, bool useBarePtrCallConv=false) const
 Promote the LLVM representation of all operands including promoting MemRef descriptors to stack and use pointers to struct to avoid the complexity of the platform-specific C/C++ ABI lowering related to struct argument passing. More...
 
Value promoteOneMemRefDescriptor (Location loc, Value operand, OpBuilder &builder) const
 Promote the LLVM struct representation of one MemRef descriptor to stack and use pointer to struct to avoid the complexity of the platform-specific C/C++ ABI lowering related to struct argument passing. More...
 
std::pair< LLVM::LLVMFunctionType, LLVM::LLVMStructTypeconvertFunctionTypeCWrapper (FunctionType type) const
 Converts the function type to a C-compatible format, in particular using pointers to memref descriptors for arguments. More...
 
const llvm::DataLayout & getDataLayout () const
 Returns the data layout to use during and after conversion. More...
 
const DataLayoutAnalysisgetDataLayoutAnalysis () const
 Returns the data layout analysis to query during conversion. More...
 
Type getIndexType () const
 Gets the LLVM representation of the index type. More...
 
unsigned getIndexTypeBitwidth () const
 Gets the bitwidth of the index type when converted to LLVM. More...
 
unsigned getPointerBitwidth (unsigned addressSpace=0) const
 Gets the pointer bitwidth. More...
 
unsigned getMemRefDescriptorSize (MemRefType type, const DataLayout &layout) const
 Returns the size of the memref descriptor object in bytes. More...
 
unsigned getUnrankedMemRefDescriptorSize (UnrankedMemRefType type, const DataLayout &layout) const
 Returns the size of the unranked memref descriptor object in bytes. More...
 
FailureOr< unsigned > getMemRefAddressSpace (BaseMemRefType type) const
 Return the LLVM address space corresponding to the memory space of the memref type type or failure if the memory space cannot be converted to an integer. 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...
 
- Public Member Functions inherited from mlir::TypeConverter
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...
 

Static Public Member Functions

static bool canConvertToBarePtr (BaseMemRefType type)
 Check if a memref type can be converted to a bare pointer. More...
 

Protected Member Functions

SmallVector< Type > & getCurrentThreadRecursiveStack ()
 

Protected Attributes

LLVM::LLVMDialect * llvmDialect
 Pointer to the LLVM dialect. More...
 
DenseMap< uint64_t, std::unique_ptr< SmallVector< Type > > > conversionCallStack
 
llvm::sys::SmartRWMutex< true > callStackMutex
 

Friends

LogicalResult structFuncArgTypeConverter (const LLVMTypeConverter &converter, Type type, SmallVectorImpl< Type > &result)
 Give structFuncArgTypeConverter access to memref-specific functions. More...
 

Detailed Description

Conversion from types to the LLVM IR dialect.

Definition at line 35 of file TypeConverter.h.

Constructor & Destructor Documentation

◆ LLVMTypeConverter() [1/2]

LLVMTypeConverter::LLVMTypeConverter ( MLIRContext ctx,
const DataLayoutAnalysis analysis = nullptr 
)

Create an LLVMTypeConverter using the default LowerToLLVMOptions.

Create an LLVMTypeConverter using default LowerToLLVMOptions.

Optionally takes a data layout analysis to use in conversions.

Definition at line 43 of file TypeConverter.cpp.

◆ LLVMTypeConverter() [2/2]

LLVMTypeConverter::LLVMTypeConverter ( MLIRContext ctx,
const LowerToLLVMOptions options,
const DataLayoutAnalysis analysis = nullptr 
)

Member Function Documentation

◆ canConvertToBarePtr()

bool LLVMTypeConverter::canConvertToBarePtr ( BaseMemRefType  type)
static

Check if a memref type can be converted to a bare pointer.

Definition at line 536 of file TypeConverter.cpp.

References mlir::getStridesAndOffset().

Referenced by canBeCalledWithBarePointers().

◆ convertCallingConventionType()

Type LLVMTypeConverter::convertCallingConventionType ( Type  type,
bool  useBarePtrCallConv = false 
) const

Convert a type in the context of the default or bare pointer calling convention.

Calling convention sensitive types, such as MemRefType and UnrankedMemRefType, are converted following the specific rules for the calling convention. Calling convention independent types are converted following the default LLVM type conversions.

Definition at line 605 of file TypeConverter.cpp.

References convertType().

Referenced by mlir::barePtrFuncArgTypeConverter(), and packFunctionResults().

◆ convertFunctionSignature() [1/2]

Type LLVMTypeConverter::convertFunctionSignature ( FunctionOpInterface  funcOp,
bool  isVariadic,
bool  useBarePtrCallConv,
LLVMTypeConverter::SignatureConversion result,
SmallVectorImpl< std::optional< NamedAttribute >> &  byValRefNonPtrAttrs 
) const

Convert a function type.

The arguments and results are converted one by one and results are packed into a wrapped LLVM IR structure type. result is populated with argument mapping. Converted types of llvm.byval and llvm.byref function arguments which are not LLVM pointers are overridden with LLVM pointers. Overridden arguments are returned in byValRefNonPtrAttrs.

Definition at line 354 of file TypeConverter.cpp.

References filterByValRefArgAttrs().

◆ convertFunctionSignature() [2/2]

Type LLVMTypeConverter::convertFunctionSignature ( FunctionType  funcTy,
bool  isVariadic,
bool  useBarePtrCallConv,
LLVMTypeConverter::SignatureConversion result 
) const

Convert a function type.

The arguments and results are converted one by one and results are packed into a wrapped LLVM IR structure type. result is populated with argument mapping.

Definition at line 346 of file TypeConverter.cpp.

Referenced by mlir::convertFuncOpToLLVMFuncOp(), and mlir::GPUFuncOpLowering::matchAndRewrite().

◆ convertFunctionTypeCWrapper()

std::pair< LLVM::LLVMFunctionType, LLVM::LLVMStructType > LLVMTypeConverter::convertFunctionTypeCWrapper ( FunctionType  type) const

Converts the function type to a C-compatible format, in particular using pointers to memref descriptors for arguments.

Also converts the return type to a pointer argument if it is a struct. Returns true if this was the case.

Definition at line 370 of file TypeConverter.cpp.

References convertType(), mlir::get(), getContext(), mlir::LLVM::isCompatibleType(), and packFunctionResults().

Referenced by wrapExternalFunction(), and wrapForExternalCallers().

◆ convertType() [1/3]

Type TypeConverter::convertType

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 261 of file DialectConversion.cpp.

◆ convertType() [2/3]

template<typename TargetType >
TargetType mlir::TypeConverter::convertType ( typename TargetType  )
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.

◆ convertType() [3/3]

LogicalResult TypeConverter::convertType

◆ getContext()

MLIRContext & LLVMTypeConverter::getContext ( ) const

◆ getCurrentThreadRecursiveStack()

SmallVector< Type > & LLVMTypeConverter::getCurrentThreadRecursiveStack ( )
protected

Definition at line 22 of file TypeConverter.cpp.

References callStackMutex, conversionCallStack, and getContext().

Referenced by LLVMTypeConverter().

◆ getDataLayout()

const llvm::DataLayout& mlir::LLVMTypeConverter::getDataLayout ( ) const
inline

Returns the data layout to use during and after conversion.

Definition at line 131 of file TypeConverter.h.

References mlir::LowerToLLVMOptions::dataLayout.

Referenced by getMemRefAlignment().

◆ getDataLayoutAnalysis()

const DataLayoutAnalysis* mlir::LLVMTypeConverter::getDataLayoutAnalysis ( ) const
inline

Returns the data layout analysis to query during conversion.

Definition at line 134 of file TypeConverter.h.

◆ getDialect()

LLVM::LLVMDialect* mlir::LLVMTypeConverter::getDialect ( ) const
inline

Returns the LLVM dialect.

Definition at line 105 of file TypeConverter.h.

References llvmDialect.

Referenced by getContext(), mlir::ConvertToLLVMPattern::getDialect(), and mlir::populateVectorToLLVMConversionPatterns().

◆ getIndexType()

Type LLVMTypeConverter::getIndexType ( ) const

◆ getIndexTypeBitwidth()

unsigned mlir::LLVMTypeConverter::getIndexTypeBitwidth ( ) const
inline

Gets the bitwidth of the index type when converted to LLVM.

Definition at line 143 of file TypeConverter.h.

References mlir::LowerToLLVMOptions::getIndexBitwidth().

Referenced by mlir::UnrankedMemRefDescriptor::computeSizes(), and getIndexType().

◆ getMemRefAddressSpace()

FailureOr< unsigned > LLVMTypeConverter::getMemRefAddressSpace ( BaseMemRefType  type) const

Return the LLVM address space corresponding to the memory space of the memref type type or failure if the memory space cannot be converted to an integer.

Definition at line 518 of file TypeConverter.cpp.

References mlir::TypeConverter::convertTypeAttribute(), and mlir::BaseMemRefType::getMemorySpace().

Referenced by castAllocFuncResult(), mlir::ConvertToLLVMPattern::copyUnrankedDescriptors(), getDynamicSharedMemorySymbol(), mlir::ConvertToLLVMPattern::getElementPtrType(), getMemRefDescriptorSize(), getUnrankedMemRefDescriptorSize(), and isMemRefTypeSupported().

◆ getMemRefDescriptorSize()

unsigned LLVMTypeConverter::getMemRefDescriptorSize ( MemRefType  type,
const DataLayout layout 
) const

Returns the size of the memref descriptor object in bytes.

Definition at line 469 of file TypeConverter.cpp.

References mlir::detail::divideCeil(), getIndexType(), getMemRefAddressSpace(), getPointerBitwidth(), and mlir::DataLayout::getTypeSize().

◆ getOptions()

const LowerToLLVMOptions& mlir::LLVMTypeConverter::getOptions ( ) const
inline

◆ getPointerBitwidth()

unsigned LLVMTypeConverter::getPointerBitwidth ( unsigned  addressSpace = 0) const

◆ getUnrankedMemRefDescriptorSize()

unsigned LLVMTypeConverter::getUnrankedMemRefDescriptorSize ( UnrankedMemRefType  type,
const DataLayout layout 
) const

Returns the size of the unranked memref descriptor object in bytes.

Definition at line 501 of file TypeConverter.cpp.

References mlir::detail::divideCeil(), getIndexType(), getMemRefAddressSpace(), getPointerBitwidth(), and mlir::DataLayout::getTypeSize().

◆ packFunctionResults()

Type LLVMTypeConverter::packFunctionResults ( TypeRange  types,
bool  useBarePtrCallConv = false 
) const

Convert a non-empty list of types to be returned from a function into an LLVM-compatible type.

In particular, if more than one value is returned, create an LLVM dialect structure type with elements that correspond to each of the types converted with convertCallingConventionType.

Definition at line 653 of file TypeConverter.cpp.

References convertCallingConventionType(), getContext(), mlir::LLVM::LLVMStructType::getLiteral(), mlir::LLVM::isCompatibleType(), and mlir::LowerToLLVMOptions::useBarePtrCallConv.

Referenced by convertFunctionTypeCWrapper(), and mlir::GPUReturnOpLowering::matchAndRewrite().

◆ packOperationResults()

Type LLVMTypeConverter::packOperationResults ( TypeRange  types) const

Convert a non-empty list of types of values produced by an operation into an LLVM-compatible type.

In particular, if more than one value is produced, create a literal structure with elements that correspond to each of the LLVM-compatible types converted with convertType.

In particular, if more than one value is produced, create a literal structure with elements that correspond to each of the types converted with convertType.

Definition at line 632 of file TypeConverter.cpp.

References convertType(), getContext(), mlir::LLVM::LLVMStructType::getLiteral(), and mlir::LLVM::isCompatibleType().

Referenced by mlir::LLVM::detail::oneToOneRewrite().

◆ promoteBarePtrsToDescriptors()

void LLVMTypeConverter::promoteBarePtrsToDescriptors ( ConversionPatternRewriter rewriter,
Location  loc,
ArrayRef< Type stdTypes,
SmallVectorImpl< Value > &  values 
) const

Promote the bare pointers in 'values' that resulted from memrefs to descriptors.

'stdTypes' holds the types of 'values' before the conversion to the LLVM-IR dialect (i.e., MemRefType, or any other builtin type).

'stdTypes' holds they types of 'values' before the conversion to the LLVM-IR dialect (i.e., MemRefType, or any other builtin type).

Definition at line 617 of file TypeConverter.cpp.

References mlir::MemRefDescriptor::fromStaticShape().

◆ promoteOneMemRefDescriptor()

Value LLVMTypeConverter::promoteOneMemRefDescriptor ( Location  loc,
Value  operand,
OpBuilder builder 
) const

Promote the LLVM struct representation of one MemRef descriptor to stack and use pointer to struct to avoid the complexity of the platform-specific C/C++ ABI lowering related to struct argument passing.

Definition at line 673 of file TypeConverter.cpp.

References mlir::OpBuilder::create(), mlir::get(), mlir::Builder::getContext(), mlir::Builder::getI64Type(), mlir::Builder::getIndexAttr(), and mlir::Value::getType().

◆ promoteOperands()

SmallVector< Value, 4 > LLVMTypeConverter::promoteOperands ( Location  loc,
ValueRange  opOperands,
ValueRange  operands,
OpBuilder builder,
bool  useBarePtrCallConv = false 
) const

Promote the LLVM representation of all operands including promoting MemRef descriptors to stack and use pointers to struct to avoid the complexity of the platform-specific C/C++ ABI lowering related to struct argument passing.

Definition at line 688 of file TypeConverter.cpp.

References mlir::MemRefDescriptor::alignedPtr(), mlir::MemRefDescriptor::unpack(), mlir::UnrankedMemRefDescriptor::unpack(), and mlir::LowerToLLVMOptions::useBarePtrCallConv.

Friends And Related Function Documentation

◆ structFuncArgTypeConverter

LogicalResult structFuncArgTypeConverter ( const LLVMTypeConverter converter,
Type  type,
SmallVectorImpl< Type > &  result 
)
friend

Give structFuncArgTypeConverter access to memref-specific functions.

It converts a MemRef function argument to a list of non-aggregate types containing descriptor information, and an UnrankedmemRef function argument to a list containing the rank and a pointer to a descriptor struct.

Member Data Documentation

◆ callStackMutex

llvm::sys::SmartRWMutex<true> mlir::LLVMTypeConverter::callStackMutex
protected

Definition at line 171 of file TypeConverter.h.

Referenced by getCurrentThreadRecursiveStack().

◆ conversionCallStack

DenseMap<uint64_t, std::unique_ptr<SmallVector<Type> > > mlir::LLVMTypeConverter::conversionCallStack
protected

Definition at line 170 of file TypeConverter.h.

Referenced by getCurrentThreadRecursiveStack().

◆ llvmDialect

LLVM::LLVMDialect* mlir::LLVMTypeConverter::llvmDialect
protected

Pointer to the LLVM dialect.

Definition at line 166 of file TypeConverter.h.

Referenced by getDialect(), and LLVMTypeConverter().


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