MLIR 22.0.0git
TosaOps.cpp File Reference
#include "mlir/Dialect/Tosa/IR/TosaOps.h"
#include "mlir/Dialect/Quant/IR/Quant.h"
#include "mlir/Dialect/Shard/Interfaces/ShardingInterface.h"
#include "mlir/Dialect/Tensor/IR/Tensor.h"
#include "mlir/Dialect/Tosa/Utils/QuantUtils.h"
#include "mlir/Dialect/Tosa/Utils/ShapeUtils.h"
#include "mlir/Dialect/Utils/IndexingUtils.h"
#include "mlir/IR/BuiltinTypes.h"
#include "mlir/IR/DialectImplementation.h"
#include "mlir/IR/Matchers.h"
#include "mlir/IR/TypeUtilities.h"
#include "mlir/Interfaces/InferTypeOpInterface.h"
#include "mlir/Transforms/InliningUtils.h"
#include "llvm/ADT/APFloat.h"
#include "llvm/ADT/TypeSwitch.h"
#include <numeric>
#include "mlir/Dialect/Tosa/IR/TosaOpsDialect.cpp.inc"
#include "mlir/Dialect/Tosa/Utils/ConversionUtils.h"
#include "mlir/Dialect/Tosa/IR/TosaAvailability.cpp.inc"
#include "mlir/Dialect/Tosa/IR/TosaEnums.cpp.inc"
#include "mlir/Dialect/Tosa/IR/TosaInterfaces.cpp.inc"
#include "mlir/Dialect/Tosa/IR/TosaOpAvailabilityImpl.inc"
#include "mlir/Dialect/Tosa/IR/TosaDialectBytecode.cpp.inc"
#include "mlir/Dialect/Tosa/IR/TosaOpsTypesBase.cpp.inc"
#include "mlir/Dialect/Tosa/IR/TosaOps.cpp.inc"
#include "mlir/Dialect/Tosa/IR/TosaAttributes.cpp.inc"

Go to the source code of this file.

Macros

#define GET_TYPEDEF_LIST
#define GET_OP_LIST
#define GET_ATTRDEF_LIST
#define ZERO_POINT_HELPER(OP, OPERAND_NAME, SIGN_EXTEND)
#define COMPATIBLE_RETURN_TYPES(OP)
#define REDUCE_SHAPE_INFER(OP)
#define NARY_SHAPE_INFER(OP)
#define GET_ATTRDEF_CLASSES
#define GET_TYPEDEF_CLASSES
#define GET_OP_CLASSES

Functions

static SmallVector< int64_tconvertToMlirShape (ArrayRef< int64_t > shape)
static std::optional< int64_tidivCheck (const int64_t lhs, const int64_t rhs)
static Type getStorageElementTypeOrSelf (Type type)
static Type getStorageElementTypeOrSelf (Value value)
static LogicalResult verifyRescaleValueAndZpTypes (Operation *op, Value val, Value valZp, StringRef name)
template<typename T>
static LogicalResult verifyConvOp (T op)
template<typename T>
static LogicalResult verifyConvOpModes (T op)
template<typename T>
static LogicalResult verifyConvOpErrorIf (T op)
static LogicalResult errorIfTypeOrShapeMismatch (Operation *op, Type type1, StringRef name1, Type type2, StringRef name2)
static LogicalResult errorIfTypeOrShapeMismatch (Operation *op, ValueRange list1, StringRef name1, ValueRange list2, StringRef name2)
static LogicalResult errorIfShapeNotSizeOne (Operation *op, Type type)
template<typename T>
static LogicalResult verifyVariableOpErrorIf (T op, Type type, StringRef name)
template<typename T>
static LogicalResult verifySameElementTypes (T op, Type aType, Type bType, StringRef aName="input", StringRef bName="output")
template<typename T>
static LogicalResult verifyPoolingOp (T op)
static void buildConvOpWithQuantInfo (OpBuilder &builder, OperationState &result, Type outputType, Value input, Value weight, Value bias, DenseI64ArrayAttr pad, DenseI64ArrayAttr stride, DenseI64ArrayAttr dilation, TypeAttr accType)
 This builder is called on all convolution operators except TransposeConv, which has specialized output shape semantics.
