FreeTensor
Loading...
Searching...
No Matches
separate_tail.h
Go to the documentation of this file.
1#ifndef FREE_TENSOR_SEPERATE_TAIL_H
2#define FREE_TENSOR_SEPERATE_TAIL_H
3
4#include <functional>
5#include <unordered_set>
6#include <vector>
7
9#include <mutator.h>
10#include <visitor.h>
11
12namespace freetensor {
13
14class WrapMetadata : public Mutator {
15 std::string op_;
16
17 public:
18 WrapMetadata(const std::string &op) : op_(op) {}
19
20 protected:
21 Stmt visitStmt(const Stmt &op) override;
22};
23
53class SeparateTail : public SymbolTable<Mutator> {
55
56 bool noDuplicateVarDefs_;
57
58 const std::unordered_set<ID> &candidates_;
59 std::unordered_set<ID> nextCandidates_;
60
61 std::vector<std::vector<If>> ifStack_;
62 std::vector<bool> hasVarDefStack_;
63
64 public:
65 SeparateTail(bool noDuplicateVarDefs,
66 const std::unordered_set<ID> &candidates)
67 : noDuplicateVarDefs_(noDuplicateVarDefs), candidates_(candidates) {}
68
69 const std::unordered_set<ID> &nextCandidates() const {
70 return nextCandidates_;
71 }
72
73 private:
74 void genSeparation(const Expr &iterVar, const Expr &cond,
75 const std::unordered_set<std::string> &bodyAllWrites,
76 const std::function<void(const Expr &)> &callback);
77
78 protected:
79 Stmt visit(const If &op) override;
80 Stmt visit(const For &op) override;
81 Stmt visit(const VarDef &op) override;
82};
83
84Stmt separateTail(const Stmt &ast, bool noDuplicateVarDefs);
85
86} // namespace freetensor
87
88#endif // FREE_TENSOR_SEPERATE_TAIL_H
Definition: mutator.h:11
Definition: separate_tail.h:53
SeparateTail(bool noDuplicateVarDefs, const std::unordered_set< ID > &candidates)
Definition: separate_tail.h:65
Stmt visit(const If &op) override
Definition: separate_tail.cc:61
const std::unordered_set< ID > & nextCandidates() const
Definition: separate_tail.h:69
Definition: symbol_table.h:122
Definition: separate_tail.h:14
Stmt visitStmt(const Stmt &op) override
Definition: separate_tail.cc:26
WrapMetadata(const std::string &op)
Definition: separate_tail.h:18
Definition: allocator.h:9
Ref< StmtNode > Stmt
Definition: ast.h:152
Stmt separateTail(const Stmt &ast, bool noDuplicateVarDefs)
Definition: separate_tail.cc:149