* Split memref.dim into two operations: memref.dim and tensor.dim. Both ops have the same builder interface and op argument names, so that they can be used with templates in patterns that apply to both tensors and memrefs (e.g., some patterns in Linalg). * Add constant materializer to TensorDialect (needed for folding in affine.apply etc.). * Remove some MemRefDialect dependencies, make some explicit. Differential Revision: https://reviews.llvm.org/D105165
70 lines
2.6 KiB
C++
70 lines
2.6 KiB
C++
//===- TosaToLinalgPass.cpp - Lowering Tosa to Linalg Dialect -------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This transformation pass legalizes Tosa operations to the Linalg dialect.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "../PassDetail.h"
|
|
#include "mlir/Conversion/TosaToLinalg/TosaToLinalg.h"
|
|
#include "mlir/Dialect/Linalg/IR/LinalgOps.h"
|
|
#include "mlir/Dialect/Math/IR/Math.h"
|
|
#include "mlir/Dialect/StandardOps/IR/Ops.h"
|
|
#include "mlir/Dialect/Tensor/IR/Tensor.h"
|
|
#include "mlir/Dialect/Tosa/IR/TosaOps.h"
|
|
#include "mlir/Dialect/Tosa/Transforms/PassDetail.h"
|
|
#include "mlir/Dialect/Tosa/Transforms/Passes.h"
|
|
#include "mlir/Dialect/Tosa/Utils/QuantUtils.h"
|
|
#include "mlir/IR/PatternMatch.h"
|
|
#include "mlir/Pass/PassManager.h"
|
|
#include "mlir/Transforms/DialectConversion.h"
|
|
#include "mlir/Transforms/GreedyPatternRewriteDriver.h"
|
|
|
|
using namespace mlir;
|
|
|
|
namespace {
|
|
struct TosaToLinalgOnTensors
|
|
: public TosaToLinalgOnTensorsBase<TosaToLinalgOnTensors> {
|
|
public:
|
|
void getDependentDialects(DialectRegistry ®istry) const override {
|
|
registry.insert<linalg::LinalgDialect, math::MathDialect,
|
|
StandardOpsDialect, tensor::TensorDialect>();
|
|
}
|
|
|
|
void runOnFunction() override {
|
|
RewritePatternSet patterns(&getContext());
|
|
ConversionTarget target(getContext());
|
|
target.addLegalDialect<linalg::LinalgDialect, StandardOpsDialect,
|
|
tensor::TensorDialect>();
|
|
target.addIllegalDialect<tosa::TosaDialect>();
|
|
|
|
// Not every TOSA op can be legalized to linalg.
|
|
target.addLegalOp<tosa::ApplyScaleOp>();
|
|
target.addLegalOp<tosa::IfOp>();
|
|
target.addLegalOp<tosa::ConstOp>();
|
|
target.addLegalOp<tosa::WhileOp>();
|
|
|
|
target.markUnknownOpDynamicallyLegal([](Operation *) { return true; });
|
|
|
|
FuncOp func = getFunction();
|
|
mlir::tosa::populateTosaToLinalgOnTensorsConversionPatterns(&patterns);
|
|
if (failed(applyFullConversion(func, target, std::move(patterns))))
|
|
signalPassFailure();
|
|
}
|
|
};
|
|
} // namespace
|
|
|
|
std::unique_ptr<Pass> mlir::tosa::createTosaToLinalgOnTensors() {
|
|
return std::make_unique<TosaToLinalgOnTensors>();
|
|
}
|
|
|
|
void mlir::tosa::addTosaToLinalgOnTensorsPasses(OpPassManager &pm) {
|
|
pm.addNestedPass<FuncOp>(createTosaMakeBroadcastablePass());
|
|
pm.addNestedPass<FuncOp>(createTosaToLinalgOnTensors());
|
|
}
|