static void buildTransConvOpWithQuantInfo (OpBuilder &builder, OperationState &result, Type outputType, Value input, Value weight, Value bias, DenseI64ArrayAttr outpad, DenseI64ArrayAttr stride, TypeAttr accType)
 Handles tosa.transpose_conv2d which has outpad and output shape attributes.
static void buildMatMulOpWithQuantInfo (OpBuilder &builder, OperationState &result, Type outputType, Value a, Value b)
 The tosa.matmul op is also intended to be generated where a fully_connected op must be constructed where the weight is not a constant.
static void buildAvgPool2dOpWithQuantInfo (OpBuilder &builder, OperationState &result, Type outputType, Value input, DenseArrayAttr kernel, DenseArrayAttr stride, DenseArrayAttr pad, TypeAttr accType)
 Both the tosa.avg_pool2d and unary ops use the same UnaryOpQuantizationAttr but avg_pool operator has its own builder as it has additional parameters not part of the unary ops.
static void buildNegateOpWithQuantInfo (OpBuilder &builder, OperationState &result, Type outputType, Value input)
 This builder is called on single-parameter negate operator to construct input and output zero points based on their types.
static void buildPadOpWithQuantInfo (OpBuilder &builder, OperationState &result, Type outputType, Value input, Value paddings)
 This builder is called on TOSA pad operator that needs to create its own OptionalAttr quantization_attr parameter to scale the padding values correctly.
static void buildVariableOp (OpBuilder &builder, OperationState &result, StringRef name, Type variableType, Attribute initialValue)
static LogicalResult resolveBroadcastShape (const ValueShapeRange &operands, SmallVector< int64_t > &outShape)
static LogicalResult verifyDimIsPowerOfTwo (Operation *op, const int64_t dimSize, const llvm::StringRef dimName)
static FailureOr< int64_tgetZeroPoint (Value val, bool signExtend)
template<typename T>
static LogicalResult verifyZeroPoint (T op, Value val, const int64_t &zp, const std::string &operand)
static LogicalResult verifyZeroPoint (tosa::RescaleOp op, Value zpVal, const int64_t &zp, const std::string &operand)
static LogicalResult ReduceInferReturnTypes (ShapeAdaptor operandShape, Type inputType, IntegerAttr axis, SmallVectorImpl< ShapedTypeComponents > &inferredReturnShapes)
template<typename T>
static LogicalResult verifyReduceOp (T op)
static LogicalResult NAryInferReturnTypes (const ValueShapeRange &operands, SmallVectorImpl< ShapedTypeComponents > &inferredReturnShapes)
static LogicalResult poolingInferReturnTypes (ShapeAdaptor inputShape, ArrayRef< int64_t > kernel, ArrayRef< int64_t > stride, ArrayRef< int64_t > pad, SmallVectorImpl< ShapedTypeComponents > &inferredReturnShapes)
static void printInitializationList (OpAsmPrinter &parser, Block::BlockArgListType blocksArgs, ValueRange initializers, StringRef prefix="")

Macro Definition Documentation

◆ COMPATIBLE_RETURN_TYPES

#define COMPATIBLE_RETURN_TYPES ( OP)
Value:
bool OP::isCompatibleReturnTypes(TypeRange l, TypeRange r) { \
if (l.size() != r.size() || l.size() != 1) \
return false; \
return false; \
return succeeded(verifyCompatibleShape(l[0], r[0])); \
}
This class provides an abstraction over the various different ranges of value types.
Definition TypeRange.h:37
Type getElementTypeOrSelf(Type type)
Return the element type or return the type itself.
LogicalResult verifyCompatibleShape(ArrayRef< int64_t > shape1, ArrayRef< int64_t > shape2)
Returns success if the given two shapes are compatible.

Definition at line 3185 of file TosaOps.cpp.

◆ GET_ATTRDEF_CLASSES

#define GET_ATTRDEF_CLASSES

Definition at line 4666 of file TosaOps.cpp.

◆ GET_ATTRDEF_LIST

#define GET_ATTRDEF_LIST

◆ GET_OP_CLASSES

#define GET_OP_CLASSES

Definition at line 4679 of file TosaOps.cpp.

◆ GET_OP_LIST

#define GET_OP_LIST

◆ GET_TYPEDEF_CLASSES

#define GET_TYPEDEF_CLASSES

Definition at line 4672 of file TosaOps.cpp.

◆ GET_TYPEDEF_LIST

#define GET_TYPEDEF_LIST

◆ NARY_SHAPE_INFER

