9 #ifndef MLIR_IR_BUILTINTYPES_H
10 #define MLIR_IR_BUILTINTYPES_H
31 class RankedTensorType;
36 struct FunctionTypeStorage;
37 struct IntegerTypeStorage;
38 struct TupleTypeStorage;
106 Type elementType)
const;
126 operator ShapedType()
const {
return llvm::cast<ShapedType>(*
this); }
153 Type elementType)
const;
180 operator ShapedType()
const {
return llvm::cast<ShapedType>(*
this); }
189 #define GET_TYPEDEF_CLASSES
190 #include "mlir/IR/BuiltinTypes.h.inc"
205 layout(other.getLayout()), memorySpace(other.getMemorySpace()) {}
209 : shape(shape), elementType(elementType) {}
217 elementType = newElementType;
227 memorySpace = newMemorySpace;
231 operator MemRefType() {
238 MemRefLayoutAttrInterface layout;
253 encoding(other.getEncoding()) {}
257 : shape(shape), elementType(elementType), encoding(encoding) {}
265 elementType = newElementType;
270 encoding = newEncoding;
276 assert(pos < shape.size() &&
"overflow");
278 storage.append(shape.begin(), shape.end());
279 storage.erase(storage.begin() + pos);
280 shape = {storage.data(), storage.size()};
286 assert(pos <= shape.size() &&
"overflow");
288 storage.append(shape.begin(), shape.end());
289 storage.insert(storage.begin() + pos, val);
290 shape = {storage.data(), storage.size()};
294 operator RankedTensorType() {
317 scalableDims(other.getScalableDims()) {}
322 : shape(shape), elementType(elementType) {
323 if (scalableDims.empty())
326 this->scalableDims = scalableDims;
331 if (newIsScalableDim.empty())
334 scalableDims = newIsScalableDim;
341 elementType = newElementType;
347 assert(pos < shape.size() &&
"overflow");
349 storage.append(shape.begin(), shape.end());
350 if (storageScalableDims.empty())
351 storageScalableDims.append(scalableDims.begin(), scalableDims.end());
352 storage.erase(storage.begin() + pos);
353 storageScalableDims.erase(storageScalableDims.begin() + pos);
354 shape = {storage.data(), storage.size()};
356 ArrayRef<bool>(storageScalableDims.data(), storageScalableDims.size());
363 storage.append(shape.begin(), shape.end());
364 assert(pos < storage.size() &&
"overflow");
366 shape = {storage.data(), storage.size()};
370 operator VectorType() {
392 std::optional<llvm::SmallDenseSet<unsigned>>
413 ShapedType candidateReducedType);
420 return llvm::isa<MemRefType, UnrankedMemRefType>(type);
425 llvm::isa<ComplexType, MemRefType, VectorType, UnrankedMemRefType>(
427 llvm::isa<MemRefElementTypeInterface>(type);
431 return llvm::isa<Float8E5M2Type, Float8E4M3FNType, Float8E5M2FNUZType,
432 Float8E4M3FNUZType, Float8E4M3B11FNUZType, BFloat16Type,
433 Float16Type, FloatTF32Type, Float32Type, Float64Type,
434 Float80Type, Float128Type>(type);
486 return llvm::isa<RankedTensorType, UnrankedTensorType>(type);
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,...
static ArrayRef< int64_t > getShape(Type type)
Returns the shape of the given type.
Base type for affine expression.
Attributes are known-constant values of operations.
This class provides a shared interface for ranked and unranked memref types.
MemRefType clone(ArrayRef< int64_t > shape) const
Return a clone of this type with the given new shape.
ArrayRef< int64_t > getShape() const
Returns the shape of this memref type.
static bool isValidElementType(Type type)
Return true if the specified element type is ok in a memref.
Attribute getMemorySpace() const
Returns the memory space in which data referred to by this memref resides.
static bool classof(Type type)
Methods for support type inquiry through isa, cast, and dyn_cast.
unsigned getMemorySpaceAsInt() const
[deprecated] Returns the memory space in old raw integer representation.
bool hasRank() const
Returns if this type is ranked, i.e. it has a known number of dimensions.
Type getElementType() const
Returns the element type of this memref type.
MemRefType clone(ArrayRef< int64_t > shape, Type elementType) const
Return a clone of this type with the given new shape and element type.
BaseMemRefType cloneWith(std::optional< ArrayRef< int64_t >> shape, Type elementType) const
Clone this type with the given shape and element type.
static FloatType getF64(MLIRContext *ctx)
FloatType scaleElementBitwidth(unsigned scale)
Get or create a new FloatType with bitwidth scaled by scale.
static FloatType getFloat8E5M2(MLIRContext *ctx)
static FloatType getF80(MLIRContext *ctx)
static FloatType getFloat8E4M3FN(MLIRContext *ctx)
static FloatType getF16(MLIRContext *ctx)
const llvm::fltSemantics & getFloatSemantics()
Return the floating semantics of this float type.
static FloatType getTF32(MLIRContext *ctx)
static FloatType getBF16(MLIRContext *ctx)
static FloatType getFloat8E4M3FNUZ(MLIRContext *ctx)
static FloatType getFloat8E4M3B11FNUZ(MLIRContext *ctx)
unsigned getFPMantissaWidth()
Return the width of the mantissa of this type.
static FloatType getFloat8E5M2FNUZ(MLIRContext *ctx)
static FloatType getF128(MLIRContext *ctx)
unsigned getWidth()
Return the bitwidth of this float type.
static bool classof(Type type)
Methods for support type inquiry through isa, cast, and dyn_cast.
static FloatType getF32(MLIRContext *ctx)
MLIRContext is the top-level object for a collection of MLIR operations.
This is a builder type that keeps local references to arguments.
Builder(ArrayRef< int64_t > shape, Type elementType)
Builder & setLayout(MemRefLayoutAttrInterface newLayout)
Builder & setElementType(Type newElementType)
Builder(MemRefType other)
Builder & setShape(ArrayRef< int64_t > newShape)
Builder & setMemorySpace(Attribute newMemorySpace)
This is a builder type that keeps local references to arguments.
Builder(ArrayRef< int64_t > shape, Type elementType, Attribute encoding)
Build from scratch.
Builder & dropDim(unsigned pos)
Erase a dim from shape @pos.
Builder & setShape(ArrayRef< int64_t > newShape)
Builder & insertDim(int64_t val, unsigned pos)
Insert a val into shape @pos.
Builder(RankedTensorType other)
Build from another RankedTensorType.
Builder & setElementType(Type newElementType)
Builder & setEncoding(Attribute newEncoding)
Tensor types represent multi-dimensional arrays, and have two variants: RankedTensorType and Unranked...
RankedTensorType clone(ArrayRef< int64_t > shape) const
Return a clone of this type with the given new shape.
static bool classof(Type type)
Methods for support type inquiry through isa, cast, and dyn_cast.
TensorType cloneWith(std::optional< ArrayRef< int64_t >> shape, Type elementType) const
Clone this type with the given shape and element type.
static bool isValidElementType(Type type)
Return true if the specified element type is ok in a tensor.
ArrayRef< int64_t > getShape() const
Returns the shape of this tensor type.
bool hasRank() const
Returns if this type is ranked, i.e. it has a known number of dimensions.
RankedTensorType clone(ArrayRef< int64_t > shape, Type elementType) const
Return a clone of this type with the given new shape and element type.
Type getElementType() const
Returns the element type of this tensor type.
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
bool isIntOrIndexOrFloat() const
Return true if this is an integer (of any signedness), index, or float type.
This is a builder type that keeps local references to arguments.
Builder & dropDim(unsigned pos)
Erase a dim from shape @pos.
Builder(ArrayRef< int64_t > shape, Type elementType, unsigned numScalableDims=0, ArrayRef< bool > scalableDims={})
Build from scratch.
Builder & setDim(unsigned pos, int64_t val)
Set a dim in shape @pos to val.
Builder & setShape(ArrayRef< int64_t > newShape, ArrayRef< bool > newIsScalableDim={})
Builder & setElementType(Type newElementType)
Builder(VectorType other)
Build from another VectorType.
Include the generated interface declarations.
This header declares functions that assist transformations in the MemRef dialect.
SliceVerificationResult
Enum that captures information related to verifier error conditions on slice insert/extract type of o...
bool isLastMemrefDimUnitStride(MemRefType type)
Return "true" if the last dimension of the given type has a static unit stride.
LogicalResult getStridesAndOffset(MemRefType t, SmallVectorImpl< int64_t > &strides, int64_t &offset)
Returns the strides of the MemRef if the layout map is in strided form.
MemRefType canonicalizeStridedLayout(MemRefType t)
Return a version of t with identity layout if it can be determined statically that the layout is the ...
std::optional< llvm::SmallDenseSet< unsigned > > computeRankReductionMask(ArrayRef< int64_t > originalShape, ArrayRef< int64_t > reducedShape)
Given an originalShape and a reducedShape assumed to be a subset of originalShape with some 1 entries...
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...
AffineExpr makeCanonicalStridedLayoutExpr(ArrayRef< int64_t > sizes, ArrayRef< AffineExpr > exprs, MLIRContext *context)
Given MemRef sizes that are either static or dynamic, returns the canonical "contiguous" strides Affi...
bool isStrided(MemRefType t)
Return "true" if the layout for t is compatible with strided semantics.
SliceVerificationResult isRankReducedType(ShapedType originalType, ShapedType candidateReducedType)
Check if originalType can be rank reduced to candidateReducedType type by dropping some dimensions wi...
This class represents an efficient way to signal success or failure.