analyze_align.h 1.9 KB
Newer Older
C
ckey_Dou 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
/**
 * Copyright 2019 Huawei Technologies Co., Ltd
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
#ifndef PASS_ANALYZE_ALIGN_H_
#define PASS_ANALYZE_ALIGN_H_

#include <tvm/ir.h>
#include <tvm/ir_mutator.h>

#include <string>
#include <set>

#include "pass/utils.h"
#include "arith_expr_simplify.h"
#include "expr_alg_simplify.h"

namespace akg {
namespace ir {
const std::set<std::string> exclude_list = {
  "mad",
  "scatter",
  "vec_binary_proposal_sort",
  "vec_binary_topk_sort",
  "vec_binary_nms",
  "vec_binary_iou",
  "vec_binary_dropout",
  "vec_single_four2five_nchw",
  "opt_broadcast",
  "reduce_reorder",
};
class IndexOptimizer : public ktvm::ir::IRMutator {
 public:
  explicit IndexOptimizer(bool rm = false) : var2expr(), rm_load_(rm) {}
  ~IndexOptimizer() override = default;

#define MUTATE_OP(OP)                               \
  Expr Mutate_(const OP *op, const Expr &e) final { \
    Var v("tmp");                                   \
    var2expr.Set(v, e);                             \
    return v;                                       \
  }
  MUTATE_OP(Div)
  MUTATE_OP(Mod)
  MUTATE_OP(FloorDiv)
  MUTATE_OP(FloorMod)
#undef MUTATE_OP

  Expr Mutate_(const Load *op, const Expr &e) final {
    if (rm_load_) {
      Var v("tmp");
      var2expr.Set(v, e);
      return v;
    }
    return e;
  }

  Map<Var, Expr> var2expr;

 private:
  bool rm_load_;
};
}  // namespace ir
}  // namespace akg
#endif  // PASS_ANALYZE_ALIGN_H_