42#define GEN_PASS_DEF_TOSACONVERTINTEGERTYPETOSIGNLESS
43#include "mlir/Dialect/Tosa/Transforms/Passes.h.inc"
47 static Type convertType(Type type) {
48 const auto tensorType = dyn_cast<TensorType>(type);
52 const auto intType = dyn_cast<IntegerType>(tensorType.getElementType());
54 intType.getSignedness() == IntegerType::SignednessSemantics::Signless)
57 const auto signlessType = IntegerType::get(
58 intType.getContext(), intType.getWidth(), IntegerType::Signless);
59 return tensorType.cloneWith(std::nullopt, signlessType);
63 explicit ToSignlessTensorTypeConverter() { addConversion(convertType); }
68 ConvertGenericOpWithIntegerTensorType(
TypeConverter &typeConverter,
73 matchAndRewrite(Operation *op, ArrayRef<Value> operands,
74 ConversionPatternRewriter &rewriter)
const final {
78 constexpr unsigned int numResults = 4;
81 SmallVector<Type, numResults> resultTypes;
82 if (failed(typeConverter->convertTypes(op->getResultTypes(), resultTypes)))
87 op->getLoc(), op->getName(), resultTypes, operands,
88 op->getDiscardableAttrDictionary().getValue(),
89 op->getPropertiesStorage(), op->getSuccessors(), op->getNumRegions());
92 for (
auto regions : llvm::zip(op->getRegions(), newOp->getRegions())) {
93 Region &before = std::get<0>(regions);
94 Region &parent = std::get<1>(regions);
95 rewriter.inlineRegionBefore(before, parent, parent.end());
96 if (failed(rewriter.convertRegionTypes(&parent, *typeConverter)))
101 rewriter.insert(newOp);
102 rewriter.replaceOp(op, newOp->getResults());
107class ConvertTosaConstWithIntegerTensorType
108 :
public OpConversionPattern<tosa::ConstOp> {
109 using OpConversionPattern::OpConversionPattern;
112 matchAndRewrite(tosa::ConstOp op, OpAdaptor adaptor,
113 ConversionPatternRewriter &rewriter)
const final {
114 const ElementsAttr oldAttr = op.getValues();
115 const auto oldTy = llvm::cast<ShapedType>(oldAttr.getType());
117 llvm::cast<ShapedType>(typeConverter->convertType(oldTy));
121 ElementsAttr newAttr = oldAttr;
122 if (
auto denseAttr = llvm::dyn_cast<DenseElementsAttr>(oldAttr)) {
126 return rewriter.notifyMatchFailure(op,
"unknown elements attribute type");
129 rewriter.replaceOpWithNewOp<tosa::ConstOp>(op, newTy, newAttr);
134class TosaConvertIntegerTypeToSignless
135 :
public impl::TosaConvertIntegerTypeToSignlessBase<
136 TosaConvertIntegerTypeToSignless> {
138 void runOnOperation()
override {
141 ToSignlessTensorTypeConverter typeConverter;
143 target.addDynamicallyLegalOp<func::FuncOp>([&](func::FuncOp op) {
144 return typeConverter.isSignatureLegal(op.getFunctionType()) &&
145 typeConverter.isLegal(&op.getBody());
147 target.addDynamicallyLegalOp<tosa::ConstOp>([&](tosa::ConstOp op) {
148 return typeConverter.isLegal(op.getType()) &&
149 typeConverter.isLegal(op.getValues().getType());
151 target.markUnknownOpDynamicallyLegal([&](Operation *op) {
152 return typeConverter.isLegal(op->getOperandTypes()) &&
153 typeConverter.isLegal(op->getResultTypes());
156 RewritePatternSet patterns(context);
157 populateFunctionOpInterfaceTypeConversionPattern<func::FuncOp>(
158 patterns, typeConverter);
159 patterns.add<ConvertGenericOpWithIntegerTensorType>(typeConverter, context);
160 patterns.add<ConvertTosaConstWithIntegerTensorType>(typeConverter, context);
163 applyFullConversion(getOperation(),
target, std::move(patterns))))
static DenseElementsAttr getFromRawBuffer(ShapedType type, ArrayRef< char > rawBuffer)
Construct a dense elements attribute from a raw buffer representing the data for this attribute.
static Operation * create(Location location, OperationName name, TypeRange resultTypes, ValueRange operands, NamedAttrList &&attributes, PropertyRef properties, BlockRange successors, unsigned numRegions)
Create a new Operation with the specific fields.
Include the generated interface declarations.