#define NARY_SHAPE_INFER ( OP)
Value:
LogicalResult OP::inferReturnTypeComponents( \
MLIRContext *context, ::std::optional<Location> location, \
ValueShapeRange operands, DictionaryAttr attributes, \
OpaqueProperties properties, RegionRange regions, \
SmallVectorImpl<ShapedTypeComponents> &inferredReturnShapes) { \
return NAryInferReturnTypes(operands, inferredReturnShapes); \
}
static LogicalResult NAryInferReturnTypes(const ValueShapeRange &operands, SmallVectorImpl< ShapedTypeComponents > &inferredReturnShapes)
Definition TosaOps.cpp:3275
MLIRContext is the top-level object for a collection of MLIR operations.
Definition MLIRContext.h:63
Simple wrapper around a void* in order to express generically how to pass in op properties through AP...
This class provides an abstraction over the different types of ranges over Regions.
Definition Region.h:346
Range of values and shapes (corresponding effectively to Shapes dialect's ValueShape type concept).

Definition at line 3287 of file TosaOps.cpp.

◆ REDUCE_SHAPE_INFER

#define REDUCE_SHAPE_INFER ( OP)
Value:
LogicalResult OP::inferReturnTypeComponents( \
MLIRContext *context, ::std::optional<Location> location, \
OP::Adaptor adaptor, \
SmallVectorImpl<ShapedTypeComponents> &inferredReturnShapes) { \
Type inputType = \
llvm::cast<TensorType>(adaptor.getInput().getType()).getElementType(); \
ShapeAdaptor inputShape(adaptor.getInput().getType()); \
const Properties &prop = adaptor.getProperties(); \
return ReduceInferReturnTypes(inputShape, inputType, prop.axis, \
inferredReturnShapes); \
} \
COMPATIBLE_RETURN_TYPES(OP)
static LogicalResult ReduceInferReturnTypes(ShapeAdaptor operandShape, Type inputType, IntegerAttr axis, SmallVectorImpl< ShapedTypeComponents > &inferredReturnShapes)
Definition TosaOps.cpp:3169
Adaptor class to abstract the differences between whether value is from a ShapedType or ShapedTypeCom...
Instances of the Type class are uniqued, have an immutable identifier and an optional mutable compone...
Definition Types.h:74

Definition at line 3194 of file TosaOps.cpp.

◆ ZERO_POINT_HELPER

#define ZERO_POINT_HELPER ( OP,
OPERAND_NAME,
SIGN_EXTEND )
Value:
FailureOr<int64_t> tosa::OP::get##OPERAND_NAME##ZeroPoint() { \
return getZeroPoint(get##OPERAND_NAME##Zp(), SIGN_EXTEND); \
} \
LogicalResult tosa::OP::verify##OPERAND_NAME##ZeroPoint(int64_t zp) { \
return verifyZeroPoint(*this, get##OPERAND_NAME##Zp(), zp, #OPERAND_NAME); \
}
static FailureOr< int64_t > getZeroPoint(Value val, bool signExtend)
Definition TosaOps.cpp:2596
static LogicalResult verifyZeroPoint(T op, Value val, const int64_t &zp, const std::string &operand)
Definition TosaOps.cpp:2624
auto get(MLIRContext *context, Ts &&...params)
Helper method that injects context only if needed, this helps unify some of the attribute constructio...

Definition at line 2666 of file TosaOps.cpp.

Function Documentation

◆ buildAvgPool2dOpWithQuantInfo()

void buildAvgPool2dOpWithQuantInfo ( OpBuilder & builder,
OperationState & result,
Type outputType,
Value input,
DenseArrayAttr kernel,
DenseArrayAttr stride,
DenseArrayAttr pad,
TypeAttr accType )
static

Both the tosa.avg_pool2d and unary ops use the same UnaryOpQuantizationAttr but avg_pool operator has its own builder as it has additional parameters not part of the unary ops.

Definition at line 1325 of file TosaOps.cpp.

References mlir::tosa::buildUnaryOpQuantizationAttr(), mlir::tosa::createZeroPointTensor(), mlir::emitError(), mlir::Value::getType(), and result.

◆ buildConvOpWithQuantInfo()

void buildConvOpWithQuantInfo ( OpBuilder & builder,
OperationState & result,
Type outputType,
Value input,
Value weight,
Value bias,
DenseI64ArrayAttr pad,
DenseI64ArrayAttr stride,
DenseI64ArrayAttr dilation,
TypeAttr accType )
static

