blob: e8ceac2f257a9580c0744c55595f3e4ab9195a84 [file] [log] [blame]
Rob Suderman1d973b72021-01-05 22:26:481//===- TosaToLinalgPass.cpp - Lowering Tosa to Linalg Dialect -------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This transformation pass legalizes Tosa operations to the Linalg dialect.
10//
11//===----------------------------------------------------------------------===//
12
13#include "../PassDetail.h"
14#include "mlir/Conversion/TosaToLinalg/TosaToLinalg.h"
Mogballa54f4ea2021-10-12 23:14:5715#include "mlir/Dialect/Arithmetic/IR/Arithmetic.h"
River Riddle23aa5a72022-02-26 22:49:5416#include "mlir/Dialect/Func/IR/FuncOps.h"
gysitb7f2c102021-12-15 12:14:3517#include "mlir/Dialect/Linalg/IR/Linalg.h"
Stephan Herhut4348d8a2021-02-12 09:34:4218#include "mlir/Dialect/Math/IR/Math.h"
natashaknkd4d50e42021-09-09 22:57:2219#include "mlir/Dialect/SCF/SCF.h"
Rob Suderman4157a072021-03-19 23:04:5020#include "mlir/Dialect/Tensor/IR/Tensor.h"
Rob Suderman1d973b72021-01-05 22:26:4821#include "mlir/Dialect/Tosa/IR/TosaOps.h"
22#include "mlir/Dialect/Tosa/Transforms/PassDetail.h"
23#include "mlir/Dialect/Tosa/Transforms/Passes.h"
24#include "mlir/Dialect/Tosa/Utils/QuantUtils.h"
25#include "mlir/IR/PatternMatch.h"
26#include "mlir/Pass/PassManager.h"
27#include "mlir/Transforms/DialectConversion.h"
28#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
Rob Sudermanf0cb77d2021-12-24 00:25:5329#include "mlir/Transforms/Passes.h"
Rob Suderman1d973b72021-01-05 22:26:4830
31using namespace mlir;
32
33namespace {
Geoffrey Martin-Nobleefc6fe962021-10-15 22:40:4234struct TosaToLinalg : public TosaToLinalgBase<TosaToLinalg> {
Rob Suderman1d973b72021-01-05 22:26:4835public:
36 void getDependentDialects(DialectRegistry &registry) const override {
Mogballa54f4ea2021-10-12 23:14:5737 registry.insert<arith::ArithmeticDialect, linalg::LinalgDialect,
River Riddle23aa5a72022-02-26 22:49:5438 math::MathDialect, func::FuncDialect, tensor::TensorDialect,
39 scf::SCFDialect>();
Rob Suderman1d973b72021-01-05 22:26:4840 }
41
River Riddle41574552022-01-04 23:41:1742 void runOnOperation() override {
Chris Lattnerdc4e9132021-03-22 23:58:3443 RewritePatternSet patterns(&getContext());
Rob Suderman1d973b72021-01-05 22:26:4844 ConversionTarget target(getContext());
River Riddle23aa5a72022-02-26 22:49:5445 target.addLegalDialect<linalg::LinalgDialect, func::FuncDialect,
natashaknkd4d50e42021-09-09 22:57:2246 tensor::TensorDialect, scf::SCFDialect>();
Rob Suderman1d973b72021-01-05 22:26:4847 target.addIllegalDialect<tosa::TosaDialect>();
Rob Suderman286a9d42021-03-18 23:14:0548
49 // Not every TOSA op can be legalized to linalg.
50 target.addLegalOp<tosa::ApplyScaleOp>();
51 target.addLegalOp<tosa::IfOp>();
52 target.addLegalOp<tosa::ConstOp>();
53 target.addLegalOp<tosa::WhileOp>();
Rob Suderman54eec7c2021-11-23 03:43:0654 target.addLegalOp<tosa::SliceOp>();
Rob Suderman286a9d42021-03-18 23:14:0555
Rob Suderman1d973b72021-01-05 22:26:4856 target.markUnknownOpDynamicallyLegal([](Operation *) { return true; });
57
River Riddle41574552022-01-04 23:41:1758 FuncOp func = getOperation();
Geoffrey Martin-Nobleefc6fe962021-10-15 22:40:4259 mlir::tosa::populateTosaToLinalgConversionPatterns(&patterns);
Rob Suderman1d973b72021-01-05 22:26:4860 if (failed(applyFullConversion(func, target, std::move(patterns))))
61 signalPassFailure();
62 }
63};
64} // namespace
65
Geoffrey Martin-Nobleefc6fe962021-10-15 22:40:4266std::unique_ptr<Pass> mlir::tosa::createTosaToLinalg() {
67 return std::make_unique<TosaToLinalg>();
Rob Suderman1d973b72021-01-05 22:26:4868}
69
not-jennifd2550d2022-02-28 23:30:1370void mlir::tosa::addTosaToLinalgPasses(OpPassManager &pm,
71 bool disableTosaDecompositions) {
Rob Suderman173fce42022-01-13 17:54:4272 // Optional decompositions are designed to benefit linalg.
not-jennifd2550d2022-02-28 23:30:1373 if (!disableTosaDecompositions)
74 pm.addNestedPass<FuncOp>(mlir::tosa::createTosaOptionalDecompositions());
Rob Sudermanf0cb77d2021-12-24 00:25:5375 pm.addNestedPass<FuncOp>(mlir::createCanonicalizerPass());
Rob Suderman173fce42022-01-13 17:54:4276
77 pm.addNestedPass<FuncOp>(tosa::createTosaMakeBroadcastablePass());
78 pm.addNestedPass<FuncOp>(tosa::createTosaToLinalgNamed());
79 pm.addNestedPass<FuncOp>(mlir::createCanonicalizerPass());
80 pm.addNestedPass<FuncOp>(tosa::createTosaMakeBroadcastablePass());
81 pm.addNestedPass<FuncOp>(tosa::createTosaToLinalg());
Rob Suderman1d973b72021-01-05 22:26:4882}