1#ifndef FREE_TENSOR_BLEND_H
2#define FREE_TENSOR_BLEND_H
4#include <unordered_map>
14 std::vector<ID> scopes_;
21 const std::vector<ID> &
scopes()
const {
return scopes_; }
23 bool found()
const {
return found_; }
35 int len_ = 0, curIter_ = 0;
36 std::vector<Stmt> envStack_;
37 std::vector<VarDef> defs_;
38 std::unordered_map<std::string, std::pair<Expr, Expr>> offset_;
45 : loop_(loop), exprVari_(exprVari), varVari_(varVari) {}
48 template <
class T>
Stmt visitLeafStmt(
const T &op) {
50 std::vector<Stmt> stmts;
51 for (curIter_ = 0; curIter_ < len_; curIter_++) {
54 stmt = visitMemAccess(stmt.template as<StoreNode>());
56 stmt = visitMemAccess(stmt.template as<ReduceToNode>());
61 for (
auto it = envStack_.rbegin(); it != envStack_.rend();
63 switch ((*it)->nodeType()) {
65 auto env = it->as<ForNode>();
66 stmt =
makeFor(env->iter_, (*
this)(env->begin_),
67 (*
this)(env->end_), (*
this)(env->step_),
68 (*
this)(env->len_), env->property_,
73 auto env = it->as<IfNode>();
74 stmt =
makeIf((*
this)(env->cond_), std::move(stmt));
78 auto env = it->as<AssertNode>();
79 stmt =
makeAssert((*
this)(env->cond_), std::move(stmt));
86 stmts.emplace_back(std::move(stmt));
94 template <
class T> T visitMemAccess(
const T &op) {
96 for (
auto &&def : defs_) {
97 if (def->name_ == op->var_) {
98 op->var_ +=
"." + std::to_string(curIter_);
Stmt visit(const ReduceTo &op) override
Definition: blend.h:107
BlendPass(const ID &loop, const LoopVariExprMap &exprVari, const LoopVariUniqVarMap &varVari)
Definition: blend.h:43
Stmt visit(const Eval &op) override
Definition: blend.h:108
Stmt visit(const Store &op) override
Definition: blend.h:106
void visit(const For &op) override
Definition: blend.cc:9
bool found() const
Definition: blend.h:23
FindAllScopesInside(const ID &loop)
Definition: blend.h:19
const std::vector< ID > & scopes() const
Definition: blend.h:21
virtual Stmt visit(const Any &op)
Definition: mutator.h:39
#define ASSERT(expr)
Definition: except.h:152
Definition: allocator.h:9
std::unordered_map< ID, std::unordered_map< ID, LoopVariability > > LoopVariUniqVarMap
Definition: find_loop_variance.h:23
auto makeMetadata(const std::string &op, Srcs &&...sourceStmts)
Definition: ast.h:315
std::unordered_map< StmtOrExprID, std::unordered_map< ID, LoopVariability > > LoopVariExprMap
Definition: find_loop_variance.h:26
Stmt makeAssert(Tcond &&cond, Tbody &&body, const Metadata &metadata=nullptr, const ID &id={}, std::source_location loc=std::source_location::current())
Definition: stmt.h:394
Ref< StmtNode > Stmt
Definition: ast.h:152
Stmt makeStmtSeq(Tstmts &&stmts, const Metadata &metadata=nullptr, const ID &id={}, std::source_location loc=std::source_location::current())
Definition: stmt.h:51
Stmt makeIf(Tcond &&cond, Tthen &&thenCase, Telse &&elseCase, const Metadata &metadata=nullptr, const ID &id={}, std::source_location loc=std::source_location::current())
Definition: stmt.h:354
Stmt makeFor(const std::string &iter, Tbegin &&begin, Tend &&end, Tstep &&step, Tlen &&len, Tproperty &&property, Tbody &&body, const Metadata &metadata=nullptr, const ID &id={}, std::source_location loc=std::source_location::current())
Definition: stmt.h:311
Stmt blend(const Stmt &ast, const ID &loop)
Definition: blend.cc:166