This builder is called on all convolution operators except TransposeConv, which has specialized output shape semantics.

The builder also defines the bitwidth of the output given the bit width of the input & weight content.

Definition at line 1250 of file TosaOps.cpp.

References mlir::tosa::buildConvOpQuantizationAttr(), mlir::tosa::buildConvOpResultTypeInfo(), mlir::tosa::createZPsAsConst(), and result.

◆ buildMatMulOpWithQuantInfo()

void buildMatMulOpWithQuantInfo ( OpBuilder & builder,
OperationState & result,
Type outputType,
Value a,
Value b )
static

The tosa.matmul op is also intended to be generated where a fully_connected op must be constructed where the weight is not a constant.

In this case, the fully_connected op must be expressed using matmul. TODO: Add link to the leglization document explaining this.

Definition at line 1296 of file TosaOps.cpp.

References b, mlir::tosa::buildMatMulOpQuantizationAttr(), mlir::tosa::createZPsAsConst(), mlir::Builder::getI32Type(), mlir::Builder::getIntegerType(), getStorageElementTypeOrSelf(), mlir::Value::getType(), and result.

◆ buildNegateOpWithQuantInfo()

void buildNegateOpWithQuantInfo ( OpBuilder & builder,
OperationState & result,
Type outputType,
Value input )
static

This builder is called on single-parameter negate operator to construct input and output zero points based on their types.

Definition at line 1370 of file TosaOps.cpp.

References mlir::tosa::buildUnaryOpQuantizationAttr(), mlir::tosa::createZeroPointTensor(), mlir::emitError(), mlir::Value::getType(), and result.

◆ buildPadOpWithQuantInfo()

void buildPadOpWithQuantInfo ( OpBuilder & builder,
OperationState & result,
Type outputType,
Value input,
Value paddings )
static

This builder is called on TOSA pad operator that needs to create its own OptionalAttr quantization_attr parameter to scale the padding values correctly.

No pad_const is interpreted as zero-padding.

Definition at line 1410 of file TosaOps.cpp.

References mlir::tosa::buildPadOpQuantizationAttr(), mlir::tosa::createPadConstTensor(), and result.

◆ buildTransConvOpWithQuantInfo()

void buildTransConvOpWithQuantInfo ( OpBuilder & builder,
OperationState & result,
Type outputType,
Value input,
Value weight,
Value bias,
DenseI64ArrayAttr outpad,
DenseI64ArrayAttr stride,
TypeAttr accType )
static

Handles tosa.transpose_conv2d which has outpad and output shape attributes.

Definition at line 1274 of file TosaOps.cpp.

References mlir::tosa::buildConvOpQuantizationAttr(), mlir::tosa::buildConvOpResultTypeInfo(), mlir::tosa::createZPsAsConst(), and result.

◆ buildVariableOp()

void buildVariableOp ( OpBuilder & builder,
OperationState & result,
StringRef name,
Type variableType,
Attribute initialValue )
static

◆ convertToMlirShape()

SmallVector< int64_t > convertToMlirShape ( ArrayRef< int64_t > shape)
static

Definition at line 136 of file TosaOps.cpp.

Referenced by mlir::tosa::printVariableOpTypeOrInitialValue().

◆ errorIfShapeNotSizeOne()

LogicalResult errorIfShapeNotSizeOne ( Operation * op,
Type type )
inlinestatic

◆ errorIfTypeOrShapeMismatch() [1/2]

LogicalResult errorIfTypeOrShapeMismatch ( Operation * op,
Type type1,
StringRef name1,
Type type2,
StringRef name2 )
static

◆ errorIfTypeOrShapeMismatch() [2/2]

LogicalResult errorIfTypeOrShapeMismatch ( Operation * op,
ValueRange list1,
StringRef name1,
ValueRange list2,
StringRef name2 )
static

◆ getStorageElementTypeOrSelf() [1/2]

◆ getStorageElementTypeOrSelf() [2/2]

Type getStorageElementTypeOrSelf ( Value value)
static

Definition at line 570 of file TosaOps.cpp.

References getStorageElementTypeOrSelf(), and mlir::Value::getType().

◆ getZeroPoint()

FailureOr< int64_t > getZeroPoint ( Value val,
bool signExtend )
static

