1 #ifndef HALIDE_IR_VISITOR_H
2 #define HALIDE_IR_VISITOR_H
97 std::set<IRHandle> visited;
117 void visit(
const EQ *)
override;
118 void visit(
const NE *)
override;
119 void visit(
const LT *)
override;
120 void visit(
const LE *)
override;
121 void visit(
const GT *)
override;
122 void visit(
const GE *)
override;
124 void visit(
const Or *)
override;
158 template<
typename T,
typename ExprRet,
typename StmtRet>
161 template<
typename... Args>
162 ExprRet dispatch_expr(
const BaseExprNode *node, Args &&...args) {
163 if (node ==
nullptr) {
168 return ((T *)
this)->visit((
const IntImm *)node, std::forward<Args>(args)...);
170 return ((T *)
this)->visit((
const UIntImm *)node, std::forward<Args>(args)...);
172 return ((T *)
this)->visit((
const FloatImm *)node, std::forward<Args>(args)...);
174 return ((T *)
this)->visit((
const StringImm *)node, std::forward<Args>(args)...);
176 return ((T *)
this)->visit((
const Broadcast *)node, std::forward<Args>(args)...);
178 return ((T *)
this)->visit((
const Cast *)node, std::forward<Args>(args)...);
180 return ((T *)
this)->visit((
const Reinterpret *)node, std::forward<Args>(args)...);
182 return ((T *)
this)->visit((
const Variable *)node, std::forward<Args>(args)...);
184 return ((T *)
this)->visit((
const Add *)node, std::forward<Args>(args)...);
186 return ((T *)
this)->visit((
const Sub *)node, std::forward<Args>(args)...);
188 return ((T *)
this)->visit((
const Mod *)node, std::forward<Args>(args)...);
190 return ((T *)
this)->visit((
const Mul *)node, std::forward<Args>(args)...);
192 return ((T *)
this)->visit((
const Div *)node, std::forward<Args>(args)...);
194 return ((T *)
this)->visit((
const Min *)node, std::forward<Args>(args)...);
196 return ((T *)
this)->visit((
const Max *)node, std::forward<Args>(args)...);
198 return ((T *)
this)->visit((
const EQ *)node, std::forward<Args>(args)...);
200 return ((T *)
this)->visit((
const NE *)node, std::forward<Args>(args)...);
202 return ((T *)
this)->visit((
const LT *)node, std::forward<Args>(args)...);
204 return ((T *)
this)->visit((
const LE *)node, std::forward<Args>(args)...);
206 return ((T *)
this)->visit((
const GT *)node, std::forward<Args>(args)...);
208 return ((T *)
this)->visit((
const GE *)node, std::forward<Args>(args)...);
210 return ((T *)
this)->visit((
const And *)node, std::forward<Args>(args)...);
212 return ((T *)
this)->visit((
const Or *)node, std::forward<Args>(args)...);
214 return ((T *)
this)->visit((
const Not *)node, std::forward<Args>(args)...);
216 return ((T *)
this)->visit((
const Select *)node, std::forward<Args>(args)...);
218 return ((T *)
this)->visit((
const Load *)node, std::forward<Args>(args)...);
220 return ((T *)
this)->visit((
const Ramp *)node, std::forward<Args>(args)...);
222 return ((T *)
this)->visit((
const Call *)node, std::forward<Args>(args)...);
224 return ((T *)
this)->visit((
const Let *)node, std::forward<Args>(args)...);
226 return ((T *)
this)->visit((
const Shuffle *)node, std::forward<Args>(args)...);
228 return ((T *)
this)->visit((
const VectorReduce *)node, std::forward<Args>(args)...);
253 template<
typename... Args>
254 StmtRet dispatch_stmt(
const BaseStmtNode *node, Args &&...args) {
255 if (node ==
nullptr) {
293 return ((T *)
this)->visit((
const LetStmt *)node, std::forward<Args>(args)...);
295 return ((T *)
this)->visit((
const AssertStmt *)node, std::forward<Args>(args)...);
297 return ((T *)
this)->visit((
const ProducerConsumer *)node, std::forward<Args>(args)...);
299 return ((T *)
this)->visit((
const For *)node, std::forward<Args>(args)...);
301 return ((T *)
this)->visit((
const Acquire *)node, std::forward<Args>(args)...);
303 return ((T *)
this)->visit((
const Store *)node, std::forward<Args>(args)...);
305 return ((T *)
this)->visit((
const Provide *)node, std::forward<Args>(args)...);
307 return ((T *)
this)->visit((
const Allocate *)node, std::forward<Args>(args)...);
309 return ((T *)
this)->visit((
const Free *)node, std::forward<Args>(args)...);
311 return ((T *)
this)->visit((
const Realize *)node, std::forward<Args>(args)...);
313 return ((T *)
this)->visit((
const Block *)node, std::forward<Args>(args)...);
315 return ((T *)
this)->visit((
const Fork *)node, std::forward<Args>(args)...);
317 return ((T *)
this)->visit((
const IfThenElse *)node, std::forward<Args>(args)...);
319 return ((T *)
this)->visit((
const Evaluate *)node, std::forward<Args>(args)...);
321 return ((T *)
this)->visit((
const Prefetch *)node, std::forward<Args>(args)...);
323 return ((T *)
this)->visit((
const Atomic *)node, std::forward<Args>(args)...);
329 template<
typename... Args>
331 return dispatch_stmt(s.
get(), std::forward<Args>(args)...);
334 template<
typename... Args>
336 return dispatch_stmt(s.get(), std::forward<Args>(args)...);
339 template<
typename... Args>
341 return dispatch_expr(e.
get(), std::forward<Args>(args)...);
344 template<
typename... Args>
346 return dispatch_expr(e.get(), std::forward<Args>(args)...);