1*6e6352f4SJerry-Ge //===- TosaToMLProgram.cpp - Lowering Tosa to MLProgram Dialect------------===//
2*6e6352f4SJerry-Ge //
3*6e6352f4SJerry-Ge // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*6e6352f4SJerry-Ge // See https://llvm.org/LICENSE.txt for license information.
5*6e6352f4SJerry-Ge // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*6e6352f4SJerry-Ge //
7*6e6352f4SJerry-Ge //===----------------------------------------------------------------------===//
8*6e6352f4SJerry-Ge //
9*6e6352f4SJerry-Ge // These rewriters lower from the TOSA dialect to the MLProgram dialect.
10*6e6352f4SJerry-Ge //
11*6e6352f4SJerry-Ge //===----------------------------------------------------------------------===//
12*6e6352f4SJerry-Ge
13*6e6352f4SJerry-Ge #include "mlir/Conversion/TosaToMLProgram/TosaToMLProgram.h"
14*6e6352f4SJerry-Ge #include "mlir/Dialect/MLProgram/IR/MLProgram.h"
15*6e6352f4SJerry-Ge #include "mlir/Dialect/Tosa/IR/TosaOps.h"
16*6e6352f4SJerry-Ge #include "mlir/IR/IRMapping.h"
17*6e6352f4SJerry-Ge #include "mlir/IR/PatternMatch.h"
18*6e6352f4SJerry-Ge
19*6e6352f4SJerry-Ge using namespace mlir;
20*6e6352f4SJerry-Ge using namespace tosa;
21*6e6352f4SJerry-Ge namespace {
22*6e6352f4SJerry-Ge
23*6e6352f4SJerry-Ge class VariableOpConverter : public OpRewritePattern<tosa::VariableOp> {
24*6e6352f4SJerry-Ge public:
25*6e6352f4SJerry-Ge using OpRewritePattern<tosa::VariableOp>::OpRewritePattern;
26*6e6352f4SJerry-Ge
matchAndRewrite(tosa::VariableOp op,PatternRewriter & rewriter) const27*6e6352f4SJerry-Ge LogicalResult matchAndRewrite(tosa::VariableOp op,
28*6e6352f4SJerry-Ge PatternRewriter &rewriter) const final {
29*6e6352f4SJerry-Ge auto newVariable = rewriter.create<mlir::ml_program::GlobalOp>(
30*6e6352f4SJerry-Ge op.getLoc(), op.getName(), op.getType(), /*is_mutable=*/true,
31*6e6352f4SJerry-Ge op.getInitialValueAttr(), /*sym_visibility=*/nullptr);
32*6e6352f4SJerry-Ge newVariable.setPrivate();
33*6e6352f4SJerry-Ge rewriter.replaceOp(op, newVariable);
34*6e6352f4SJerry-Ge return success();
35*6e6352f4SJerry-Ge }
36*6e6352f4SJerry-Ge };
37*6e6352f4SJerry-Ge
38*6e6352f4SJerry-Ge class VariableWriteOpConverter
39*6e6352f4SJerry-Ge : public OpRewritePattern<tosa::VariableWriteOp> {
40*6e6352f4SJerry-Ge public:
41*6e6352f4SJerry-Ge using OpRewritePattern<tosa::VariableWriteOp>::OpRewritePattern;
42*6e6352f4SJerry-Ge
matchAndRewrite(tosa::VariableWriteOp op,PatternRewriter & rewriter) const43*6e6352f4SJerry-Ge LogicalResult matchAndRewrite(tosa::VariableWriteOp op,
44*6e6352f4SJerry-Ge PatternRewriter &rewriter) const final {
45*6e6352f4SJerry-Ge auto globalSymbolRef =
46*6e6352f4SJerry-Ge SymbolRefAttr::get(rewriter.getContext(), op.getName());
47*6e6352f4SJerry-Ge auto newVariableWrite = rewriter.create<ml_program::GlobalStoreOp>(
48*6e6352f4SJerry-Ge op.getLoc(), globalSymbolRef, op.getValue());
49*6e6352f4SJerry-Ge rewriter.replaceOp(op, newVariableWrite);
50*6e6352f4SJerry-Ge return success();
51*6e6352f4SJerry-Ge }
52*6e6352f4SJerry-Ge };
53*6e6352f4SJerry-Ge
54*6e6352f4SJerry-Ge class VariableReadOpConverter : public OpRewritePattern<tosa::VariableReadOp> {
55*6e6352f4SJerry-Ge public:
56*6e6352f4SJerry-Ge using OpRewritePattern<tosa::VariableReadOp>::OpRewritePattern;
57*6e6352f4SJerry-Ge
matchAndRewrite(tosa::VariableReadOp op,PatternRewriter & rewriter) const58*6e6352f4SJerry-Ge LogicalResult matchAndRewrite(tosa::VariableReadOp op,
59*6e6352f4SJerry-Ge PatternRewriter &rewriter) const final {
60*6e6352f4SJerry-Ge auto globalSymbolRef =
61*6e6352f4SJerry-Ge SymbolRefAttr::get(rewriter.getContext(), op.getName());
62*6e6352f4SJerry-Ge auto newVariableRead = rewriter.create<ml_program::GlobalLoadOp>(
63*6e6352f4SJerry-Ge op.getLoc(), op.getType(), globalSymbolRef);
64*6e6352f4SJerry-Ge rewriter.replaceOp(op, newVariableRead);
65*6e6352f4SJerry-Ge
66*6e6352f4SJerry-Ge return success();
67*6e6352f4SJerry-Ge }
68*6e6352f4SJerry-Ge };
69*6e6352f4SJerry-Ge
70*6e6352f4SJerry-Ge } // namespace
71*6e6352f4SJerry-Ge
populateTosaToMLProgramConversionPatterns(RewritePatternSet * patterns)72*6e6352f4SJerry-Ge void mlir::tosa::populateTosaToMLProgramConversionPatterns(
73*6e6352f4SJerry-Ge RewritePatternSet *patterns) {
74*6e6352f4SJerry-Ge patterns->add<VariableOpConverter, VariableWriteOpConverter,
75*6e6352f4SJerry-Ge VariableReadOpConverter>(patterns->getContext());
76*6e6352f4SJerry-Ge }
77