◆ idivCheck()

std::optional< int64_t > idivCheck ( const int64_t lhs,
const int64_t rhs )
static

Definition at line 557 of file TosaOps.cpp.

References lhs, and rhs.

Referenced by verifyConvOpErrorIf(), and verifyPoolingOp().

◆ NAryInferReturnTypes()

LogicalResult NAryInferReturnTypes ( const ValueShapeRange & operands,
SmallVectorImpl< ShapedTypeComponents > & inferredReturnShapes )
static

Definition at line 3275 of file TosaOps.cpp.

References resolveBroadcastShape(), and success().

◆ poolingInferReturnTypes()

LogicalResult poolingInferReturnTypes ( ShapeAdaptor inputShape,
ArrayRef< int64_t > kernel,
ArrayRef< int64_t > stride,
ArrayRef< int64_t > pad,
SmallVectorImpl< ShapedTypeComponents > & inferredReturnShapes )
static

Definition at line 3384 of file TosaOps.cpp.

References mlir::ShapeAdaptor::getDimSize(), and success().

◆ printInitializationList()

void printInitializationList ( OpAsmPrinter & parser,
Block::BlockArgListType blocksArgs,
ValueRange initializers,
StringRef prefix = "" )
static

Definition at line 4203 of file TosaOps.cpp.

◆ ReduceInferReturnTypes()

LogicalResult ReduceInferReturnTypes ( ShapeAdaptor operandShape,
Type inputType,
IntegerAttr axis,
SmallVectorImpl< ShapedTypeComponents > & inferredReturnShapes )
static

◆ resolveBroadcastShape()

LogicalResult resolveBroadcastShape ( const ValueShapeRange & operands,
SmallVector< int64_t > & outShape )
static

Definition at line 1455 of file TosaOps.cpp.

References mlir::ValueShapeRange::getShape(), and success().

Referenced by NAryInferReturnTypes().

◆ verifyConvOp()

template<typename T>
LogicalResult verifyConvOp ( T op)
static

Definition at line 620 of file TosaOps.cpp.

References getStorageElementTypeOrSelf(), and success().

◆ verifyConvOpErrorIf()

template<typename T>
LogicalResult verifyConvOpErrorIf ( T op)
static

Definition at line 766 of file TosaOps.cpp.

References idivCheck(), and success().

◆ verifyConvOpModes()

template<typename T>
LogicalResult verifyConvOpModes ( T op)
static

Definition at line 725 of file TosaOps.cpp.

References success().

◆ verifyDimIsPowerOfTwo()

LogicalResult verifyDimIsPowerOfTwo ( Operation * op,
const int64_t dimSize,
const llvm::StringRef dimName )
static

Definition at line 1544 of file TosaOps.cpp.

References mlir::Operation::emitOpError(), and success().

◆ verifyPoolingOp()

template<typename T>
LogicalResult verifyPoolingOp ( T op)
static

Definition at line 1050 of file TosaOps.cpp.

References idivCheck(), and success().

◆ verifyReduceOp()

template<typename T>
LogicalResult verifyReduceOp ( T op)
static

◆ verifyRescaleValueAndZpTypes()

LogicalResult verifyRescaleValueAndZpTypes ( Operation * op,
Value val,
Value valZp,
StringRef name )
static

◆ verifySameElementTypes()

template<typename T>
LogicalResult verifySameElementTypes ( T op,
Type aType,
Type bType,
StringRef aName = "input",
StringRef bName = "output" )
static

Definition at line 984 of file TosaOps.cpp.

References success().

◆ verifyVariableOpErrorIf()

template<typename T>
LogicalResult verifyVariableOpErrorIf ( T op,
Type type,
StringRef name )
static

◆ verifyZeroPoint() [1/2]

template<typename T>
LogicalResult verifyZeroPoint ( T op,
Value val,
const int64_t & zp,
const std::string & operand )
static

Definition at line 2624 of file TosaOps.cpp.

References mlir::getElementTypeOrSelf(), mlir::Type::isInteger(), and success().

◆ verifyZeroPoint() [2/2]

LogicalResult verifyZeroPoint ( tosa::RescaleOp op,
Value zpVal,
const int64_t & zp,
const std::string & operand )
static

Definition at line 2639 of file TosaOps.cpp.

References mlir::getElementTypeOrSelf(), mlir::Type::isInteger(), and success().