tvm
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 
28 #include <tvm/ir/node_functor.h>
30 #include <tvm/relax/expr.h>
31 #include <tvm/relax/type.h>
32 #include <tvm/relax/type_functor.h>
33 #include <tvm/tirx/function.h>
34 
35 #include <unordered_map>
36 #include <utility>
37 namespace tvm {
38 namespace relax {
39 
51 template <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 RELAX_EXPR_FUNCTOR_DISPATCH(OP) \
61  vtable.template set_dispatch<OP>([](const ffi::ObjectRef& n, TSelf* self, Args... args) { \
62  return self->VisitExpr_(static_cast<const OP*>(n.get()), std::forward<Args>(args)...); \
63  });
64 
65 #define PY_EXPR_VISITOR_DEFAULT(N, PY_FUNC, DEFAULT_FUNC) \
66  { \
67  if (PY_FUNC != nullptr) \
68  PY_FUNC(N); \
69  else \
70  DEFAULT_FUNC; \
71  }
72 
73 #define PY_EXPR_MUTATOR_DEFAULT(N, PY_FUNC, DEFAULT_FUNC, RET_TYPE) \
74  { \
75  if (PY_FUNC != nullptr) { \
76  RET_TYPE ret = PY_FUNC(N).cast<RET_TYPE>(); \
77  return ret; \
78  } else { \
79  return DEFAULT_FUNC; \
80  } \
81  }
82 
83 #define PY_EXPR_VISITOR_DISPATCH(OP, PY_FUNC) \
84  vtable.template set_dispatch<OP>([](const ffi::ObjectRef& n, TSelf* self) { \
85  if (self->PY_FUNC != nullptr) \
86  self->PY_FUNC(n); \
87  else \
88  self->VisitExpr_(static_cast<const OP*>(n.get())); \
89  });
90 
91 #define PY_EXPR_MUTATOR_DISPATCH(OP, PY_FUNC) \
92  vtable.template set_dispatch<OP>([](const ffi::ObjectRef& n, TSelf* self) { \
93  if (self->PY_FUNC != nullptr) { \
94  Expr expr = self->PY_FUNC(n).cast<Expr>(); \
95  return expr; \
96  } else { \
97  return self->VisitExpr_(static_cast<const OP*>(n.get())); \
98  } \
99  });
100 
101 #define PY_EXPR_MUTATOR_VISIT_EXPR_POST_ORDER_DISPATCH(OP) \
102  post_order_vtable.template set_dispatch<OP>([](const ffi::ObjectRef& n, TSelf* self) { \
103  return self->VisitExprPostOrder_(static_cast<const OP*>(n.get())); \
104  });
105 
106 template <typename R, typename... Args>
107 class ExprFunctor<R(const Expr& n, Args...)> {
108  private:
109  using TSelf = ExprFunctor<R(const Expr& n, Args...)>;
110  using FType = tvm::NodeFunctor<R(const ffi::ObjectRef& n, TSelf* self, Args...)>;
111 
112  public:
114  using result_type = R;
116  virtual ~ExprFunctor() {}
123  R operator()(const Expr& n, Args... args) { return VisitExpr(n, std::forward<Args>(args)...); }
130  virtual R VisitExpr(const Expr& n, Args... args) {
131  TVM_FFI_ICHECK(n.defined())
132  << "Found null pointer node while traversing AST. The previous pass may "
133  "have generated invalid data.";
134  static FType vtable = InitVTable();
135  if (vtable.can_dispatch(n)) {
136  return vtable(n, this, std::forward<Args>(args)...);
137  }
138  return VisitExprFallback_(n.get(), std::forward<Args>(args)...);
139  }
140  // Functions that can be overriden by subclass
141  // NOTE: cross dialect calls are invoked through global var
142  // We do not expect inline PrimFunc to appear in relax IR.
143  virtual R VisitExpr_(const ConstantNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
144  virtual R VisitExpr_(const TupleNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
145  virtual R VisitExpr_(const VarNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
146  virtual R VisitExpr_(const DataflowVarNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
147  virtual R VisitExpr_(const ShapeExprNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
148  virtual R VisitExpr_(const ExternFuncNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
149  virtual R VisitExpr_(const GlobalVarNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
150  virtual R VisitExpr_(const FunctionNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
151  virtual R VisitExpr_(const CallNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
152  virtual R VisitExpr_(const SeqExprNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
153  virtual R VisitExpr_(const IfNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
154  virtual R VisitExpr_(const OpNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
155  virtual R VisitExpr_(const TupleGetItemNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
156  virtual R VisitExprFallback_(const ExprNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
157  virtual R VisitExpr_(const StringImmNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
158  virtual R VisitExpr_(const DataTypeImmNode* op, Args... args) EXPR_FUNCTOR_DEFAULT;
159  virtual R VisitExprDefault_(const ffi::Object* op, Args...) {
160  TVM_FFI_THROW(InternalError) << "Do not have a default for " << op->GetTypeKey();
161  throw;
162  }
163 
164  private:
165  // initialize the vtable.
166  static FType InitVTable() {
167  FType vtable;
168  // Set dispatch
184  vtable.Finalize();
185  return vtable;
186  }
187 };
188 
193 class ExprVisitor : public ExprFunctor<void(const Expr&)> {
194  public:
199  void VisitExpr(const Expr& expr) override;
200  // specific leaf level visitor functions
201  void VisitExpr_(const ConstantNode* op) override;
202  void VisitExpr_(const TupleNode* op) override;
203  void VisitExpr_(const VarNode* op) override;
204  void VisitExpr_(const DataflowVarNode* op) override;
205  void VisitExpr_(const ShapeExprNode* op) override;
206  void VisitExpr_(const ExternFuncNode* op) override;
207  void VisitExpr_(const GlobalVarNode* op) override;
208  void VisitExpr_(const FunctionNode* op) override;
209  void VisitExpr_(const CallNode* op) override;
210  void VisitExpr_(const SeqExprNode* op) override;
211  void VisitExpr_(const IfNode* op) override;
212  void VisitExpr_(const OpNode* op) override;
213  void VisitExpr_(const TupleGetItemNode* op) override;
214  void VisitExprFallback_(const ExprNode* op) override;
215  void VisitExpr_(const StringImmNode* op) override;
216  void VisitExpr_(const DataTypeImmNode* op) override;
217 
222  virtual void VisitBinding(const Binding& binding);
223  // specific leaf level visitor functions
224  virtual void VisitBinding_(const VarBindingNode* binding);
225  virtual void VisitBinding_(const MatchCastNode* binding);
226  // second level dispatching based on binding value type.
227  // these dispatching functions get called from first-level dispatch on VarBinding
228  virtual void VisitBinding_(const VarBindingNode* binding, const ConstantNode* val);
229  virtual void VisitBinding_(const VarBindingNode* binding, const TupleNode* val);
230  virtual void VisitBinding_(const VarBindingNode* binding, const VarNode* val);
231  virtual void VisitBinding_(const VarBindingNode* binding, const DataflowVarNode* val);
232  virtual void VisitBinding_(const VarBindingNode* binding, const ShapeExprNode* val);
233  virtual void VisitBinding_(const VarBindingNode* binding, const ExternFuncNode* val);
234  virtual void VisitBinding_(const VarBindingNode* binding, const GlobalVarNode* val);
235  virtual void VisitBinding_(const VarBindingNode* binding, const FunctionNode* val);
236  virtual void VisitBinding_(const VarBindingNode* binding, const CallNode* val);
237  virtual void VisitBinding_(const VarBindingNode* binding, const SeqExprNode* val);
238  virtual void VisitBinding_(const VarBindingNode* binding, const IfNode* val);
239  virtual void VisitBinding_(const VarBindingNode* binding, const OpNode* val);
240  virtual void VisitBinding_(const VarBindingNode* binding, const TupleGetItemNode* val);
241  virtual void VisitBinding_(const VarBindingNode* binding, const ExprNode* val);
242  virtual void VisitBinding_(const VarBindingNode* binding, const StringImmNode* val);
243  virtual void VisitBinding_(const VarBindingNode* binding, const DataTypeImmNode* val);
248  virtual void VisitBindingBlock(const BindingBlock& block);
249  // specific leaf level visitor functions
250  virtual void VisitBindingBlock_(const BindingBlockNode* block);
251  virtual void VisitBindingBlock_(const DataflowBlockNode* block);
252 
258  virtual void VisitVarDef(const Var& var);
259 
274  virtual void VisitExprDepTypeField(const Type& ty);
275 
276  // specific leaf level visitor functions
277  virtual void VisitVarDef_(const VarNode* var);
278  virtual void VisitVarDef_(const DataflowVarNode* var);
279 
280  virtual void VisitSpan(const Span& span);
281  virtual void VisitTypePrimExprField(const PrimExpr& expr);
282 
283  private:
284  using TSelf = ExprVisitor;
285  using VisitBindingVTable = tvm::NodeFunctor<void(const ffi::ObjectRef& n, ExprVisitor* self,
286  const VarBindingNode* binding)>;
287  // initialize the vtable.
288  static VisitBindingVTable InitVisitBindingVTable();
298  class DefaultTypeFieldVisitor : public TypeVisitor {
299  public:
300  explicit DefaultTypeFieldVisitor(ExprVisitor* parent);
301 
302  // Override defaults in type visitor.
303  void VisitTypeExprField(const Expr& expr) final;
304  void VisitTypeExprField(const PrimExpr& expr) final;
305  void VisitType_(const FuncTypeNode* op) final;
306 
307  private:
308  ExprVisitor* parent_;
309  };
310  // This visitor is not visible to child classes and only
311  // used to supported default visiting behavior.
312  DefaultTypeFieldVisitor default_tyfield_visitor_{this};
313 };
314 
315 void PostOrderVisit(const Expr& node, std::function<void(const Expr&)> fvisit);
316 
325 class ExprMutatorBase : public ExprFunctor<Expr(const Expr&)> {
326  public:
327  Expr VisitExpr(const Expr& expr) override;
328  Expr VisitExpr_(const ConstantNode* op) override;
329  Expr VisitExpr_(const TupleNode* op) override;
330  Expr VisitExpr_(const VarNode* op) override;
331  Expr VisitExpr_(const DataflowVarNode* op) override;
332  Expr VisitExpr_(const ShapeExprNode* op) override;
333  Expr VisitExpr_(const ExternFuncNode* op) override;
334  Expr VisitExpr_(const GlobalVarNode* op) override;
335  Expr VisitExpr_(const FunctionNode* op) override;
336  Expr VisitExpr_(const CallNode* op) override;
337  Expr VisitExpr_(const SeqExprNode* op) override;
338  Expr VisitExpr_(const IfNode* op) override;
339  Expr VisitExpr_(const OpNode* op) override;
340  Expr VisitExpr_(const TupleGetItemNode* op) override;
341  Expr VisitExprFallback_(const ExprNode* op) override;
342  Expr VisitExpr_(const StringImmNode* op) override;
343  Expr VisitExpr_(const DataTypeImmNode* op) override;
344 
351 
358 
374  virtual Type VisitExprDepTypeField(const Type& ty);
375 
376  protected:
385  bool VisitAndCheckTypeFieldUnchanged(const ffi::ObjectRef& ty) {
386  if (const TypeNode* ty_node = ty.as<TypeNode>()) {
387  Type type = ffi::GetRef<Type>(ty_node);
388  return type.IsMissing() || this->VisitExprDepTypeField(type).same_as(ty);
389  } else {
390  return true;
391  }
392  }
393 
394  private:
402  class DefaultTypeFieldMutator : public TypeMutator {
403  public:
404  explicit DefaultTypeFieldMutator(ExprMutatorBase* parent);
405 
406  // Override defaults in type visitor.
407  Expr VisitTypeExprField(const Expr& expr) final;
408  PrimExpr VisitTypeExprField(const PrimExpr& expr) final;
409  Type VisitType_(const FuncTypeNode* op) final;
410 
411  private:
412  ExprMutatorBase* parent_;
413  };
414  // This visitor is not visible to child classes and only
415  // used to supported default visiting behavior.
416  DefaultTypeFieldMutator default_tyfield_mutator_{this};
417 };
418 
426 class ExprMutator : public ExprMutatorBase {
427  public:
429 
430  ExprMutator(ffi::Optional<IRModule> mod = std::nullopt) { builder_ = BlockBuilder::Create(mod); }
431  Expr VisitExpr(const Expr& expr) override;
432  Expr VisitExpr_(const VarNode* op) override;
433  Expr VisitExpr_(const DataflowVarNode* op) override;
434  Expr VisitExpr_(const FunctionNode* op) override;
435  Expr VisitExpr_(const SeqExprNode* op) override;
436  Expr VisitExpr_(const IfNode* op) override;
437 
442  virtual void VisitBinding(const Binding& binding);
443  // specific leaf level visitor functions
444  virtual void VisitBinding_(const VarBindingNode* binding);
445  virtual void VisitBinding_(const MatchCastNode* binding);
446  // second level dispatching based on binding value type.
447  // these dispatching functions get called from first-level dispatch on VarBinding
448  virtual void VisitBinding_(const VarBindingNode* binding, const ConstantNode* val);
449  virtual void VisitBinding_(const VarBindingNode* binding, const TupleNode* val);
450  virtual void VisitBinding_(const VarBindingNode* binding, const VarNode* val);
451  virtual void VisitBinding_(const VarBindingNode* binding, const DataflowVarNode* val);
452  virtual void VisitBinding_(const VarBindingNode* binding, const ShapeExprNode* val);
453  virtual void VisitBinding_(const VarBindingNode* binding, const ExternFuncNode* val);
454  virtual void VisitBinding_(const VarBindingNode* binding, const GlobalVarNode* val);
455  virtual void VisitBinding_(const VarBindingNode* binding, const FunctionNode* val);
456  virtual void VisitBinding_(const VarBindingNode* binding, const CallNode* val);
457  virtual void VisitBinding_(const VarBindingNode* binding, const SeqExprNode* val);
458  virtual void VisitBinding_(const VarBindingNode* binding, const IfNode* val);
459  virtual void VisitBinding_(const VarBindingNode* binding, const OpNode* val);
460  virtual void VisitBinding_(const VarBindingNode* binding, const TupleGetItemNode* val);
461  virtual void VisitBinding_(const VarBindingNode* binding, const ExprNode* val);
462  virtual void VisitBinding_(const VarBindingNode* binding, const StringImmNode* val);
463  virtual void VisitBinding_(const VarBindingNode* binding, const DataTypeImmNode* val);
469  virtual BindingBlock VisitBindingBlock(const BindingBlock& block) override; // NOLINT(*)
470  // specific leaf level visitor functions
473 
480  virtual Var VisitVarDef(const Var& var);
481  // specific leaf level visitor functions
482  virtual Var VisitVarDef_(const VarNode* var);
484 
485  protected:
497  void ReEmitBinding(const VarBindingNode* binding, Expr new_value);
498 
511  Expr VisitWithNewScope(const Expr& body_expr,
512  ffi::Optional<ffi::Array<Var>> params = std::nullopt);
513 
528  Expr VisitWithInnerScope(const Expr& body_expr);
529 
536  ffi::Optional<Expr> LookupBinding(const Var& var);
537 
544  template <typename T>
545  Expr VisitExprPostOrder_(const T* op) {
546  return builder_->Normalize(ExprMutator::VisitExpr_(op));
547  }
548 
557 
560 
562  std::unordered_map<Var, Var, ffi::ObjectPtrHash, ffi::ObjectPtrEqual> var_remap_;
563 
564  private:
565  using TSelf = ExprMutator;
566  using VisitBindingVTable = tvm::NodeFunctor<void(const ffi::ObjectRef& n, ExprMutator* self,
567  const VarBindingNode* binding)>;
568  // initialize the vtable.
569  static VisitBindingVTable InitVisitBindingVTable();
570 };
571 
572 } // namespace relax
573 } // namespace tvm
574 #endif // TVM_RELAX_EXPR_FUNCTOR_H_
The utility for constructing Relax binding blocks.
Call corresponds to callable invocation.
Definition: expr.h:314
Base type of all the expressions.
Definition: base_expr.h:276
Managed reference to ExprNode.
Definition: base_expr.h:311
Global variable that lives in the top-level module.
Definition: expr.h:271
A dynamically dispatched functor on the type of the first argument.
Definition: node_functor.h:62
Primitive Op(builtin intrinsics)
Definition: op.h:94
Typed reference/view over any Expr whose ExprNode::ty is PrimType.
Definition: base_expr.h:354
Definition: source_map.h:111
Type is the base type of all types.
Definition: base_expr.h:52
Managed reference to TypeNode.
Definition: base_expr.h:77
bool IsMissing() const
Definition: expr.h:386
Definition: expr.h:403
Definition: expr.h:307
Definition: block_builder.h:257
static BlockBuilder Create(ffi::Optional< IRModule > ctx_mod)
Create a BlockBuilder.
Constant tensor.
Definition: expr.h:189
Represent a data type constant.
Definition: expr.h:258
Definition: expr.h:411
A sub-type of the variable node used to mark dataflow variables from normal visible "function local" ...
Definition: expr.h:165
virtual R VisitExpr_(const TupleNode *op, Args... args)
Definition: expr_functor.h:144
virtual R VisitExpr_(const DataTypeImmNode *op, Args... args)
Definition: expr_functor.h:158
virtual R VisitExpr(const Expr &n, Args... args)
The functor call.
Definition: expr_functor.h:130
virtual R VisitExpr_(const ShapeExprNode *op, Args... args)
Definition: expr_functor.h:147
virtual R VisitExpr_(const SeqExprNode *op, Args... args)
Definition: expr_functor.h:152
virtual R VisitExpr_(const FunctionNode *op, Args... args)
Definition: expr_functor.h:150
virtual R VisitExpr_(const OpNode *op, Args... args)
Definition: expr_functor.h:154
R result_type
the result type of this functor
Definition: expr_functor.h:114
virtual R VisitExpr_(const IfNode *op, Args... args)
Definition: expr_functor.h:153
virtual R VisitExpr_(const ExternFuncNode *op, Args... args)
Definition: expr_functor.h:148
virtual R VisitExpr_(const GlobalVarNode *op, Args... args)
Definition: expr_functor.h:149
virtual R VisitExpr_(const DataflowVarNode *op, Args... args)
Definition: expr_functor.h:146
virtual R VisitExpr_(const StringImmNode *op, Args... args)
Definition: expr_functor.h:157
R operator()(const Expr &n, Args... args)
Same as call.
Definition: expr_functor.h:123
virtual R VisitExpr_(const VarNode *op, Args... args)
Definition: expr_functor.h:145
virtual R VisitExprFallback_(const ExprNode *op, Args... args)
Definition: expr_functor.h:156
virtual R VisitExprDefault_(const ffi::Object *op, Args...)
Definition: expr_functor.h:159
virtual R VisitExpr_(const CallNode *op, Args... args)
Definition: expr_functor.h:151
virtual R VisitExpr_(const TupleGetItemNode *op, Args... args)
Definition: expr_functor.h:155
virtual R VisitExpr_(const ConstantNode *op, Args... args)
Definition: expr_functor.h:143
virtual ~ExprFunctor()
virtual destructor
Definition: expr_functor.h:116
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:325
Expr VisitExpr_(const TupleNode *op) override
Expr VisitExpr_(const ConstantNode *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 GlobalVarNode *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 ExternFuncNode *op) override
Expr VisitExpr_(const DataTypeImmNode *op) override
Expr VisitExpr_(const CallNode *op) override
Expr VisitExpr_(const OpNode *op) override
Expr VisitExpr_(const IfNode *op) override
Expr VisitExpr_(const StringImmNode *op) override
Expr VisitExprFallback_(const ExprNode *op) override
Expr VisitExpr_(const TupleGetItemNode *op) override
Expr VisitExpr(const Expr &expr) override
Expr VisitExpr_(const FunctionNode *op) override
virtual PrimExpr VisitTypePrimExprField(const PrimExpr &expr)
Used to visit the PrimExpr inside of expressions.
bool VisitAndCheckTypeFieldUnchanged(const ffi::ObjectRef &ty)
Check whether VisitExprDepTypeField change ty.
Definition: expr_functor.h:385
Expr VisitExpr_(const DataflowVarNode *op) override
A mutator works in normal form.
Definition: expr_functor.h:426
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:562
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 GlobalVarNode *val)
virtual void VisitBinding_(const VarBindingNode *binding, const CallNode *val)
Expr VisitExpr_(const ConstantNode *op) override
Expr VisitExpr_(const FunctionNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const FunctionNode *val)
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 BindingBlock VisitBindingBlock_(const BindingBlockNode *block)
ffi::Optional< Expr > LookupBinding(const Var &var)
Look up the value bound to a variable.
Expr VisitExpr(const Expr &expr) override
Expr VisitExpr_(const IfNode *op) override
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)
virtual void VisitBinding_(const VarBindingNode *binding, const ConstantNode *val)
Expr VisitExprPostOrder_(const T *op)
Post-order rewrite a node and normalize.
Definition: expr_functor.h:545
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 If.
virtual void VisitBinding_(const VarBindingNode *binding, const SeqExprNode *val)
virtual void VisitBinding_(const MatchCastNode *binding)
virtual void VisitBinding_(const VarBindingNode *binding, const IfNode *val)
BlockBuilder builder_
Internal block builder to emit bindings during rewriting.
Definition: expr_functor.h:559
virtual Var VisitVarDef_(const VarNode *var)
ExprMutator(ffi::Optional< IRModule > mod=std::nullopt)
Definition: expr_functor.h:430
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:193
virtual void VisitTypePrimExprField(const PrimExpr &expr)
void VisitExpr_(const GlobalVarNode *op) override
void VisitExprFallback_(const ExprNode *op) override
void VisitExpr_(const StringImmNode *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 IfNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const GlobalVarNode *val)
void VisitExpr_(const TupleGetItemNode *op) override
void VisitExpr(const Expr &expr) override
Generic dispatcher for Expr.
virtual void VisitBindingBlock_(const DataflowBlockNode *block)
virtual void VisitSpan(const Span &span)
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 OpNode *op) override
virtual void VisitVarDef(const Var &var)
Generic dispatcher for visiting the var definition site.
virtual void VisitBinding_(const VarBindingNode *binding, const IfNode *val)
virtual void VisitBinding_(const VarBindingNode *binding, const CallNode *val)
virtual void VisitBinding_(const VarBindingNode *binding, const DataflowVarNode *val)
virtual void VisitBinding_(const MatchCastNode *binding)
void VisitExpr_(const DataTypeImmNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const TupleGetItemNode *val)
void VisitExpr_(const FunctionNode *op) override
void VisitExpr_(const VarNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const VarNode *val)
virtual void VisitBinding_(const VarBindingNode *binding, const ConstantNode *val)
void VisitExpr_(const ExternFuncNode *op) override
virtual void VisitBindingBlock(const BindingBlock &block)
Generic dispatcher for binding blocks.
void VisitExpr_(const DataflowVarNode *op) override
virtual void VisitVarDef_(const DataflowVarNode *var)
virtual void VisitBinding_(const VarBindingNode *binding, const DataTypeImmNode *val)
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
virtual void VisitBinding_(const VarBindingNode *binding, const ExternFuncNode *val)
void VisitExpr_(const TupleNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding)
virtual void VisitBinding(const Binding &binding)
Generic dispatcher for bindings.
void VisitExpr_(const ConstantNode *op) override
virtual void VisitBinding_(const VarBindingNode *binding, const FunctionNode *val)
virtual void VisitBindingBlock_(const BindingBlockNode *block)
The extern function, which can represent packed function.
Definition: expr.h:636
Function type information.
Definition: type.h:266
A Relax function.
Definition: expr.h:543
Condition expression.
Definition: expr.h:496
Runtime-match the value to the type.
Definition: expr.h:330
A sequence of blocks followed by an expression.
Definition: expr.h:432
A shape expression which allows users to construct a shape containing PrimExpr.
Definition: expr.h:116
Represent a string literal constant.
Definition: expr.h:226
Get index-th field out of a tuple.
Definition: expr.h:84
Tuple container.
Definition: expr.h:40
TypeMutator that mutates Relax type nodes.
Definition: type_functor.h:136
A type visitor.
Definition: type_functor.h:117
Definition: expr.h:359
The variable class for all Relax bindings.
Definition: expr.h:136
Definition: expr.h:155
void PostOrderVisit(const Expr &node, std::function< void(const Expr &)> fvisit)
PrimVar var(std::string name_hint, PrimType t=PrimType::Int(32))
Construct a new Var expression.
tvm::PrimExpr mod(const tvm::PrimExpr &a, const tvm::PrimExpr &b)
Definition: broadcast.h:310
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition: analyzer.h:40
Defines the Functor data structures.
#define EXPR_FUNCTOR_DEFAULT
Definition: expr_functor.h:55
#define RELAX_EXPR_FUNCTOR_DISPATCH(OP)
Definition: expr_functor.h:60
Relax types, including the richer dependent Relax type nodes.
TIR Function.
Functors and visitors for Relax type nodes.