FreeTensor
Loading...
Searching...
No Matches
var_merge.h
Go to the documentation of this file.
1#ifndef FREE_TENSOR_VAR_MERGE_H
2#define FREE_TENSOR_VAR_MERGE_H
3
4#include <mutator.h>
5
6namespace freetensor {
7
8class VarMerge : public Mutator {
9 ID def_;
10 std::string var_, newVar_;
11 int dim_;
12 Expr factor_;
13 bool found_ = false;
14
15 public:
16 VarMerge(const ID &def, int dim) : def_(def), dim_(dim) {}
17
18 bool found() const { return found_; }
19
20 private:
21 template <class T> T mergeMemAcc(const T &op) {
22 if (op->var_ == var_) {
23 op->var_ = newVar_;
24 Expr a = op->indices_[dim_], b = op->indices_[dim_ + 1];
25 op->indices_[dim_] = makeAdd(makeMul(a, factor_), b);
26 op->indices_.erase(op->indices_.begin() + dim_ + 1);
27 }
28 return op;
29 }
30
31 protected:
32 Stmt visit(const VarDef &op) override;
33 Stmt visit(const Store &op) override;
34 Stmt visit(const ReduceTo &op) override;
35 Expr visit(const Load &op) override;
36};
37
38Stmt varMerge(const Stmt &ast, const ID &def, int dim);
39
40} // namespace freetensor
41
42#endif // FREE_TENSOR_VAR_MERGE_H
Definition: id.h:18
Definition: mutator.h:11
Definition: var_merge.h:8
Stmt visit(const VarDef &op) override
Definition: var_merge.cc:7
bool found() const
Definition: var_merge.h:18
VarMerge(const ID &def, int dim)
Definition: var_merge.h:16
Definition: allocator.h:9
Ref< VarDefNode > VarDef
Definition: stmt.h:107
Expr makeMul(T &&lhs, U &&rhs, std::source_location loc=std::source_location::current())
Definition: expr.h:202
Ref< LoadNode > Load
Definition: expr.h:61
Ref< StoreNode > Store
Definition: stmt.h:140
Expr makeAdd(T &&lhs, U &&rhs, std::source_location loc=std::source_location::current())
Definition: expr.h:174
Ref< ReduceToNode > ReduceTo
Definition: stmt.h:248
Ref< StmtNode > Stmt
Definition: ast.h:152
Stmt varMerge(const Stmt &ast, const ID &def, int dim)
Definition: var_merge.cc:69
Ref< ExprNode > Expr
Definition: ast.h:184