FreeTensor
Loading...
Searching...
No Matches
visitor.h
Go to the documentation of this file.
1#ifndef FREE_TENSOR_VISITOR_H
2#define FREE_TENSOR_VISITOR_H
3
4#include <debug.h>
5#include <expr.h>
6#include <func.h>
7#include <stmt.h>
8
9namespace freetensor {
10
11class Visitor {
12 public:
13 typedef void ExprRetType;
14 typedef void StmtRetType;
15
16 virtual ~Visitor() {}
17
18 virtual void operator()(const AST &op) final;
19
20 protected:
21 /* Additional hook for any expressions
22 *
23 * Cautious when one visitor B inherits another visitor A, the calling order
24 * is B::visitExpr -> A::visitExpr -> B::visit -> A::visit
25 */
26 virtual void visitExpr(const Expr &op);
27
28 /* Additional hook for any statements
29 *
30 * Cautious when one visitor B inherits another visitor A, the calling order
31 * is B::visitStmt -> A::visitStmt -> B::visit -> A::visit
32 */
33 virtual void visitStmt(const Stmt &op);
34
35 // Hooks for each node
36 virtual void visit(const Any &op) {}
37 virtual void visit(const AnyExpr &op) {}
38
39 virtual void visit(const Func &op) { (*this)(op->body_); }
40
41 virtual void visit(const StmtSeq &op) {
42 for (auto &&stmt : op->stmts_) {
43 (*this)(stmt);
44 }
45 }
46
47 virtual void visit(const VarDef &op) {
48 for (auto &&dim : op->buffer_->tensor()->shape()) {
49 (*this)(dim);
50 }
51 (*this)(op->body_);
52 }
53
54 virtual void visit(const Var &op) {}
55
56 virtual void visit(const Store &op) {
57 for (auto &&index : op->indices_) {
58 (*this)(index);
59 }
60 (*this)(op->expr_);
61 }
62
63 virtual void visit(const Alloc &op) {}
64
65 virtual void visit(const Free &op) {}
66
67 virtual void visit(const Load &op) {
68 for (auto &&index : op->indices_) {
69 (*this)(index);
70 }
71 }
72
73 virtual void visit(const ReduceTo &op) {
74 for (auto &&index : op->indices_) {
75 (*this)(index);
76 }
77 (*this)(op->expr_);
78 }
79
80 virtual void visit(const IntConst &op) {}
81
82 virtual void visit(const FloatConst &op) {}
83
84 virtual void visit(const BoolConst &op) {}
85
86 virtual void visit(const Add &op) {
87 (*this)(op->lhs_);
88 (*this)(op->rhs_);
89 }
90
91 virtual void visit(const Sub &op) {
92 (*this)(op->lhs_);
93 (*this)(op->rhs_);
94 }
95
96 virtual void visit(const Mul &op) {
97 (*this)(op->lhs_);
98 (*this)(op->rhs_);
99 }
100
101 virtual void visit(const RealDiv &op) {
102 (*this)(op->lhs_);
103 (*this)(op->rhs_);
104 }
105
106 virtual void visit(const FloorDiv &op) {
107 (*this)(op->lhs_);
108 (*this)(op->rhs_);
109 }
110
111 virtual void visit(const CeilDiv &op) {
112 (*this)(op->lhs_);
113 (*this)(op->rhs_);
114 }
115
116 virtual void visit(const RoundTowards0Div &op) {
117 (*this)(op->lhs_);
118 (*this)(op->rhs_);
119 }
120
121 virtual void visit(const Mod &op) {
122 (*this)(op->lhs_);
123 (*this)(op->rhs_);
124 }
125
126 virtual void visit(const Remainder &op) {
127 (*this)(op->lhs_);
128 (*this)(op->rhs_);
129 }
130
131 virtual void visit(const Min &op) {
132 (*this)(op->lhs_);
133 (*this)(op->rhs_);
134 }
135
136 virtual void visit(const Max &op) {
137 (*this)(op->lhs_);
138 (*this)(op->rhs_);
139 }
140
141 virtual void visit(const LT &op) {
142 (*this)(op->lhs_);
143 (*this)(op->rhs_);
144 }
145
146 virtual void visit(const LE &op) {
147 (*this)(op->lhs_);
148 (*this)(op->rhs_);
149 }
150
151 virtual void visit(const GT &op) {
152 (*this)(op->lhs_);
153 (*this)(op->rhs_);
154 }
155
156 virtual void visit(const GE &op) {
157 (*this)(op->lhs_);
158 (*this)(op->rhs_);
159 }
160
161 virtual void visit(const EQ &op) {
162 (*this)(op->lhs_);
163 (*this)(op->rhs_);
164 }
165
166 virtual void visit(const NE &op) {
167 (*this)(op->lhs_);
168 (*this)(op->rhs_);
169 }
170
171 virtual void visit(const LAnd &op) {
172 (*this)(op->lhs_);
173 (*this)(op->rhs_);
174 }
175
176 virtual void visit(const LOr &op) {
177 (*this)(op->lhs_);
178 (*this)(op->rhs_);
179 }
180
181 virtual void visit(const LNot &op) { (*this)(op->expr_); }
182
183 virtual void visit(const Sqrt &op) { (*this)(op->expr_); }
184
185 virtual void visit(const Exp &op) { (*this)(op->expr_); }
186
187 virtual void visit(const Ln &op) { (*this)(op->expr_); }
188
189 virtual void visit(const Square &op) { (*this)(op->expr_); }
190
191 virtual void visit(const Sigmoid &op) { (*this)(op->expr_); }
192
193 virtual void visit(const Sin &op) { (*this)(op->expr_); }
194
195 virtual void visit(const Cos &op) { (*this)(op->expr_); }
196
197 virtual void visit(const Tan &op) { (*this)(op->expr_); }
198
199 virtual void visit(const Tanh &op) { (*this)(op->expr_); }
200
201 virtual void visit(const Abs &op) { (*this)(op->expr_); }
202
203 virtual void visit(const Floor &op) { (*this)(op->expr_); }
204
205 virtual void visit(const Ceil &op) { (*this)(op->expr_); }
206
207 virtual void visit(const Unbound &op) { (*this)(op->expr_); }
208
209 virtual void visit(const For &op) {
210 (*this)(op->begin_);
211 (*this)(op->end_);
212 (*this)(op->len_);
213 for (auto &&r : op->property_->reductions_) {
214 for (auto &&item : r->begins_) {
215 (*this)(item);
216 }
217 for (auto &&item : r->ends_) {
218 (*this)(item);
219 }
220 }
221 (*this)(op->body_);
222 }
223
224 virtual void visit(const If &op) {
225 (*this)(op->cond_);
226 (*this)(op->thenCase_);
227 if (op->elseCase_.isValid()) {
228 (*this)(op->elseCase_);
229 }
230 }
231
232 virtual void visit(const Assert &op) {
233 (*this)(op->cond_);
234 (*this)(op->body_);
235 }
236
237 virtual void visit(const Assume &op) {
238 (*this)(op->cond_);
239 (*this)(op->body_);
240 }
241
242 virtual void visit(const IfExpr &op) {
243 (*this)(op->cond_);
244 (*this)(op->thenCase_);
245 (*this)(op->elseCase_);
246 }
247
248 virtual void visit(const Cast &op) { (*this)(op->expr_); }
249
250 virtual void visit(const Intrinsic &op) {
251 for (auto &&param : op->params_) {
252 (*this)(param);
253 }
254 }
255
256 virtual void visit(const Eval &op) { (*this)(op->expr_); }
257
258 virtual void visit(const MatMul &op) {
259 (*this)(op->a_);
260 (*this)(op->b_);
261 (*this)(op->c_);
262 (*this)(op->alpha_);
263 (*this)(op->beta_);
264 (*this)(op->m_);
265 (*this)(op->k_);
266 (*this)(op->n_);
267 (*this)(op->lda_);
268 (*this)(op->ldb_);
269 (*this)(op->ldc_);
270 (*this)(op->stridea_);
271 (*this)(op->strideb_);
272 (*this)(op->stridec_);
273 (*this)(op->batchSize_);
274 (*this)(op->equivalent_);
275 }
276
277 virtual void visit(const MarkVersion &op) {}
278
279 virtual void visit(const LoadAtVersion &op) {
280 for (auto &&idx : op->indices_) {
281 (*this)(idx);
282 }
283 }
284};
285
286} // namespace freetensor
287
288#endif // FREE_TENSOR_VISITOR_H
SubTree< ForProperty > property_
Definition: stmt.h:298
SubTree< ExprNode > begin_
Definition: stmt.h:294
SubTree< ExprNode > len_
Definition: stmt.h:297
SubTree< ExprNode > end_
Definition: stmt.h:295
SubTree< StmtNode > body_
Definition: stmt.h:299
SubTree< StmtNode > body_
Definition: func.h:56
SubTreeList< ExprNode > indices_
Definition: stmt.h:232
SubTree< ExprNode > expr_
Definition: stmt.h:234
bool isValid() const
Definition: ref.h:89
SubTreeList< StmtNode > stmts_
Definition: stmt.h:44
SubTree< ExprNode > expr_
Definition: stmt.h:136
SubTreeList< ExprNode > indices_
Definition: stmt.h:135
SubTree< StmtNode > body_
Definition: stmt.h:101
SubTree< Buffer > buffer_
Definition: stmt.h:86
Definition: visitor.h:11
virtual void visit(const RealDiv &op)
Definition: visitor.h:101
virtual void visit(const Ln &op)
Definition: visitor.h:187
virtual void visit(const Sin &op)
Definition: visitor.h:193
virtual void visit(const VarDef &op)
Definition: visitor.h:47
virtual void visit(const ReduceTo &op)
Definition: visitor.h:73
virtual void visit(const Intrinsic &op)
Definition: visitor.h:250
virtual void visit(const Cast &op)
Definition: visitor.h:248
virtual void visit(const FloatConst &op)
Definition: visitor.h:82
virtual void visit(const Min &op)
Definition: visitor.h:131
virtual void visit(const AnyExpr &op)
Definition: visitor.h:37
virtual void visit(const Assert &op)
Definition: visitor.h:232
virtual void visit(const IfExpr &op)
Definition: visitor.h:242
virtual void visit(const Load &op)
Definition: visitor.h:67
virtual void visit(const Mod &op)
Definition: visitor.h:121
virtual void visit(const Add &op)
Definition: visitor.h:86
virtual void visit(const Remainder &op)
Definition: visitor.h:126
virtual void visit(const Any &op)
Definition: visitor.h:36
virtual void visit(const Mul &op)
Definition: visitor.h:96
virtual void visit(const FloorDiv &op)
Definition: visitor.h:106
virtual void visit(const Abs &op)
Definition: visitor.h:201
virtual void visit(const Cos &op)
Definition: visitor.h:195
virtual void visit(const GE &op)
Definition: visitor.h:156
virtual void visit(const MatMul &op)
Definition: visitor.h:258
virtual ~Visitor()
Definition: visitor.h:16
virtual void visit(const Tan &op)
Definition: visitor.h:197
virtual void visit(const Alloc &op)
Definition: visitor.h:63
virtual void visit(const LNot &op)
Definition: visitor.h:181
virtual void visit(const Ceil &op)
Definition: visitor.h:205
virtual void visit(const Floor &op)
Definition: visitor.h:203
virtual void visit(const LoadAtVersion &op)
Definition: visitor.h:279
virtual void visitExpr(const Expr &op)
Definition: visitor.cc:6
virtual void visit(const BoolConst &op)
Definition: visitor.h:84
virtual void visit(const MarkVersion &op)
Definition: visitor.h:277
virtual void visit(const Func &op)
Definition: visitor.h:39
virtual void visit(const LOr &op)
Definition: visitor.h:176
virtual void visit(const LE &op)
Definition: visitor.h:146
virtual void visit(const GT &op)
Definition: visitor.h:151
void ExprRetType
Definition: visitor.h:13
virtual void visit(const LAnd &op)
Definition: visitor.h:171
virtual void visit(const NE &op)
Definition: visitor.h:166
virtual void visit(const LT &op)
Definition: visitor.h:141
virtual void visit(const Max &op)
Definition: visitor.h:136
virtual void visit(const IntConst &op)
Definition: visitor.h:80
virtual void visit(const EQ &op)
Definition: visitor.h:161
void StmtRetType
Definition: visitor.h:14
virtual void visit(const For &op)
Definition: visitor.h:209
virtual void visit(const Var &op)
Definition: visitor.h:54
virtual void visit(const If &op)
Definition: visitor.h:224
virtual void visit(const StmtSeq &op)
Definition: visitor.h:41
virtual void visit(const Tanh &op)
Definition: visitor.h:199
virtual void operator()(const AST &op) final
Definition: visitor.cc:89
virtual void visit(const Store &op)
Definition: visitor.h:56
virtual void visit(const Sub &op)
Definition: visitor.h:91
virtual void visit(const Exp &op)
Definition: visitor.h:185
virtual void visit(const Square &op)
Definition: visitor.h:189
virtual void visit(const Sqrt &op)
Definition: visitor.h:183
virtual void visit(const Sigmoid &op)
Definition: visitor.h:191
virtual void visit(const Assume &op)
Definition: visitor.h:237
virtual void visit(const Unbound &op)
Definition: visitor.h:207
virtual void visitStmt(const Stmt &op)
Definition: visitor.cc:62
virtual void visit(const Eval &op)
Definition: visitor.h:256
virtual void visit(const Free &op)
Definition: visitor.h:65
virtual void visit(const CeilDiv &op)
Definition: visitor.h:111
virtual void visit(const RoundTowards0Div &op)
Definition: visitor.h:116
Definition: allocator.h:9