22 #include "llvm/ADT/ScopeExit.h"
23 #include "llvm/ADT/TypeSwitch.h"
24 #include "llvm/Support/TypeSize.h"
53 params.push_back(type);
61 params.push_back(type);
68 llvm::interleaveComma(params, p,
93 auto typeOrIntParser = [&]() -> ParseResult {
96 if (intResult.has_value() && !failed(*intResult)) {
98 intParams.push_back(i);
108 typeParams.push_back(t);
116 "failed to parse parameter list for target extension type");
125 if (!typeParams.empty() && !intParams.empty())
139 LLVM_ATTRIBUTE_UNUSED
static LogicalResult
142 #include "mlir/Dialect/LLVMIR/LLVMTypeInterfaces.cpp.inc"
144 #define GET_TYPEDEF_CLASSES
145 #include "mlir/Dialect/LLVMIR/LLVMTypes.cpp.inc"
151 bool LLVMArrayType::isValidElementType(
Type type) {
152 return !llvm::isa<LLVMVoidType, LLVMLabelType, LLVMMetadataType,
153 LLVMFunctionType, LLVMTokenType, LLVMScalableVectorType>(
158 assert(elementType &&
"expected non-null subtype");
164 Type elementType, uint64_t numElements) {
165 assert(elementType &&
"expected non-null subtype");
172 Type elementType, uint64_t numElements) {
173 if (!isValidElementType(elementType))
174 return emitError() <<
"invalid array element type: " << elementType;
182 LLVMArrayType::getTypeSizeInBits(
const DataLayout &dataLayout,
185 getTypeSize(dataLayout, params));
188 llvm::TypeSize LLVMArrayType::getTypeSize(
const DataLayout &dataLayout,
195 uint64_t LLVMArrayType::getABIAlignment(
const DataLayout &dataLayout,
201 LLVMArrayType::getPreferredAlignment(
const DataLayout &dataLayout,
210 bool LLVMFunctionType::isValidArgumentType(
Type type) {
211 return !llvm::isa<LLVMVoidType, LLVMFunctionType>(type);
214 bool LLVMFunctionType::isValidResultType(
Type type) {
215 return !llvm::isa<LLVMFunctionType, LLVMMetadataType, LLVMLabelType>(type);
220 assert(result &&
"expected non-null result");
228 assert(result &&
"expected non-null result");
235 assert(results.size() == 1 &&
"expected a single result type");
236 return get(results[0], llvm::to_vector(inputs), isVarArg());
240 return static_cast<detail::LLVMFunctionTypeStorage *
>(getImpl())->returnType;
246 if (!isValidResultType(result))
247 return emitError() <<
"invalid function result type: " << result;
249 for (
Type arg : arguments)
250 if (!isValidArgumentType(arg))
251 return emitError() <<
"invalid function argument type: " << arg;
264 auto spec = cast<DenseIntElementsAttr>(attr);
265 auto idx =
static_cast<int64_t
>(pos);
266 if (idx >= spec.size())
268 return spec.getValues<uint64_t>()[idx];
275 static std::optional<uint64_t>
280 for (DataLayoutEntryInterface entry : params) {
281 if (!entry.isTypeEntry())
283 if (cast<LLVMPointerType>(cast<Type>(entry.getKey())).getAddressSpace() ==
284 type.getAddressSpace()) {
285 currentEntry = entry.getValue();
302 if (type.getAddressSpace() == 0) {
312 LLVMPointerType::getTypeSizeInBits(
const DataLayout &dataLayout,
314 if (std::optional<uint64_t> size =
316 return llvm::TypeSize::getFixed(*size);
323 uint64_t LLVMPointerType::getABIAlignment(
const DataLayout &dataLayout,
325 if (std::optional<uint64_t> alignment =
333 LLVMPointerType::getPreferredAlignment(
const DataLayout &dataLayout,
335 if (std::optional<uint64_t> alignment =
342 std::optional<uint64_t>
345 if (std::optional<uint64_t> indexBitwidth =
347 return *indexBitwidth;
354 for (DataLayoutEntryInterface newEntry : newLayout) {
355 if (!newEntry.isTypeEntry())
360 llvm::cast<LLVMPointerType>(llvm::cast<Type>(newEntry.getKey()));
362 llvm::find_if(oldLayout, [&](DataLayoutEntryInterface entry) {
363 if (
auto type = llvm::dyn_cast_if_present<Type>(entry.getKey())) {
364 return llvm::cast<LLVMPointerType>(type).getAddressSpace() ==
365 newType.getAddressSpace();
369 if (it == oldLayout.end()) {
370 llvm::find_if(oldLayout, [&](DataLayoutEntryInterface entry) {
371 if (
auto type = llvm::dyn_cast_if_present<Type>(entry.getKey())) {
372 return llvm::cast<LLVMPointerType>(type).getAddressSpace() == 0;
377 if (it != oldLayout.end()) {
382 Attribute newSpec = llvm::cast<DenseIntElementsAttr>(newEntry.getValue());
385 if (size != newSize || abi < newAbi || abi % newAbi != 0)
393 for (DataLayoutEntryInterface entry : entries) {
394 if (!entry.isTypeEntry())
396 auto key = llvm::cast<Type>(entry.getKey());
397 auto values = llvm::dyn_cast<DenseIntElementsAttr>(entry.getValue());
398 if (!values || (values.size() != 3 && values.size() != 4)) {
400 <<
"expected layout attribute for " << key
401 <<
" to be a dense integer elements attribute with 3 or 4 "
404 if (!values.getElementType().isInteger(64))
405 return emitError(loc) <<
"expected i64 parameters for " << key;
409 return emitError(loc) <<
"preferred alignment is expected to be at least "
410 "as large as ABI alignment";
420 bool LLVMStructType::isValidElementType(
Type type) {
421 return !llvm::isa<LLVMVoidType, LLVMLabelType, LLVMMetadataType,
422 LLVMFunctionType, LLVMTokenType>(type);
425 LLVMStructType LLVMStructType::getIdentified(
MLIRContext *context,
430 LLVMStructType LLVMStructType::getIdentifiedChecked(
433 return Base::getChecked(
emitError, context, name,
false);
436 LLVMStructType LLVMStructType::getNewIdentified(
MLIRContext *context,
440 std::string stringName = name.str();
441 unsigned counter = 0;
443 auto type = LLVMStructType::getIdentified(context, stringName);
444 if (type.isInitialized() || failed(type.setBody(elements, isPacked))) {
446 stringName = (Twine(name) +
"." + std::to_string(counter)).str();
453 LLVMStructType LLVMStructType::getLiteral(
MLIRContext *context,
455 return Base::get(context, types, isPacked);
462 return Base::getChecked(
emitError, context, types, isPacked);
465 LLVMStructType LLVMStructType::getOpaque(StringRef name,
MLIRContext *context) {
472 return Base::getChecked(
emitError, context, name,
true);
475 LogicalResult LLVMStructType::setBody(
ArrayRef<Type> types,
bool isPacked) {
476 assert(isIdentified() &&
"can only set bodies of identified structs");
477 assert(llvm::all_of(types, LLVMStructType::isValidElementType) &&
478 "expected valid body types");
479 return Base::mutate(types, isPacked);
482 bool LLVMStructType::isPacked()
const {
return getImpl()->isPacked(); }
483 bool LLVMStructType::isIdentified()
const {
return getImpl()->isIdentified(); }
484 bool LLVMStructType::isOpaque()
const {
485 return getImpl()->isIdentified() &&
486 (getImpl()->isOpaque() || !getImpl()->isInitialized());
488 bool LLVMStructType::isInitialized() {
return getImpl()->isInitialized(); }
489 StringRef LLVMStructType::getName()
const {
return getImpl()->getIdentifier(); }
491 return isIdentified() ? getImpl()->getIdentifiedStructBody()
492 : getImpl()->getTypeList();
505 if (!isValidElementType(t))
506 return emitError() <<
"invalid LLVM structure element type: " << t;
512 LLVMStructType::getTypeSizeInBits(
const DataLayout &dataLayout,
514 auto structSize = llvm::TypeSize::getFixed(0);
515 uint64_t structAlignment = 1;
516 for (
Type element : getBody()) {
517 uint64_t elementAlignment =
521 structSize = llvm::alignTo(structSize, elementAlignment);
526 structAlignment =
std::max(elementAlignment, structAlignment);
530 structSize = llvm::alignTo(structSize, structAlignment);
538 static std::optional<uint64_t>
540 StructDLEntryPos pos) {
541 const auto *currentEntry =
542 llvm::find_if(params, [](DataLayoutEntryInterface entry) {
543 return entry.isTypeEntry();
545 if (currentEntry == params.end())
548 auto attr = llvm::cast<DenseIntElementsAttr>(currentEntry->getValue());
549 if (pos == StructDLEntryPos::Preferred &&
550 attr.size() <=
static_cast<int64_t
>(StructDLEntryPos::Preferred))
552 pos = StructDLEntryPos::Abi;
554 return attr.getValues<uint64_t>()[
static_cast<size_t>(pos)];
560 StructDLEntryPos pos) {
562 if (pos == StructDLEntryPos::Abi && type.isPacked()) {
568 uint64_t structAlignment = 1;
569 for (
Type iter : type.getBody()) {
575 if (std::optional<uint64_t> entryResult =
579 return structAlignment;
582 uint64_t LLVMStructType::getABIAlignment(
const DataLayout &dataLayout,
585 StructDLEntryPos::Abi);
589 LLVMStructType::getPreferredAlignment(
const DataLayout &dataLayout,
592 StructDLEntryPos::Preferred);
596 return llvm::cast<DenseIntElementsAttr>(attr)
597 .getValues<uint64_t>()[
static_cast<size_t>(pos)];
602 for (DataLayoutEntryInterface newEntry : newLayout) {
603 if (!newEntry.isTypeEntry())
606 const auto *previousEntry =
607 llvm::find_if(oldLayout, [](DataLayoutEntryInterface entry) {
608 return entry.isTypeEntry();
610 if (previousEntry == oldLayout.end())
614 StructDLEntryPos::Abi);
617 if (abi < newAbi || abi % newAbi != 0)
625 for (DataLayoutEntryInterface entry : entries) {
626 if (!entry.isTypeEntry())
629 auto key = llvm::cast<LLVMStructType>(llvm::cast<Type>(entry.getKey()));
630 auto values = llvm::dyn_cast<DenseIntElementsAttr>(entry.getValue());
631 if (!values || (values.size() != 2 && values.size() != 1)) {
633 <<
"expected layout attribute for "
634 << llvm::cast<Type>(entry.getKey())
635 <<
" to be a dense integer elements attribute of 1 or 2 elements";
637 if (!values.getElementType().isInteger(64))
638 return emitError(loc) <<
"expected i64 entries for " << key;
640 if (key.isIdentified() || !key.getBody().empty()) {
641 return emitError(loc) <<
"unexpected layout attribute for struct " << key;
644 if (values.size() == 1)
649 return emitError(loc) <<
"preferred alignment is expected to be at least "
650 "as large as ABI alignment";
653 return mlir::success();
661 template <
typename VecTy>
664 Type elementType,
unsigned numElements) {
665 if (numElements == 0)
666 return emitError() <<
"the number of vector elements must be positive";
668 if (!VecTy::isValidElementType(elementType))
669 return emitError() <<
"invalid vector element type";
675 unsigned numElements) {
676 assert(elementType &&
"expected non-null subtype");
682 Type elementType,
unsigned numElements) {
683 assert(elementType &&
"expected non-null subtype");
688 bool LLVMFixedVectorType::isValidElementType(
Type type) {
689 return llvm::isa<LLVMPointerType, LLVMPPCFP128Type>(type);
694 Type elementType,
unsigned numElements) {
695 return verifyVectorConstructionInvariants<LLVMFixedVectorType>(
704 unsigned minNumElements) {
705 assert(elementType &&
"expected non-null subtype");
709 LLVMScalableVectorType
711 Type elementType,
unsigned minNumElements) {
712 assert(elementType &&
"expected non-null subtype");
717 bool LLVMScalableVectorType::isValidElementType(
Type type) {
718 if (
auto intType = llvm::dyn_cast<IntegerType>(type))
719 return intType.isSignless();
722 llvm::isa<LLVMPointerType>(type);
727 Type elementType,
unsigned numElements) {
728 return verifyVectorConstructionInvariants<LLVMScalableVectorType>(
739 bool LLVM::LLVMTargetExtType::hasProperty(Property prop)
const {
741 uint64_t properties = 0;
745 (LLVMTargetExtType::HasZeroInit | LLVM::LLVMTargetExtType::CanBeGlobal);
747 return (properties & prop) == prop;
750 bool LLVM::LLVMTargetExtType::supportsMemOps()
const {
783 LLVMScalableVectorType,
793 if (
auto intType = llvm::dyn_cast<IntegerType>(type))
794 return intType.isSignless();
797 if (
auto vecType = llvm::dyn_cast<VectorType>(type))
798 return vecType.getRank() == 1;
804 if (!compatibleTypes.insert(type).second)
807 auto isCompatible = [&](
Type type) {
813 .Case<LLVMStructType>([&](
auto structType) {
814 return llvm::all_of(structType.getBody(), isCompatible);
816 .Case<LLVMFunctionType>([&](
auto funcType) {
817 return isCompatible(funcType.getReturnType()) &&
818 llvm::all_of(funcType.getParams(), isCompatible);
820 .Case<IntegerType>([](
auto intType) {
return intType.isSignless(); })
821 .Case<VectorType>([&](
auto vecType) {
822 return vecType.getRank() == 1 &&
823 isCompatible(vecType.getElementType());
825 .Case<LLVMPointerType>([&](
auto pointerType) {
return true; })
826 .Case<LLVMTargetExtType>([&](
auto extType) {
827 return llvm::all_of(extType.getTypeParams(), isCompatible);
832 LLVMScalableVectorType,
834 >([&](
auto containerType) {
835 return isCompatible(containerType.getElementType());
850 >([](
Type) {
return true; })
852 .Default([](
Type) {
return false; });
855 compatibleTypes.erase(type);
861 if (
auto *llvmDialect =
874 return llvm::isa<BFloat16Type, Float16Type, Float32Type, Float64Type,
875 Float80Type, Float128Type, LLVMPPCFP128Type>(type);
879 if (llvm::isa<LLVMFixedVectorType, LLVMScalableVectorType>(type))
882 if (
auto vecType = llvm::dyn_cast<VectorType>(type)) {
883 if (vecType.getRank() != 1)
885 Type elementType = vecType.getElementType();
886 if (
auto intType = llvm::dyn_cast<IntegerType>(elementType))
887 return intType.isSignless();
888 return llvm::isa<BFloat16Type, Float16Type, Float32Type, Float64Type,
889 Float80Type, Float128Type>(elementType);
896 .Case<LLVMFixedVectorType, LLVMScalableVectorType, VectorType>(
897 [](
auto ty) {
return ty.getElementType(); })
899 llvm_unreachable(
"incompatible with LLVM vector type");
905 .Case([](VectorType ty) {
907 return llvm::ElementCount::getScalable(ty.getNumElements());
908 return llvm::ElementCount::getFixed(ty.getNumElements());
910 .Case([](LLVMFixedVectorType ty) {
911 return llvm::ElementCount::getFixed(ty.getNumElements());
913 .Case([](LLVMScalableVectorType ty) {
914 return llvm::ElementCount::getScalable(ty.getMinNumElements());
916 .Default([](
Type) -> llvm::ElementCount {
917 llvm_unreachable(
"incompatible with LLVM vector type");
922 assert((llvm::isa<LLVMFixedVectorType, LLVMScalableVectorType, VectorType>(
924 "expected LLVM-compatible vector type");
925 return !llvm::isa<LLVMFixedVectorType>(vectorType) &&
926 (llvm::isa<LLVMScalableVectorType>(vectorType) ||
927 llvm::cast<VectorType>(vectorType).isScalable());
932 bool useLLVM = LLVMFixedVectorType::isValidElementType(elementType);
933 bool useBuiltIn = VectorType::isValidElementType(elementType);
935 assert((useLLVM ^ useBuiltIn) &&
"expected LLVM-compatible fixed-vector type "
936 "to be either builtin or LLVM dialect type");
949 const llvm::ElementCount &numElements) {
950 if (numElements.isScalable())
951 return getVectorType(elementType, numElements.getKnownMinValue(),
953 return getVectorType(elementType, numElements.getFixedValue(),
958 bool useLLVM = LLVMFixedVectorType::isValidElementType(elementType);
959 bool useBuiltIn = VectorType::isValidElementType(elementType);
961 assert((useLLVM ^ useBuiltIn) &&
"expected LLVM-compatible fixed-vector type "
962 "to be either builtin or LLVM dialect type");
969 bool useLLVM = LLVMScalableVectorType::isValidElementType(elementType);
970 bool useBuiltIn = VectorType::isValidElementType(elementType);
972 assert((useLLVM ^ useBuiltIn) &&
"expected LLVM-compatible scalable-vector "
973 "type to be either builtin or LLVM dialect "
985 "expected a type compatible with the LLVM dialect");
988 .Case<BFloat16Type, Float16Type>(
989 [](
Type) {
return llvm::TypeSize::getFixed(16); })
990 .Case<Float32Type>([](
Type) {
return llvm::TypeSize::getFixed(32); })
991 .Case<Float64Type>([](
Type) {
return llvm::TypeSize::getFixed(64); })
992 .Case<Float80Type>([](
Type) {
return llvm::TypeSize::getFixed(80); })
993 .Case<Float128Type>([](
Type) {
return llvm::TypeSize::getFixed(128); })
994 .Case<IntegerType>([](IntegerType intTy) {
995 return llvm::TypeSize::getFixed(intTy.getWidth());
997 .Case<LLVMPPCFP128Type>(
998 [](
Type) {
return llvm::TypeSize::getFixed(128); })
999 .Case<LLVMFixedVectorType>([](LLVMFixedVectorType t) {
1000 llvm::TypeSize elementSize =
1002 return llvm::TypeSize(elementSize.getFixedValue() * t.getNumElements(),
1003 elementSize.isScalable());
1005 .Case<VectorType>([](VectorType t) {
1007 "unexpected incompatible with LLVM vector type");
1008 llvm::TypeSize elementSize =
1010 return llvm::TypeSize(elementSize.getFixedValue() * t.getNumElements(),
1011 elementSize.isScalable());
1013 .Default([](
Type ty) {
1014 assert((llvm::isa<LLVMVoidType, LLVMLabelType, LLVMMetadataType,
1015 LLVMTokenType, LLVMStructType, LLVMArrayType,
1016 LLVMPointerType, LLVMFunctionType, LLVMTargetExtType>(
1018 "unexpected missing support for primitive type");
1019 return llvm::TypeSize::getFixed(0);
1027 void LLVMDialect::registerTypes() {
1029 #define GET_TYPEDEF_LIST
1030 #include "mlir/Dialect/LLVMIR/LLVMTypes.cpp.inc"
static LogicalResult verifyEntries(function_ref< InFlightDiagnostic()> emitError, ArrayRef< DataLayoutEntryInterface > entries, bool allowTypes=true)
Verify entries, with the option to disallow types as keys.
static uint64_t getIndexBitwidth(DataLayoutEntryListRef params)
Returns the bitwidth of the index type if specified in the param list.
static MLIRContext * getContext(OpFoldResult val)
static int64_t getNumElements(Type t)
Compute the total number of elements in the given type, also taking into account nested types.
constexpr static const uint64_t kDefaultPointerAlignment
static void printExtTypeParams(AsmPrinter &p, ArrayRef< Type > typeParams, ArrayRef< unsigned int > intParams)
constexpr static const uint64_t kDefaultPointerSizeBits
static LLVM_ATTRIBUTE_UNUSED OptionalParseResult generatedTypeParser(AsmParser &parser, StringRef *mnemonic, Type &value)
These are unused for now.
static void printFunctionTypes(AsmPrinter &p, ArrayRef< Type > params, bool isVarArg)
static bool isCompatibleImpl(Type type, DenseSet< Type > &compatibleTypes)
static ParseResult parseExtTypeParams(AsmParser &p, SmallVectorImpl< Type > &typeParams, SmallVectorImpl< unsigned int > &intParams)
Parses the parameter list for a target extension type.
static LLVM_ATTRIBUTE_UNUSED LogicalResult generatedTypePrinter(Type def, AsmPrinter &printer)
static constexpr llvm::StringRef kSpirvPrefix
static LogicalResult verifyVectorConstructionInvariants(function_ref< InFlightDiagnostic()> emitError, Type elementType, unsigned numElements)
Verifies that the type about to be constructed is well-formed.
static ParseResult parseFunctionTypes(AsmParser &p, SmallVector< Type > ¶ms, bool &isVarArg)
constexpr static const uint64_t kBitsInByte
static constexpr llvm::StringRef kArmSVCount
static std::optional< uint64_t > getPointerDataLayoutEntry(DataLayoutEntryListRef params, LLVMPointerType type, PtrDLEntryPos pos)
Returns the part of the data layout entry that corresponds to pos for the given type by interpreting ...
static std::optional< uint64_t > getStructDataLayoutEntry(DataLayoutEntryListRef params, LLVMStructType type, StructDLEntryPos pos)
static uint64_t extractStructSpecValue(Attribute attr, StructDLEntryPos pos)
static uint64_t calculateStructAlignment(const DataLayout &dataLayout, DataLayoutEntryListRef params, LLVMStructType type, StructDLEntryPos pos)
static SmallVector< Type > getReturnTypes(SmallVector< func::ReturnOp > returnOps)
Helper function that returns the return types (skipping casts) of the given func.return ops.
static Value max(ImplicitLocOpBuilder &builder, Value value, Value bound)
static Type getElementType(Type type, ArrayRef< int32_t > indices, function_ref< InFlightDiagnostic(StringRef)> emitErrorFn)
Walks the given type hierarchy with the given indices, potentially down to component granularity,...
This base class exposes generic asm parser hooks, usable across the various derived parsers.
virtual OptionalParseResult parseOptionalInteger(APInt &result)=0
Parse an optional integer value from the stream.
virtual ParseResult parseCommaSeparatedList(Delimiter delimiter, function_ref< ParseResult()> parseElementFn, StringRef contextMessage=StringRef())=0
Parse a list of comma-separated items with an optional delimiter.
virtual ParseResult parseRParen()=0
Parse a ) token.
virtual InFlightDiagnostic emitError(SMLoc loc, const Twine &message={})=0
Emit a diagnostic at the specified location and return failure.
virtual ParseResult parseOptionalRParen()=0
Parse a ) token if present.
virtual SMLoc getCurrentLocation()=0
Get the location of the next token and store it into the argument.
virtual ParseResult parseOptionalComma()=0
Parse a , token if present.
virtual ParseResult parseOptionalEllipsis()=0
Parse a ... token if present;.
This base class exposes generic asm printer hooks, usable across the various derived printers.
Attributes are known-constant values of operations.
The main mechanism for performing data layout queries.
std::optional< uint64_t > getTypeIndexBitwidth(Type t) const
Returns the bitwidth that should be used when performing index computations for the given pointer-lik...
llvm::TypeSize getTypeSize(Type t) const
Returns the size of the given type in the current scope.
uint64_t getTypePreferredAlignment(Type t) const
Returns the preferred of the given type in the current scope.
uint64_t getTypeABIAlignment(Type t) const
Returns the required alignment of the given type in the current scope.
llvm::TypeSize getTypeSizeInBits(Type t) const
Returns the size in bits of the given type in the current scope.
The DialectAsmParser has methods for interacting with the asm parser when parsing attributes and type...
This is a pure-virtual base class that exposes the asmprinter hooks necessary to implement a custom p...
This class represents a diagnostic that is inflight and set to be reported.
This class defines the main interface for locations in MLIR and acts as a non-nullable wrapper around...
MLIRContext is the top-level object for a collection of MLIR operations.
Dialect * getLoadedDialect(StringRef name)
Get a registered IR dialect with the given namespace.
This class implements Optional functionality for ParseResult.
This class provides an abstraction over the various different ranges of value types.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
MLIRContext * getContext() const
Return the MLIRContext in which this type was uniqued.
void printType(Type type, AsmPrinter &printer)
Prints an LLVM Dialect type.
Type parseType(DialectAsmParser &parser)
Parses an LLVM dialect type.
Type getVectorType(Type elementType, unsigned numElements, bool isScalable=false)
Creates an LLVM dialect-compatible vector type with the given element type and length.
llvm::TypeSize getPrimitiveTypeSizeInBits(Type type)
Returns the size of the given primitive LLVM dialect-compatible type (including vectors) in bits,...
void printPrettyLLVMType(AsmPrinter &p, Type type)
Print any MLIR type or a concise syntax for LLVM types.
bool isScalableVectorType(Type vectorType)
Returns whether a vector type is scalable or not.
ParseResult parsePrettyLLVMType(AsmParser &p, Type &type)
Parse any MLIR type or a concise syntax for LLVM types.
bool isCompatibleVectorType(Type type)
Returns true if the given type is a vector type compatible with the LLVM dialect.
bool isCompatibleOuterType(Type type)
Returns true if the given outer type is compatible with the LLVM dialect without checking its potenti...
Type getFixedVectorType(Type elementType, unsigned numElements)
Creates an LLVM dialect-compatible type with the given element type and length.
PtrDLEntryPos
The positions of different values in the data layout entry for pointers.
std::optional< uint64_t > extractPointerSpecValue(Attribute attr, PtrDLEntryPos pos)
Returns the value that corresponds to named position pos from the data layout entry attr assuming it'...
bool isCompatibleType(Type type)
Returns true if the given type is compatible with the LLVM dialect.
Type getScalableVectorType(Type elementType, unsigned numElements)
Creates an LLVM dialect-compatible type with the given element type and length.
bool isCompatibleFloatingPointType(Type type)
Returns true if the given type is a floating-point type compatible with the LLVM dialect.
llvm::ElementCount getVectorNumElements(Type type)
Returns the element count of any LLVM-compatible vector type.
Type getVectorElementType(Type type)
Returns the element type of any vector type compatible with the LLVM dialect.
Include the generated interface declarations.
InFlightDiagnostic emitError(Location loc)
Utility method to emit an error message using this location.
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...
Type parseType(llvm::StringRef typeStr, MLIRContext *context, size_t *numRead=nullptr, bool isKnownNullTerminated=false)
This parses a single MLIR type to an MLIR context if it was valid.
LogicalResult verify(Operation *op, bool verifyRecursively=true)
Perform (potentially expensive) checks of invariants, used to detect compiler bugs,...