32#define GEN_PASS_DEF_TOSATOLINALG
33#include "mlir/Conversion/Passes.h.inc"
39struct TosaToLinalg :
public impl::TosaToLinalgBase<TosaToLinalg> {
41 TosaToLinalg(
const TosaToLinalgOptions &
options)
42 : impl::TosaToLinalgBase<TosaToLinalg>(
options) {}
44 void getDependentDialects(DialectRegistry ®istry)
const override {
46 .
insert<arith::ArithDialect, linalg::LinalgDialect, math::MathDialect,
47 index::IndexDialect, tensor::TensorDialect, scf::SCFDialect>();
50 void runOnOperation()
override {
53 target.addLegalDialect<linalg::LinalgDialect, tensor::TensorDialect,
55 target.addIllegalDialect<tosa::TosaDialect>();
58 target.addLegalOp<tosa::ApplyScaleOp>();
59 target.addLegalOp<tosa::IfOp>();
60 target.addLegalOp<tosa::ConstOp>();
61 target.addLegalOp<tosa::ConstShapeOp>();
62 target.addLegalOp<tosa::WhileOp>();
63 target.addLegalOp<tosa::ConcatOp>();
64 target.addLegalOp<tosa::SliceOp>();
65 target.addLegalOp<tosa::ReshapeOp>();
66 target.addLegalOp<tosa::PadOp>();
68 target.markUnknownOpDynamicallyLegal([](Operation *) {
return true; });
70 TypeConverter converter;
73 FunctionOpInterface func = getOperation();
75 options.allowNonFinites = allowNonFinites;
78 if (
failed(applyFullConversion(func,
target, std::move(patterns))))
86 return std::make_unique<TosaToLinalg>(
options);
91 const TosaToLinalgNamedOptions &tosaToLinalgNamedOptions,
92 std::optional<tosa::TosaValidationOptions> validationOptions,
93 std::optional<TosaAttachTargetOptions> attachTargetOptions) {
95 if (!
options.disableTosaDecompositions)
97 tosa::createTosaOptionalDecompositionsPass());
100 pm.
addNestedPass<func::FuncOp>(tosa::createTosaInferShapesPass());
101 pm.
addNestedPass<func::FuncOp>(tosa::createTosaMakeBroadcastablePass());
106 pm.
addNestedPass<func::FuncOp>(tosa::createTosaLayerwiseConstantFoldPass(
107 {
options.aggressiveReduceConstant}));
108 pm.
addNestedPass<func::FuncOp>(tosa::createTosaMakeBroadcastablePass());
112 if (validationOptions || attachTargetOptions) {
113 if (!attachTargetOptions) {
114 attachTargetOptions = TosaAttachTargetOptions();
115 attachTargetOptions->profiles = {
"pro_int",
"pro_fp"};
118 attachTargetOptions->extensions = {
"doubleround"};
120 pm.
addPass(tosa::createTosaAttachTarget(*attachTargetOptions));
122 if (validationOptions)
123 pm.
addPass(tosa::createTosaValidation(*validationOptions));
133struct TosaToLinalgPipelineOptions
135 PassOptions::Option<bool> validation{
137 llvm::cl::desc(
"Run tosa-attach-target and tosa-validate as part of the "
139 llvm::cl::init(
true)};
145 "tosa-to-linalg-pipeline",
146 "The default pipeline for converting TOSA operators to the equivalent "
147 "operations using the tensor operations in LinAlg as well as LinAlg "
149 [](
OpPassManager &pm,
const TosaToLinalgPipelineOptions &pipelineOpts) {
150 TosaToLinalgOptions tosaToLinalgOptions;
151 TosaToLinalgNamedOptions tosaToLinalgNamedOptions;
152 std::optional<TosaValidationOptions> validationOptions;
153 if (pipelineOpts.validation) {
154 validationOptions = TosaValidationOptions{
160 tosaToLinalgNamedOptions,
static llvm::ManagedStatic< PassManagerOptions > options
This class represents a pass manager that runs passes on either a specific operation type,...
void addPass(std::unique_ptr< Pass > pass)
Add the given pass to this pass manager.
void addNestedPass(std::unique_ptr< Pass > pass)
Add the given pass to a nested pass manager for the given operation kind OpT.
std::unique_ptr< Pass > createTosaToLinalgNamed(const TosaToLinalgNamedOptions &options=TosaToLinalgNamedOptions())
void addTosaToLinalgPasses(OpPassManager &pm, const TosaToLinalgOptions &options, const TosaToLinalgNamedOptions &tosaToLinalgNamedOptions=TosaToLinalgNamedOptions(), std::optional< tosa::TosaValidationOptions > validationOptions=tosa::TosaValidationOptions{false, false}, std::optional< TosaAttachTargetOptions > attachTargetOptions=std::nullopt)
Populates passes to convert from TOSA to Linalg.
std::unique_ptr< Pass > createTosaToLinalg(const TosaToLinalgOptions &options=TosaToLinalgOptions())
void populateTosaToLinalgConversionPatterns(const TypeConverter &converter, RewritePatternSet *patterns, const TosaToLinalgOptions &options=TosaToLinalgOptions())
Populates conversion passes from TOSA dialect to Linalg dialect.
void populateTosaTypeConversion(TypeConverter &converter)
void registerTosaToLinalgPipelines()
Populates TOSA to linalg pipelines Currently, this includes only the "tosa-to-linalg-pipeline".
Include the generated interface declarations.
std::unique_ptr< Pass > createCanonicalizerPass(const GreedyRewriteConfig &config, ArrayRef< std::string > disabledPatterns={}, ArrayRef< std::string > enabledPatterns={})
Creates an instance of the Canonicalizer pass with the specified config.
PassPipelineRegistration provides a global initializer that registers a Pass pipeline builder routine...