tvm
Loading...
Searching...
No Matches
expr_functor.h
Go to the documentation of this file.
1/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
18 */
19
25#ifndef TVM_RELAX_EXPR_FUNCTOR_H_
26#define TVM_RELAX_EXPR_FUNCTOR_H_
27
30#include <tvm/relax/expr.h>
31#include <tvm/relax/type.h>
33#include <tvm/tirx/function.h>
34
35#include <unordered_map>
36#include <utility>
37namespace tvm {
38namespace relax {
39
51template <typename FType>
53
54// functions to be overriden.
55#define EXPR_FUNCTOR_DEFAULT \
56 { \
57 return VisitExprDefault_(op, std::forward<Args>(args)...); \
58 }
59
60#define EXPR_FUNCTOR_DISABLED \
61 final { \
62 TVM_FFI_THROW(TypeError) << "Relax does not support " << op->GetTypeKey() << " expressions"; \
63 throw; \
64 }
65
66#define RELAX_EXPR_FUNCTOR_DISPATCH(OP) \
67 vtable.template SetDispatch<OP>([](const ffi::ObjectRef& n, TSelf* self, Args... args) { \
68 return self->VisitExpr_(static_cast<const OP*>(n.get()), std::forward<Args>(args)...); \
69 });
70
71#define PY_EXPR_VISITOR_DEFAULT(N, PY_FUNC, DEFAULT_FUNC) \
72 { \
73 if (PY_FUNC != nullptr) \
74 PY_FUNC(N); \
75 else \
76 DEFAULT_FUNC; \
77 }
78
79#define PY_EXPR_MUTATOR_DEFAULT(N, PY_FUNC, DEFAULT_FUNC, RET_TYPE) \
80 { \
81 if (PY_FUNC != nullptr) { \
82 RET_TYPE ret = PY_FUNC(N).cast<RET_TYPE>(); \
83 return ret; \
84 } else { \
85 return DEFAULT_FUNC; \
86 } \
87 }
88
89#define PY_EXPR_VISITOR_DISPATCH(OP, PY_FUNC) \
90 vtable.template SetDispatch<OP>([](const ffi::ObjectRef& n, TSelf* self) { \
91 if (self->PY_FUNC != nullptr) \
92 self->PY_FUNC(n); \
93 else \
94 self->VisitExpr_(static_cast<const OP*>(n.get())); \
95 });
96
97#define PY_EXPR_MUTATOR_DISPATCH(OP, PY_FUNC) \
98 vtable.template SetDispatch<OP>([](const ffi::ObjectRef& n, TSelf* self) { \
99 if (self->PY_FUNC != nullptr) { \
100 Expr expr = self->PY_FUNC(n).cast<Expr>(); \
101 return expr; \
102 } else { \
103 return self->VisitExpr_(static_cast<const OP*>(n.get())); \
104 } \
105 });
106
107#define PY_EXPR_MUTATOR_VISIT_EXPR_POST_ORDER_DISPATCH(OP) \
108 post_order_vtable.template SetDispatch<OP>([](const ffi::ObjectRef& n, TSelf* self) { \
109 return self->VisitExprPostOrder_(static_cast<const OP*>(n.get())); \
110 });
111
112template <typename R, typename... Args>
113class ExprFunctor<R(const Expr& n, Args...)> {
114 private:
115 using TSelf = ExprFunctor<R(const Expr& n, Args...)>;
116 using FType = tvm::ObjectFunctor<R(const ffi::ObjectRef& n, TSelf* self, Args...)>;
117
118 public:
120 using result_type = R;
122 virtual ~ExprFunctor() {}
129 R operator()(const Expr& n, Args... args) { return VisitExpr(n, std::forward<Args>(args)...); }
136 virtual R VisitExpr(const Expr& n, Args... args) {
137 TVM_FFI_ICHECK(n.defined())
138 << "Found null pointer node while traversing AST. The previous pass may "
139 "have generated invalid data.";
140 static FType vtable = InitVTable();
141 if (vtable.CanDispatch(n)) {
142 return vtable(n, this, std::forward<Args>(args)...);
143 }
144 return VisitExprFallback_(n.get(), std::forward<Args>(args)...);
145 }
146 // Functions that can be overriden by subclass
147 // NOTE: cross dialect calls are invoked through global var
148 // We do not expect inline tirx::Function to appear in relax IR.
149 virtual R VisitExpr_(const GenericConstNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
150 virtual R VisitExpr_(const TupleNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
151 virtual R VisitExpr_(const VarNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
152 virtual R VisitExpr_(const DataflowVarNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
153 virtual R VisitExpr_(const ShapeExprNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
154 virtual R VisitExpr_(const ExternFuncNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
155 virtual R VisitExpr_(const GlobalVarNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
156 virtual R VisitExpr_(const FunctionNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
157 virtual R VisitExpr_(const CallNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
158 virtual R VisitExpr_(const TensorLoadNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
159 virtual R VisitExpr_(const tvm::IntImmNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
160 virtual R VisitExpr_(const tvm::FloatImmNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
161 virtual R VisitExpr_(const SeqExprNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
162 virtual R VisitExpr_(const IfExprNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
163 virtual R VisitExpr_(const OpNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
164 virtual R VisitExpr_(const TupleGetItemNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
165 virtual R VisitExpr_(const StringImmNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
166 virtual R VisitExpr_(const DataTypeImmNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
167 virtual R VisitExpr_(const prim::LetNode* op, Args...) EXPR_FUNCTOR_DISABLED;
168 virtual R VisitExpr_(const prim::AddNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
169 virtual R VisitExpr_(const prim::LShiftNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
170 virtual R VisitExpr_(const prim::RShiftNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
171 virtual R VisitExpr_(const prim::BitwiseAndNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
172 virtual R VisitExpr_(const prim::BitwiseOrNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
173 virtual R VisitExpr_(const prim::BitwiseXorNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
174 virtual R VisitExpr_(const prim::BitwiseNotNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
175 virtual R VisitExpr_(const prim::SubNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
176 virtual R VisitExpr_(const prim::MulNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
177 virtual R VisitExpr_(const prim::DivNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
178 virtual R VisitExpr_(const prim::ModNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
179 virtual R VisitExpr_(const prim::FloorDivNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
180 virtual R VisitExpr_(const prim::FloorModNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
181 virtual R VisitExpr_(const prim::MinNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
182 virtual R VisitExpr_(const prim::MaxNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
183 virtual R VisitExpr_(const prim::EQNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
184 virtual R VisitExpr_(const prim::NENode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
185 virtual R VisitExpr_(const prim::LTNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
186 virtual R VisitExpr_(const prim::LENode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
187 virtual R VisitExpr_(const prim::GTNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
188 virtual R VisitExpr_(const prim::GENode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
189 virtual R VisitExpr_(const prim::AndNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
190 virtual R VisitExpr_(const prim::OrNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
191 virtual R VisitExpr_(const prim::CastNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
192 virtual R VisitExpr_(const prim::NotNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
193 virtual R VisitExpr_(const prim::SelectNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
194 virtual R VisitExpr_(const prim::RampNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
195 virtual R VisitExpr_(const prim::BroadcastNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
196 virtual R VisitExpr_(const prim::ShuffleNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
197 virtual R VisitExprFallback_(const ExprNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
198 virtual R VisitExprDefault_(const ffi::Object* op, Args...) {
199 TVM_FFI_THROW(InternalError) << "Do not have a default for " << op->GetTypeKey();
200 throw;
201 }
202
203 private:
204 // initialize the vtable.
205 static FType InitVTable() {
206 FType vtable;
207 // Set dispatch
256 vtable.Finalize();
257 return vtable;
258 }
259};
260
265class ExprVisitor : public ExprFunctor<void(const Expr&)> {
266 public:
271 void VisitExpr(const Expr& expr) override;
272 // specific leaf level visitor functions
273 void VisitExpr_(const GenericConstNode* op) override;
274 void VisitExpr_(const TupleNode* op) override;
275 void VisitExpr_(const VarNode* op) override;
276 void VisitExpr_(const DataflowVarNode* op) override;
277 void VisitExpr_(const ShapeExprNode* op) override;
278 void VisitExpr_(const ExternFuncNode* op) override;
279 void VisitExpr_(const GlobalVarNode* op) override;
280 void VisitExpr_(const FunctionNode* op) override;
281 void VisitExpr_(const CallNode* op) override;
282 void VisitExpr_(const TensorLoadNode* op) override;
283 void VisitExpr_(const tvm::IntImmNode* op) override;
284 void VisitExpr_(const tvm::FloatImmNode* op) override;
285 void VisitExpr_(const SeqExprNode* op) override;
286 void VisitExpr_(const IfExprNode* op) override;
287 void VisitExpr_(const OpNode* op) override;
288 void VisitExpr_(const TupleGetItemNode* op) override;
289 void VisitExpr_(const StringImmNode* op) override;
290 void VisitExpr_(const DataTypeImmNode* op) override;
291 void VisitExpr_(const prim::AddNode* op) override;
292 void VisitExpr_(const prim::LShiftNode* op) override;
293 void VisitExpr_(const prim::RShiftNode* op) override;
294 void VisitExpr_(const prim::BitwiseAndNode* op) override;
295 void VisitExpr_(const prim::BitwiseOrNode* op) override;
296 void VisitExpr_(const prim::BitwiseXorNode* op) override;
297 void VisitExpr_(const prim::BitwiseNotNode* op) override;
298 void VisitExpr_(const prim::SubNode* op) override;
299 void VisitExpr_(const prim::MulNode* op) override;
300 void VisitExpr_(const prim::DivNode* op) override;
301 void VisitExpr_(const prim::ModNode* op) override;
302 void VisitExpr_(const prim::FloorDivNode* op) override;
303 void VisitExpr_(const prim::FloorModNode* op) override;
304 void VisitExpr_(const prim::MinNode* op) override;
305 void VisitExpr_(const prim::MaxNode* op) override;
306 void VisitExpr_(const prim::EQNode* op) override;
307 void VisitExpr_(const prim::NENode* op) override;
308 void VisitExpr_(const prim::LTNode* op) override;
309 void VisitExpr_(const prim::LENode* op) override;
310 void VisitExpr_(const prim::GTNode* op) override;
311 void VisitExpr_(const prim::GENode* op) override;
312 void VisitExpr_(const prim::AndNode* op) override;
313 void VisitExpr_(const prim::OrNode* op) override;
314 void VisitExpr_(const prim::CastNode* op) override;
315 void VisitExpr_(const prim::NotNode* op) override;
316 void VisitExpr_(const prim::SelectNode* op) override;
317 void VisitExpr_(const prim::RampNode* op) override;
318 void VisitExpr_(const prim::BroadcastNode* op) override;
319 void VisitExpr_(const prim::ShuffleNode* op) override;
320 void VisitExprFallback_(const ExprNode* op) override;
321
326 virtual void VisitBinding(const Binding& binding);
327 // specific leaf level visitor functions
328 virtual void VisitBinding_(const VarBindingNode* binding);
329 virtual void VisitBinding_(const MatchCastNode* binding);
330 // second level dispatching based on binding value type.
331 // these dispatching functions get called from first-level dispatch on VarBinding
332 virtual void VisitBinding_(const VarBindingNode* binding, const GenericConstNode* val);
333 virtual void VisitBinding_(const VarBindingNode* binding, const TupleNode* val);
334 virtual void VisitBinding_(const VarBindingNode* binding, const VarNode* val);
335 virtual void VisitBinding_(const VarBindingNode* binding, const DataflowVarNode* val);
336 virtual void VisitBinding_(const VarBindingNode* binding, const ShapeExprNode* val);
337 virtual void VisitBinding_(const VarBindingNode* binding, const ExternFuncNode* val);
338 virtual void VisitBinding_(const VarBindingNode* binding, const GlobalVarNode* val);
339 virtual void VisitBinding_(const VarBindingNode* binding, const FunctionNode* val);
340 virtual void VisitBinding_(const VarBindingNode* binding, const CallNode* val);
341 virtual void VisitBinding_(const VarBindingNode* binding, const SeqExprNode* val);
342 virtual void VisitBinding_(const VarBindingNode* binding, const IfExprNode* val);
343 virtual void VisitBinding_(const VarBindingNode* binding, const OpNode* val);
344 virtual void VisitBinding_(const VarBindingNode* binding, const TupleGetItemNode* val);
345 virtual void VisitBinding_(const VarBindingNode* binding, const ExprNode* val);
346 virtual void VisitBinding_(const VarBindingNode* binding, const StringImmNode* val);
347 virtual void VisitBinding_(const VarBindingNode* binding, const DataTypeImmNode* val);
352 virtual void VisitBindingBlock(const BindingBlock& block);
353 // specific leaf level visitor functions
354 virtual void VisitBindingBlock_(const BindingBlockNode* block);
355 virtual void VisitBindingBlock_(const DataflowBlockNode* block);
356
362 virtual void VisitVarDef(const Var& var);
363
379 virtual void VisitExprDepTypeField(const Type& ty);
380
381 // specific leaf level visitor functions
382 virtual void VisitVarDef_(const VarNode* var);
383 virtual void VisitVarDef_(const DataflowVarNode* var);
384
385 virtual void VisitLoc(const Location& loc);
386 virtual void VisitTypePrimExprField(const PrimExpr& expr);
387
388 private:
389 using TSelf = ExprVisitor;
390 using VisitBindingVTable = tvm::ObjectFunctor<void(const ffi::ObjectRef& n, ExprVisitor* self,
391 const VarBindingNode* binding)>;
392 // initialize the vtable.
393 static VisitBindingVTable InitVisitBindingVTable();
403 class DefaultTypeFieldVisitor : public TypeVisitor {
404 public:
405 explicit DefaultTypeFieldVisitor(ExprVisitor* parent);
406
407 // Override defaults in type visitor.
408 void VisitTypeExprField(const Expr& expr) final;
409 void VisitTypeExprField(const PrimExpr& expr) final;
410 void VisitType_(const FuncTypeNode* op) final;
411
412 private:
413 ExprVisitor* parent_;
414 };
415 // This visitor is not visible to child classes and only
416 // used to supported default visiting behavior.
417 DefaultTypeFieldVisitor default_tyfield_visitor_{this};
418};
419
420void PostOrderVisit(const Expr& node, std::function<void(const Expr&)> fvisit);
421
430class ExprMutatorBase : public ExprFunctor<Expr(const Expr&)> {
431 public:
432 Expr VisitExpr(const Expr& expr) override;
433 Expr VisitExpr_(const GenericConstNode* op) override;
434 Expr VisitExpr_(const TupleNode* op) override;
435 Expr VisitExpr_(const VarNode* op) override;
436 Expr VisitExpr_(const DataflowVarNode* op) override;
437 Expr VisitExpr_(const ShapeExprNode* op) override;
438 Expr VisitExpr_(const ExternFuncNode* op) override;
439 Expr VisitExpr_(const GlobalVarNode* op) override;
440 Expr VisitExpr_(const FunctionNode* op) override;
441 Expr VisitExpr_(const CallNode* op) override;
442 Expr VisitExpr_(const TensorLoadNode* op) override;
443 Expr VisitExpr_(const tvm::IntImmNode* op) override;
444 Expr VisitExpr_(const tvm::FloatImmNode* op) override;
445 Expr VisitExpr_(const SeqExprNode* op) override;
446 Expr VisitExpr_(const IfExprNode* op) override;
447 Expr VisitExpr_(const OpNode* op) override;
448 Expr VisitExpr_(const TupleGetItemNode* op) override;
449 Expr VisitExpr_(const StringImmNode* op) override;
450 Expr VisitExpr_(const DataTypeImmNode* op) override;
451 Expr VisitExpr_(const prim::AddNode* op) override;
452 Expr VisitExpr_(const prim::LShiftNode* op) override;
453 Expr VisitExpr_(const prim::RShiftNode* op) override;
458 Expr VisitExpr_(const prim::SubNode* op) override;
459 Expr VisitExpr_(const prim::MulNode* op) override;
460 Expr VisitExpr_(const prim::DivNode* op) override;
461 Expr VisitExpr_(const prim::ModNode* op) override;
462 Expr VisitExpr_(const prim::FloorDivNode* op) override;
463 Expr VisitExpr_(const prim::FloorModNode* op) override;
464 Expr VisitExpr_(const prim::MinNode* op) override;
465 Expr VisitExpr_(const prim::MaxNode* op) override;
466 Expr VisitExpr_(const prim::EQNode* op) override;
467 Expr VisitExpr_(const prim::NENode* op) override;
468 Expr VisitExpr_(const prim::LTNode* op) override;
469 Expr VisitExpr_(const prim::LENode* op) override;
470 Expr VisitExpr_(const prim::GTNode* op) override;
471 Expr VisitExpr_(const prim::GENode* op) override;
472 Expr VisitExpr_(const prim::AndNode* op) override;
473 Expr VisitExpr_(const prim::OrNode* op) override;
474 Expr VisitExpr_(const prim::CastNode* op) override;
475 Expr VisitExpr_(const prim::NotNode* op) override;
476 Expr VisitExpr_(const prim::SelectNode* op) override;
477 Expr VisitExpr_(const prim::RampNode* op) override;
479 Expr VisitExpr_(const prim::ShuffleNode* op) override;
480 Expr VisitExprFallback_(const ExprNode* op) override;
481
488
496
513 virtual Type VisitExprDepTypeField(const Type& ty);
514
515 protected:
524 bool VisitAndCheckTypeFieldUnchanged(const ffi::ObjectRef& ty) {
525 if (const TypeNode* ty_node = ty.as<TypeNode>()) {
526 Type type = ffi::GetRef<Type>(ty_node);
527 return type.as<MissingType>().has_value() || this->VisitExprDepTypeField(type).same_as(ty);
528 } else {
529 return true;
530 }
531 }
532
533 private:
541 class DefaultTypeFieldMutator : public TypeMutator {
542 public:
543 explicit DefaultTypeFieldMutator(ExprMutatorBase* parent);
544
545 // Override defaults in type visitor.
546 Expr VisitTypeExprField(const Expr& expr) final;
547 PrimExpr VisitTypeExprField(const PrimExpr& expr) final;
548 Type VisitType_(const FuncTypeNode* op) final;
549
550 private:
551 ExprMutatorBase* parent_;
552 };
553 // This visitor is not visible to child classes and only
554 // used to supported default visiting behavior.
555 DefaultTypeFieldMutator default_tyfield_mutator_{this};
556};
557
566 public:
568
569 ExprMutator(ffi::Optional<IRModule> mod = std::nullopt) : builder_(BlockBuilder::Create(mod)) {}
570 Expr VisitExpr(const Expr& expr) override;
571 Expr VisitExpr_(const VarNode* op) override;
572 Expr VisitExpr_(const DataflowVarNode* op) override;
573 Expr VisitExpr_(const FunctionNode* op) override;
574 Expr VisitExpr_(const SeqExprNode* op) override;
575 Expr VisitExpr_(const IfExprNode* op) override;
576
581 virtual void VisitBinding(const Binding& binding);
582 // specific leaf level visitor functions
583 virtual void VisitBinding_(const VarBindingNode* binding);
584 virtual void VisitBinding_(const MatchCastNode* binding);
585 // second level dispatching based on binding value type.
586 // these dispatching functions get called from first-level dispatch on VarBinding
587 virtual void VisitBinding_(const VarBindingNode* binding, const GenericConstNode* val);
588 virtual void VisitBinding_(const VarBindingNode* binding, const TupleNode* val);
589 virtual void VisitBinding_(const VarBindingNode* binding, const VarNode* val);
590 virtual void VisitBinding_(const VarBindingNode* binding, const DataflowVarNode* val);
591 virtual void VisitBinding_(const VarBindingNode* binding, const ShapeExprNode* val);
592 virtual void VisitBinding_(const VarBindingNode* binding, const ExternFuncNode* val);
593 virtual void VisitBinding_(const VarBindingNode* binding, const GlobalVarNode* val);
594 virtual void VisitBinding_(const VarBindingNode* binding, const FunctionNode* val);
595 virtual void VisitBinding_(const VarBindingNode* binding, const CallNode* val);
596 virtual void VisitBinding_(const VarBindingNode* binding, const SeqExprNode* val);
597 virtual void VisitBinding_(const VarBindingNode* binding, const IfExprNode* val);
598 virtual void VisitBinding_(const VarBindingNode* binding, const OpNode* val);
599 virtual void VisitBinding_(const VarBindingNode* binding, const TupleGetItemNode* val);
600 virtual void VisitBinding_(const VarBindingNode* binding, const ExprNode* val);
601 virtual void VisitBinding_(const VarBindingNode* binding, const StringImmNode* val);
602 virtual void VisitBinding_(const VarBindingNode* binding, const DataTypeImmNode* val);
608 virtual BindingBlock VisitBindingBlock(const BindingBlock& block) override; // NOLINT(*)
609 // specific leaf level visitor functions
612
619 virtual Var VisitVarDef(const Var& var);
620 // specific leaf level visitor functions
621 virtual Var VisitVarDef_(const VarNode* var);
622 virtual Var VisitVarDef_(const DataflowVarNode* var);
623
624 protected:
636 void ReEmitBinding(const VarBindingNode* binding, Expr new_value);
637
650 Expr VisitWithNewScope(const Expr& body_expr,
651 ffi::Optional<ffi::Array<Var>> params = std::nullopt);
652
667 Expr VisitWithInnerScope(const Expr& body_expr);
668
675 ffi::Optional<Expr> LookupBinding(const Var& var);
676
683 template <typename T>
685 return builder_->Normalize(ExprMutator::VisitExpr_(op));
686 }
687
696
699
701 std::unordered_map<Var, Var, ffi::ObjectPtrHash, ffi::ObjectPtrEqual> var_remap_;
702
703 private:
704 using TSelf = ExprMutator;
705 using VisitBindingVTable = tvm::ObjectFunctor<void(const ffi::ObjectRef& n, ExprMutator* self,
706 const VarBindingNode* binding)>;
707 // initialize the vtable.
708 static VisitBindingVTable InitVisitBindingVTable();
709};
710
711} // namespace relax
712} // namespace tvm
713#endif // TVM_RELAX_EXPR_FUNCTOR_H_
The utility for constructing Relax binding blocks.
Call corresponds to callable invocation.
Definition expr.h:935
A data type literal with AnyType as its expression type.
Definition expr.h:110
Base type of all the expressions.
Definition base_expr.h:324
Managed reference to ExprNode.
Definition base_expr.h:359
Constant floating point literals in the program.
Definition expr.h:215
A constant whose payload is separate from its expression type.
Definition expr.h:66
Global variable that lives in the top-level module.
Definition expr.h:821
Constant integer literals in the program.
Definition expr.h:135
Non-nullable source-location metadata.
Definition location.h:91
Managed reference to the MissingTypeNode singleton.
Definition base_expr.h:105
A dynamically dispatched functor on the type of the first argument.
Definition object_functor.h:85
Metadata for a canonical primitive operator invoked through Call.
Definition op.h:86
Typed reference/view over any Expr whose ExprNode::ty is PrimType.
Definition base_expr.h:447
A string literal with shared semantic StringType.
Definition expr.h:88
Load a value from an indexed expression source.
Definition expr.h:443
Get the index-th field out of a tuple.
Definition expr.h:405
Tuple container.
Definition expr.h:363
Type is the base type of all types.
Definition base_expr.h:54
Managed reference to TypeNode.
Definition base_expr.h:80
A local variable in the IR.
Definition expr.h:694
Managed reference to VarNode.
Definition expr.h:714
a + b
Definition expr.h:108
a && b
Definition expr.h:558
a & b
Definition expr.h:171
~a
Definition expr.h:649
a | b
Definition expr.h:192
a ^ b
Definition expr.h:213
Create a vector where all the elements are value.
Definition vector_expr.h:79
Cast value from one data type to another.
Definition expr.h:56
a / b in the C semnatics.
Definition expr.h:280
a == b
Definition expr.h:432
Floor division, floor(a/b)
Definition expr.h:325
The remainder of the floordiv.
Definition expr.h:346
a >= b
Definition expr.h:537
a > b
Definition expr.h:516
a << b
Definition expr.h:129
a < b
Definition expr.h:474
Let binding. Bind var to value then evaluate body.
Definition expr.h:727
max(a, b)
Definition expr.h:388
min(a, b)
Definition expr.h:367
a % b in the C semnatics.
Definition expr.h:304
a * b
Definition expr.h:256
a != b
Definition expr.h:453
!a
Definition expr.h:620
a || b
Definition expr.h:589
a >> b
Definition expr.h:150
Construct a vector with lanes elements where its i-th element equals base + i * stride....
Definition vector_expr.h:42
return true_value if condition is true, otherwise return false_value.
Definition expr.h:684
Shuffle instruction. vec = concat(vectors) result = (vec[indices[0]], vec[indices[1]] ....
Definition vector_expr.h:117
a - b
Definition expr.h:234
Definition expr.h:209
Definition expr.h:226
Definition expr.h:120
Definition block_builder.h:257
Definition expr.h:238
A sub-type of the variable node used to mark dataflow variables from normal visible "function local" ...
Definition expr.h:71
virtual R VisitExpr_(const TupleNode *op, Args... args)
Definition expr_functor.h:150
virtual R VisitExpr_(const DataTypeImmNode *op, Args... args)
Definition expr_functor.h:166
virtual R VisitExpr(const Expr &n, Args... args)
The functor call.
Definition expr_functor.h:136
virtual R VisitExpr_(const ShapeExprNode *op, Args... args)
Definition expr_functor.h:153
virtual R VisitExpr_(const TensorLoadNode *op, Args... args)
Definition expr_functor.h:158
virtual R VisitExpr_(const SeqExprNode *op, Args... args)
Definition expr_functor.h:161
virtual R VisitExpr_(const FunctionNode *op, Args... args)
Definition expr_functor.h:156
virtual R VisitExpr_(const GenericConstNode *op, Args... args)
Definition expr_functor.h:149
virtual R VisitExpr_(const OpNode *op, Args... args)
Definition expr_functor.h:163
R result_type
the result type of this functor
Definition expr_functor.h:120
virtual R VisitExpr_(const IfExprNode *op, Args... args)
Definition expr_functor.h:162
virtual R VisitExpr_(const ExternFuncNode *op, Args... args)
Definition expr_functor.h:154
virtual R VisitExpr_(const GlobalVarNode *op, Args... args)
Definition expr_functor.h:155
virtual R VisitExpr_(const prim::LetNode *op, Args...) final
Definition expr_functor.h:167
virtual R VisitExpr_(const DataflowVarNode *op, Args... args)
Definition expr_functor.h:152
virtual R VisitExpr_(const StringImmNode *op, Args... args)
Definition expr_functor.h:165
virtual R VisitExpr_(const tvm::IntImmNode *op, Args... args)
Definition expr_functor.h:159
R operator()(const Expr &n, Args... args)
Same as call.
Definition expr_functor.h:129
virtual R VisitExpr_(const VarNode *op, Args... args)
Definition expr_functor.h:151
virtual R VisitExpr_(const tvm::FloatImmNode *op, Args... args)
Definition expr_functor.h:160
virtual R VisitExpr_(const CallNode *op, Args... args)
Definition expr_functor.h:157
virtual R VisitExpr_(const TupleGetItemNode *op, Args... args)
Definition expr_functor.h:164
virtual ~ExprFunctor()
virtual destructor
Definition expr_functor.h:122
A dynamical functor that dispatches on in the first Expr argument. You can use this as a more powerfu...
Definition expr_functor.h:52
A mutator works in unnormalized form.
Definition expr_functor.h:430
Expr VisitExpr_(const TupleNode *op) override
Expr VisitExpr_(const prim::LTNode *op) override
Expr VisitExpr_(const tvm::IntImmNode *op) override
Expr VisitExpr_(const prim::ModNode *op) override
Expr VisitExpr_(const prim::SelectNode *op) override
Expr VisitExpr_(const prim::NotNode *op) override
Expr VisitExpr_(const prim::EQNode *op) override
Expr VisitExpr_(const VarNode *op) override
virtual Type VisitExprDepTypeField(const Type &ty)
Visit ty that may recursively contain Expr/PrimExpr.
Expr VisitExpr_(const prim::GENode *op) override
Expr VisitExpr_(const prim::SubNode *op) override
Expr VisitExpr_(const prim::FloorModNode *op) override
Expr VisitExpr_(const GlobalVarNode *op) override
Expr VisitExpr_(const TensorLoadNode *op) override
Expr VisitExpr_(const GenericConstNode *op) override
Expr VisitExpr_(const prim::AddNode *op) override
Expr VisitExpr_(const prim::FloorDivNode *op) override
Expr VisitExpr_(const prim::CastNode *op) override
Expr VisitExpr_(const prim::BitwiseNotNode *op) override
Expr VisitExpr_(const prim::BitwiseOrNode *op) override
Expr VisitExpr_(const SeqExprNode *op) override
virtual BindingBlock VisitBindingBlock(const BindingBlock &block)
Mutate BindingBlock.
Expr VisitExpr_(const ShapeExprNode *op) override
Expr VisitExpr_(const prim::RShiftNode *op) override
Expr VisitExpr_(const prim::MaxNode *op) override
Expr VisitExpr_(const prim::GTNode *op) override
Expr VisitExpr_(const prim::BitwiseAndNode *op) override
Expr VisitExpr_(const ExternFuncNode *op) override
Expr VisitExpr_(const DataTypeImmNode *op) override
Expr VisitExpr_(const tvm::FloatImmNode *op) override
Expr VisitExpr_(const prim::MulNode *op) override
Expr VisitExpr_(const CallNode *op) override
Expr VisitExpr_(const OpNode *op) override
Expr VisitExpr_(const prim::LENode *op) override
Expr VisitExpr_(const StringImmNode *op) override
Expr VisitExpr_(const prim::OrNode *op) override
Expr VisitExprFallback_(const ExprNode *op) override
Expr VisitExpr_(const prim::BroadcastNode *op) override
Expr VisitExpr_(const TupleGetItemNode *op) override
Expr VisitExpr_(const prim::AndNode *op) override
Expr VisitExpr_(const prim::NENode *op) override
Expr VisitExpr_(const prim::BitwiseXorNode *op) override
Expr VisitExpr_(const prim::LShiftNode *op) override
Expr VisitExpr_(const prim::DivNode *op) override
Expr VisitExpr_(const IfExprNode *op) override
Expr VisitExpr(const Expr &expr) override
Expr VisitExpr_(const prim::ShuffleNode *op) override
Expr VisitExpr_(const prim::MinNode *op) override
Expr VisitExpr_(const FunctionNode *op) override
Expr VisitExpr_(const prim::RampNode *op) override
virtual PrimExpr VisitTypePrimExprField(const PrimExpr &expr)
Used to visit the PrimExpr inside of dependent type fields.
bool VisitAndCheckTypeFieldUnchanged(const ffi::ObjectRef &ty)
Check whether VisitExprDepTypeField change ty.
Definition expr_functor.h:524
Expr VisitExpr_(const DataflowVarNode *op) override
A mutator works in normal form.
Definition expr_functor.h:565
std::unordered_map< Var, Var, ffi::ObjectPtrHash, ffi::ObjectPtrEqual > var_remap_
Remap a var to a new var in use-site.
Definition expr_functor.h:701
virtual void VisitBinding_(const VarBindingNode *binding, const DataTypeImmNode *val)
Expr VisitExpr_(const VarNode *op) override
Var WithType(Var var, Type ty)
Create a new var with specified type if the original var's shape or type does not match with the spec...
virtual BindingBlock VisitBindingBlock_(const DataflowBlockNode *block)
void ReEmitBinding(const VarBindingNode *binding, Expr new_value)
Try to remit binding and bind it to a new_value.
virtual void VisitBinding_(const VarBindingNode *binding, const IfExprNode *val)
virtual void VisitBinding_(const VarBindingNode *binding, const GlobalVarNode *val)
Expr VisitExpr_(const IfExprNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const GenericConstNode *val)
virtual void VisitBinding_(const VarBindingNode *binding, const CallNode *val)
Expr VisitExpr_(const FunctionNode *op) override
Expr VisitWithNewScope(const Expr &body_expr, ffi::Optional< ffi::Array< Var > > params=std::nullopt)
Rewrite the expr with a new scope, used in a Function's body.
virtual void VisitBinding_(const VarBindingNode *binding, const FunctionNode *val)
virtual BindingBlock VisitBindingBlock_(const BindingBlockNode *block)
Expr VisitExpr(const Expr &expr) override
ffi::Optional< Expr > LookupBinding(const Var &var)
Look up the value bound to a variable.
Expr VisitExpr_(const SeqExprNode *op) override
virtual BindingBlock VisitBindingBlock(const BindingBlock &block) override
Generic dispatcher for binding blocks.
virtual void VisitBinding_(const VarBindingNode *binding, const VarNode *val)
virtual void VisitBinding_(const VarBindingNode *binding, const TupleGetItemNode *val)
virtual Var VisitVarDef(const Var &var)
Generic dispatcher for rewriting the var definition site.
virtual void VisitBinding_(const VarBindingNode *binding, const ShapeExprNode *val)
virtual Var VisitVarDef_(const DataflowVarNode *var)
virtual void VisitBinding_(const VarBindingNode *binding, const ExternFuncNode *val)
Expr VisitExprPostOrder_(const T *op)
Post-order rewrite a node and normalize.
Definition expr_functor.h:684
virtual void VisitBinding_(const VarBindingNode *binding, const StringImmNode *val)
virtual void VisitBinding_(const VarBindingNode *binding, const DataflowVarNode *val)
virtual void VisitBinding(const Binding &binding)
Generic dispatcher for bindings.
virtual void VisitBinding_(const VarBindingNode *binding, const TupleNode *val)
Expr VisitExpr_(const DataflowVarNode *op) override
Expr VisitWithInnerScope(const Expr &body_expr)
Rewrite the expr with a new scope, used in the branches of IfExpr.
virtual void VisitBinding_(const VarBindingNode *binding, const SeqExprNode *val)
virtual void VisitBinding_(const MatchCastNode *binding)
BlockBuilder builder_
Internal block builder to emit bindings during rewriting.
Definition expr_functor.h:698
virtual Var VisitVarDef_(const VarNode *var)
ExprMutator(ffi::Optional< IRModule > mod=std::nullopt)
Definition expr_functor.h:569
virtual void VisitBinding_(const VarBindingNode *binding, const OpNode *val)
virtual void VisitBinding_(const VarBindingNode *binding)
virtual void VisitBinding_(const VarBindingNode *binding, const ExprNode *val)
A simple visitor wrapper around ExprFunctor. Recursively visit the content.
Definition expr_functor.h:265
void VisitExpr_(const prim::BroadcastNode *op) override
void VisitExpr_(const prim::BitwiseOrNode *op) override
virtual void VisitTypePrimExprField(const PrimExpr &expr)
void VisitExpr_(const prim::FloorModNode *op) override
void VisitExpr_(const GenericConstNode *op) override
void VisitExpr_(const prim::EQNode *op) override
void VisitExpr_(const prim::GTNode *op) override
void VisitExpr_(const GlobalVarNode *op) override
void VisitExprFallback_(const ExprNode *op) override
void VisitExpr_(const prim::FloorDivNode *op) override
void VisitExpr_(const StringImmNode *op) override
void VisitExpr_(const prim::BitwiseNotNode *op) override
void VisitExpr_(const prim::AddNode *op) override
void VisitExpr_(const TensorLoadNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const OpNode *val)
void VisitExpr_(const SeqExprNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const TupleNode *val)
void VisitExpr_(const CallNode *op) override
void VisitExpr_(const prim::ModNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const GlobalVarNode *val)
void VisitExpr_(const prim::BitwiseAndNode *op) override
void VisitExpr_(const TupleGetItemNode *op) override
void VisitExpr(const Expr &expr) override
Generic dispatcher for Expr.
void VisitExpr_(const prim::RampNode *op) override
virtual void VisitBindingBlock_(const DataflowBlockNode *block)
void VisitExpr_(const prim::AndNode *op) override
void VisitExpr_(const tvm::FloatImmNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const ExprNode *val)
virtual void VisitBinding_(const VarBindingNode *binding, const StringImmNode *val)
virtual void VisitBinding_(const VarBindingNode *binding, const ShapeExprNode *val)
void VisitExpr_(const prim::BitwiseXorNode *op) override
void VisitExpr_(const OpNode *op) override
void VisitExpr_(const prim::MinNode *op) override
virtual void VisitVarDef(const Var &var)
Generic dispatcher for visiting the var definition site.
void VisitExpr_(const tvm::IntImmNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const CallNode *val)
virtual void VisitBinding_(const VarBindingNode *binding, const GenericConstNode *val)
virtual void VisitBinding_(const VarBindingNode *binding, const DataflowVarNode *val)
virtual void VisitBinding_(const MatchCastNode *binding)
void VisitExpr_(const prim::NotNode *op) override
void VisitExpr_(const prim::ShuffleNode *op) override
void VisitExpr_(const prim::LShiftNode *op) override
void VisitExpr_(const IfExprNode *op) override
void VisitExpr_(const DataTypeImmNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const TupleGetItemNode *val)
void VisitExpr_(const FunctionNode *op) override
virtual void VisitLoc(const Location &loc)
void VisitExpr_(const VarNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const VarNode *val)
void VisitExpr_(const prim::LTNode *op) override
void VisitExpr_(const prim::NENode *op) override
void VisitExpr_(const ExternFuncNode *op) override
virtual void VisitBindingBlock(const BindingBlock &block)
Generic dispatcher for binding blocks.
void VisitExpr_(const prim::MulNode *op) override
void VisitExpr_(const DataflowVarNode *op) override
virtual void VisitVarDef_(const DataflowVarNode *var)
virtual void VisitBinding_(const VarBindingNode *binding, const DataTypeImmNode *val)
void VisitExpr_(const prim::SubNode *op) override
virtual void VisitVarDef_(const VarNode *var)
virtual void VisitBinding_(const VarBindingNode *binding, const SeqExprNode *val)
virtual void VisitExprDepTypeField(const Type &ty)
Visit ty may recursively contain Expr/PrimExpr.
void VisitExpr_(const ShapeExprNode *op) override
void VisitExpr_(const prim::CastNode *op) override
void VisitExpr_(const prim::MaxNode *op) override
void VisitExpr_(const prim::LENode *op) override
void VisitExpr_(const prim::DivNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const ExternFuncNode *val)
void VisitExpr_(const prim::RShiftNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const IfExprNode *val)
void VisitExpr_(const TupleNode *op) override
void VisitExpr_(const prim::SelectNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding)
void VisitExpr_(const prim::OrNode *op) override
virtual void VisitBinding(const Binding &binding)
Generic dispatcher for bindings.
virtual void VisitBinding_(const VarBindingNode *binding, const FunctionNode *val)
void VisitExpr_(const prim::GENode *op) override
virtual void VisitBindingBlock_(const BindingBlockNode *block)
The extern function, which can represent packed function.
Definition expr.h:456
Function type information.
Definition type.h:246
A Relax function.
Definition expr.h:388
Condition expression.
Definition expr.h:332
Runtime-match the value to the type.
Definition expr.h:143
A sequence of blocks followed by an expression.
Definition expr.h:263
A shape expression which allows users to construct a shape containing PrimExpr.
Definition expr.h:47
TypeMutator that mutates Relax type nodes.
Definition type_functor.h:141
A type visitor.
Definition type_functor.h:120
Definition expr.h:177
void PostOrderVisit(const Expr &node, std::function< void(const Expr &)> fvisit)
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition attr.h:23
Native object dispatch, visiting and mutation with structural fallback.
#define EXPR_FUNCTOR_DEFAULT
Definition expr_functor.h:55
#define RELAX_EXPR_FUNCTOR_DISPATCH(OP)
Definition expr_functor.h:66
#define EXPR_FUNCTOR_DISABLED
Definition expr_functor.h:60
Relax types, including the richer dependent Relax type nodes.
a <= b
Definition expr.h:495
TIR Function.
Functors and visitors for Relax type nodes.