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 */
23#ifndef TVM_IR_EXPR_FUNCTOR_H_
24#define TVM_IR_EXPR_FUNCTOR_H_
25#include <tvm/ir/expr.h>
27#include <tvm/ir/op.h>
28#include <tvm/ir/prim/expr.h>
30
31namespace tvm {
32
43template <typename FType>
45
46template <typename R, typename... Args>
47class ExprFunctor<R(const Expr&, Args...)> {
48 private:
49 using TSelf = ExprFunctor<R(const Expr&, Args...)>;
50
51 public:
53 using result_type = R;
55 ExprFunctor() : ExprFunctor(GlobalVTable()) {}
62 TVM_FFI_INLINE R operator()(const Expr& node, Args... args) {
63 return Dispatch(node, std::forward<Args>(args)...);
64 }
71 TVM_FFI_INLINE virtual R Dispatch(const Expr& node, Args... args) {
72 TVM_FFI_ICHECK(node.defined()) << "Cannot dispatch a null expression";
73 return (*vtable_)(node, this, std::forward<Args>(args)...);
74 }
75
76 virtual R Dispatch_(const LambdaExprNode* node, Args... args) {
77 return DispatchDefault_(node, std::forward<Args>(args)...);
78 }
79 virtual R Dispatch_(const OpaqueExprNode* node, Args... args) {
80 return DispatchDefault_(node, std::forward<Args>(args)...);
81 }
82 virtual R Dispatch_(const TupleNode* node, Args... args) {
83 return DispatchDefault_(node, std::forward<Args>(args)...);
84 }
85 virtual R Dispatch_(const TupleGetItemNode* node, Args... args) {
86 return DispatchDefault_(node, std::forward<Args>(args)...);
87 }
88 virtual R Dispatch_(const TensorRegionNode* node, Args... args) {
89 return DispatchDefault_(node, std::forward<Args>(args)...);
90 }
91 virtual R Dispatch_(const TensorLoadNode* node, Args... args) {
92 return DispatchDefault_(node, std::forward<Args>(args)...);
93 }
94 virtual R Dispatch_(const VarNode* node, Args... args) {
95 return DispatchDefault_(node, std::forward<Args>(args)...);
96 }
97 virtual R Dispatch_(const GlobalVarNode* node, Args... args) {
98 return DispatchDefault_(node, std::forward<Args>(args)...);
99 }
100 virtual R Dispatch_(const CallNode* node, Args... args) {
101 return DispatchDefault_(node, std::forward<Args>(args)...);
102 }
103 virtual R Dispatch_(const GenericConstNode* node, Args... args) {
104 return DispatchDefault_(node, std::forward<Args>(args)...);
105 }
106 virtual R Dispatch_(const DataTypeImmNode* node, Args... args) {
107 return DispatchDefault_(node, std::forward<Args>(args)...);
108 }
109 virtual R Dispatch_(const IntImmNode* node, Args... args) {
110 return DispatchDefault_(node, std::forward<Args>(args)...);
111 }
112 virtual R Dispatch_(const FloatImmNode* node, Args... args) {
113 return DispatchDefault_(node, std::forward<Args>(args)...);
114 }
115 virtual R Dispatch_(const OpNode* node, Args... args) {
116 return DispatchDefault_(node, std::forward<Args>(args)...);
117 }
118 virtual R Dispatch_(const StringImmNode* node, Args... args) {
119 return DispatchDefault_(node, std::forward<Args>(args)...);
120 }
121 virtual R Dispatch_(const prim::CastNode* node, Args... args) {
122 return DispatchDefault_(node, std::forward<Args>(args)...);
123 }
124 virtual R Dispatch_(const prim::AddNode* node, Args... args) {
125 return DispatchDefault_(node, std::forward<Args>(args)...);
126 }
127 virtual R Dispatch_(const prim::LShiftNode* node, Args... args) {
128 return DispatchDefault_(node, std::forward<Args>(args)...);
129 }
130 virtual R Dispatch_(const prim::RShiftNode* node, Args... args) {
131 return DispatchDefault_(node, std::forward<Args>(args)...);
132 }
133 virtual R Dispatch_(const prim::BitwiseAndNode* node, Args... args) {
134 return DispatchDefault_(node, std::forward<Args>(args)...);
135 }
136 virtual R Dispatch_(const prim::BitwiseOrNode* node, Args... args) {
137 return DispatchDefault_(node, std::forward<Args>(args)...);
138 }
139 virtual R Dispatch_(const prim::BitwiseXorNode* node, Args... args) {
140 return DispatchDefault_(node, std::forward<Args>(args)...);
141 }
142 virtual R Dispatch_(const prim::BitwiseNotNode* node, Args... args) {
143 return DispatchDefault_(node, std::forward<Args>(args)...);
144 }
145 virtual R Dispatch_(const prim::SubNode* node, Args... args) {
146 return DispatchDefault_(node, std::forward<Args>(args)...);
147 }
148 virtual R Dispatch_(const prim::MulNode* node, Args... args) {
149 return DispatchDefault_(node, std::forward<Args>(args)...);
150 }
151 virtual R Dispatch_(const prim::DivNode* node, Args... args) {
152 return DispatchDefault_(node, std::forward<Args>(args)...);
153 }
154 virtual R Dispatch_(const prim::ModNode* node, Args... args) {
155 return DispatchDefault_(node, std::forward<Args>(args)...);
156 }
157 virtual R Dispatch_(const prim::FloorDivNode* node, Args... args) {
158 return DispatchDefault_(node, std::forward<Args>(args)...);
159 }
160 virtual R Dispatch_(const prim::FloorModNode* node, Args... args) {
161 return DispatchDefault_(node, std::forward<Args>(args)...);
162 }
163 virtual R Dispatch_(const prim::MinNode* node, Args... args) {
164 return DispatchDefault_(node, std::forward<Args>(args)...);
165 }
166 virtual R Dispatch_(const prim::MaxNode* node, Args... args) {
167 return DispatchDefault_(node, std::forward<Args>(args)...);
168 }
169 virtual R Dispatch_(const prim::EQNode* node, Args... args) {
170 return DispatchDefault_(node, std::forward<Args>(args)...);
171 }
172 virtual R Dispatch_(const prim::NENode* node, Args... args) {
173 return DispatchDefault_(node, std::forward<Args>(args)...);
174 }
175 virtual R Dispatch_(const prim::LTNode* node, Args... args) {
176 return DispatchDefault_(node, std::forward<Args>(args)...);
177 }
178 virtual R Dispatch_(const prim::LENode* node, Args... args) {
179 return DispatchDefault_(node, std::forward<Args>(args)...);
180 }
181 virtual R Dispatch_(const prim::GTNode* node, Args... args) {
182 return DispatchDefault_(node, std::forward<Args>(args)...);
183 }
184 virtual R Dispatch_(const prim::GENode* node, Args... args) {
185 return DispatchDefault_(node, std::forward<Args>(args)...);
186 }
187 virtual R Dispatch_(const prim::AndNode* node, Args... args) {
188 return DispatchDefault_(node, std::forward<Args>(args)...);
189 }
190 virtual R Dispatch_(const prim::OrNode* node, Args... args) {
191 return DispatchDefault_(node, std::forward<Args>(args)...);
192 }
193 virtual R Dispatch_(const prim::NotNode* node, Args... args) {
194 return DispatchDefault_(node, std::forward<Args>(args)...);
195 }
196 virtual R Dispatch_(const prim::SelectNode* node, Args... args) {
197 return DispatchDefault_(node, std::forward<Args>(args)...);
198 }
199 virtual R Dispatch_(const prim::LetNode* node, Args... args) {
200 return DispatchDefault_(node, std::forward<Args>(args)...);
201 }
202 virtual R Dispatch_(const prim::RampNode* node, Args... args) {
203 return DispatchDefault_(node, std::forward<Args>(args)...);
204 }
205 virtual R Dispatch_(const prim::BroadcastNode* node, Args... args) {
206 return DispatchDefault_(node, std::forward<Args>(args)...);
207 }
208 virtual R Dispatch_(const prim::ShuffleNode* node, Args... args) {
209 return DispatchDefault_(node, std::forward<Args>(args)...);
210 }
211
218 virtual R DispatchDefault_(const ffi::Object* node, Args... args) {
219 TVM_FFI_THROW(InternalError) << "Do not have a default for " << node->GetTypeKey();
220 TVM_FFI_UNREACHABLE();
221 }
222
223 protected:
225 using VTable = ObjectFunctor<R(const ffi::ObjectRef&, TSelf*, Args...)>;
230 explicit ExprFunctor(const VTable* vtable) : vtable_(vtable) {}
235 static void InitVTable(VTable* vtable) {
236 SetDispatch<TSelf, LambdaExprNode>(vtable);
237 SetDispatch<TSelf, OpaqueExprNode>(vtable);
238 SetDispatch<TSelf, TupleNode>(vtable);
239 SetDispatch<TSelf, TupleGetItemNode>(vtable);
240 SetDispatch<TSelf, TensorLoadNode>(vtable);
241 SetDispatch<TSelf, TensorRegionNode>(vtable);
242 SetDispatch<TSelf, VarNode>(vtable);
243 SetDispatch<TSelf, GlobalVarNode>(vtable);
244 SetDispatch<TSelf, CallNode>(vtable);
245 SetDispatch<TSelf, GenericConstNode>(vtable);
246 SetDispatch<TSelf, DataTypeImmNode>(vtable);
247 SetDispatch<TSelf, IntImmNode>(vtable);
248 SetDispatch<TSelf, FloatImmNode>(vtable);
249 SetDispatch<TSelf, OpNode>(vtable);
250 SetDispatch<TSelf, StringImmNode>(vtable);
251 SetDispatch<TSelf, prim::CastNode>(vtable);
252 SetDispatch<TSelf, prim::AddNode>(vtable);
253 SetDispatch<TSelf, prim::LShiftNode>(vtable);
254 SetDispatch<TSelf, prim::RShiftNode>(vtable);
255 SetDispatch<TSelf, prim::BitwiseAndNode>(vtable);
256 SetDispatch<TSelf, prim::BitwiseOrNode>(vtable);
257 SetDispatch<TSelf, prim::BitwiseXorNode>(vtable);
258 SetDispatch<TSelf, prim::BitwiseNotNode>(vtable);
259 SetDispatch<TSelf, prim::SubNode>(vtable);
260 SetDispatch<TSelf, prim::MulNode>(vtable);
261 SetDispatch<TSelf, prim::DivNode>(vtable);
262 SetDispatch<TSelf, prim::ModNode>(vtable);
263 SetDispatch<TSelf, prim::FloorDivNode>(vtable);
264 SetDispatch<TSelf, prim::FloorModNode>(vtable);
265 SetDispatch<TSelf, prim::MinNode>(vtable);
266 SetDispatch<TSelf, prim::MaxNode>(vtable);
267 SetDispatch<TSelf, prim::EQNode>(vtable);
268 SetDispatch<TSelf, prim::NENode>(vtable);
269 SetDispatch<TSelf, prim::LTNode>(vtable);
270 SetDispatch<TSelf, prim::LENode>(vtable);
271 SetDispatch<TSelf, prim::GTNode>(vtable);
272 SetDispatch<TSelf, prim::GENode>(vtable);
273 SetDispatch<TSelf, prim::AndNode>(vtable);
274 SetDispatch<TSelf, prim::OrNode>(vtable);
275 SetDispatch<TSelf, prim::NotNode>(vtable);
276 SetDispatch<TSelf, prim::SelectNode>(vtable);
277 SetDispatch<TSelf, prim::LetNode>(vtable);
278 SetDispatch<TSelf, prim::RampNode>(vtable);
279 SetDispatch<TSelf, prim::BroadcastNode>(vtable);
280 SetDispatch<TSelf, prim::ShuffleNode>(vtable);
281 }
288 template <typename Self, typename Node>
289 static void SetDispatch(VTable* vtable) {
290 vtable->template SetDispatch<Node>(
291 [](const ffi::ObjectRef& node, TSelf* self, Args... args) -> R {
292 return static_cast<Self*>(self)->Dispatch_(static_cast<const Node*>(node.get()),
293 std::forward<Args>(args)...);
294 });
295 }
296
297 private:
298 static const VTable* GlobalVTable() {
299 static const VTable table = [] {
300 VTable table;
301 InitVTable(&table);
302 table.Finalize();
303 return table;
304 }();
305 return &table;
306 }
307 const VTable* vtable_;
308};
309
337 public:
340
341 using ObjectVisitor::Visit;
342
343 // Override existing hooks directly. Extra types need a fresh inherited table.
344 // Hooks borrow the node and return None or an owning interrupt, and throw on failure.
345 virtual ffi::Optional<VisitInterrupt> Visit_(const OpaqueExprNode* node);
346 virtual ffi::Optional<VisitInterrupt> Visit_(const TupleNode* node);
347 virtual ffi::Optional<VisitInterrupt> Visit_(const TupleGetItemNode* node);
348 virtual ffi::Optional<VisitInterrupt> Visit_(const TensorLoadNode* node);
349 virtual ffi::Optional<VisitInterrupt> Visit_(const TensorRegionNode* node);
350 virtual ffi::Optional<VisitInterrupt> Visit_(const VarNode* node);
351 virtual ffi::Optional<VisitInterrupt> Visit_(const GlobalVarNode* node);
352 virtual ffi::Optional<VisitInterrupt> Visit_(const CallNode* node);
353 virtual ffi::Optional<VisitInterrupt> Visit_(const GenericConstNode* node);
354 virtual ffi::Optional<VisitInterrupt> Visit_(const DataTypeImmNode* node);
355 virtual ffi::Optional<VisitInterrupt> Visit_(const IntImmNode* node);
356 virtual ffi::Optional<VisitInterrupt> Visit_(const FloatImmNode* node);
357 virtual ffi::Optional<VisitInterrupt> Visit_(const OpNode* node);
358 virtual ffi::Optional<VisitInterrupt> Visit_(const StringImmNode* node);
359 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::CastNode* node);
360 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::AddNode* node);
361 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::LShiftNode* node);
362 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::RShiftNode* node);
363 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::BitwiseAndNode* node);
364 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::BitwiseOrNode* node);
365 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::BitwiseXorNode* node);
366 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::BitwiseNotNode* node);
367 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::SubNode* node);
368 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::MulNode* node);
369 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::DivNode* node);
370 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::ModNode* node);
371 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::FloorDivNode* node);
372 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::FloorModNode* node);
373 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::MinNode* node);
374 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::MaxNode* node);
375 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::EQNode* node);
376 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::NENode* node);
377 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::LTNode* node);
378 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::LENode* node);
379 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::GTNode* node);
380 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::GENode* node);
381 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::AndNode* node);
382 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::OrNode* node);
383 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::NotNode* node);
384 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::SelectNode* node);
385 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::LetNode* node);
386 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::RampNode* node);
387 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::BroadcastNode* node);
388 virtual ffi::Optional<VisitInterrupt> Visit_(const prim::ShuffleNode* node);
389
390 protected:
395 explicit ExprVisitor(const VTable* vtable) : ObjectVisitor(vtable) {}
400 static void InitVTable(VTable* vtable);
401};
402
432 public:
435
436 using ObjectMutator::Mutate;
437
446 TVM_FFI_INLINE UnchangedOr<PrimExpr> Mutate(const PrimExpr& expr,
447 InplaceMode inplace_mode = InplaceMode::kDisallow) {
448 return ffi::details::UnchangedOrUnsafe::MoveFromTVMFFIAny<PrimExpr>(
449 ffi::details::UnchangedOrUnsafe::MoveToTVMFFIAny(Mutate(ffi::AnyView(expr), inplace_mode)));
450 }
451
460 TVM_FFI_INLINE UnchangedOr<Expr> Mutate(const Expr& expr,
461 InplaceMode inplace_mode = InplaceMode::kDisallow) {
462 return ffi::details::UnchangedOrUnsafe::MoveFromTVMFFIAny<Expr>(
463 ffi::details::UnchangedOrUnsafe::MoveToTVMFFIAny(Mutate(ffi::AnyView(expr), inplace_mode)));
464 }
465
466 // A downstream class overrides any existing hook without rebuilding the table.
467 // Extra node types use a fresh inherited table and SetDispatch<Self, ExtraNode>.
468 // Hooks borrow the node and return Unchanged or an owning replacement in its expression
469 // category, throwing on failure. Narrower field types are checked separately. Forward
470 // inplace_mode on every child edge.
471 virtual UnchangedOr<Expr> Mutate_(const OpaqueExprNode* node, InplaceMode inplace_mode);
472 virtual UnchangedOr<Expr> Mutate_(const TupleNode* node, InplaceMode inplace_mode);
473 virtual UnchangedOr<Expr> Mutate_(const TupleGetItemNode* node, InplaceMode inplace_mode);
474 virtual UnchangedOr<PrimExpr> Mutate_(const TensorLoadNode* node, InplaceMode inplace_mode);
475 virtual UnchangedOr<Expr> Mutate_(const TensorRegionNode* node, InplaceMode inplace_mode);
476 virtual UnchangedOr<Expr> Mutate_(const VarNode* node, InplaceMode inplace_mode);
477 virtual UnchangedOr<Expr> Mutate_(const GlobalVarNode* node, InplaceMode inplace_mode);
478 virtual UnchangedOr<Expr> Mutate_(const CallNode* node, InplaceMode inplace_mode);
479 virtual UnchangedOr<Expr> Mutate_(const GenericConstNode* node, InplaceMode inplace_mode);
480 virtual UnchangedOr<Expr> Mutate_(const DataTypeImmNode* node, InplaceMode inplace_mode);
481 virtual UnchangedOr<PrimExpr> Mutate_(const IntImmNode* node, InplaceMode inplace_mode);
482 virtual UnchangedOr<PrimExpr> Mutate_(const FloatImmNode* node, InplaceMode inplace_mode);
483 virtual UnchangedOr<Expr> Mutate_(const OpNode* node, InplaceMode inplace_mode);
484 virtual UnchangedOr<Expr> Mutate_(const StringImmNode* node, InplaceMode inplace_mode);
485 virtual UnchangedOr<PrimExpr> Mutate_(const prim::CastNode* node, InplaceMode inplace_mode);
486 virtual UnchangedOr<PrimExpr> Mutate_(const prim::AddNode* node, InplaceMode inplace_mode);
487 virtual UnchangedOr<PrimExpr> Mutate_(const prim::LShiftNode* node, InplaceMode inplace_mode);
488 virtual UnchangedOr<PrimExpr> Mutate_(const prim::RShiftNode* node, InplaceMode inplace_mode);
489 virtual UnchangedOr<PrimExpr> Mutate_(const prim::BitwiseAndNode* node, InplaceMode inplace_mode);
490 virtual UnchangedOr<PrimExpr> Mutate_(const prim::BitwiseOrNode* node, InplaceMode inplace_mode);
491 virtual UnchangedOr<PrimExpr> Mutate_(const prim::BitwiseXorNode* node, InplaceMode inplace_mode);
492 virtual UnchangedOr<PrimExpr> Mutate_(const prim::BitwiseNotNode* node, InplaceMode inplace_mode);
493 virtual UnchangedOr<PrimExpr> Mutate_(const prim::SubNode* node, InplaceMode inplace_mode);
494 virtual UnchangedOr<PrimExpr> Mutate_(const prim::MulNode* node, InplaceMode inplace_mode);
495 virtual UnchangedOr<PrimExpr> Mutate_(const prim::DivNode* node, InplaceMode inplace_mode);
496 virtual UnchangedOr<PrimExpr> Mutate_(const prim::ModNode* node, InplaceMode inplace_mode);
497 virtual UnchangedOr<PrimExpr> Mutate_(const prim::FloorDivNode* node, InplaceMode inplace_mode);
498 virtual UnchangedOr<PrimExpr> Mutate_(const prim::FloorModNode* node, InplaceMode inplace_mode);
499 virtual UnchangedOr<PrimExpr> Mutate_(const prim::MinNode* node, InplaceMode inplace_mode);
500 virtual UnchangedOr<PrimExpr> Mutate_(const prim::MaxNode* node, InplaceMode inplace_mode);
501 virtual UnchangedOr<PrimExpr> Mutate_(const prim::EQNode* node, InplaceMode inplace_mode);
502 virtual UnchangedOr<PrimExpr> Mutate_(const prim::NENode* node, InplaceMode inplace_mode);
503 virtual UnchangedOr<PrimExpr> Mutate_(const prim::LTNode* node, InplaceMode inplace_mode);
504 virtual UnchangedOr<PrimExpr> Mutate_(const prim::LENode* node, InplaceMode inplace_mode);
505 virtual UnchangedOr<PrimExpr> Mutate_(const prim::GTNode* node, InplaceMode inplace_mode);
506 virtual UnchangedOr<PrimExpr> Mutate_(const prim::GENode* node, InplaceMode inplace_mode);
507 virtual UnchangedOr<PrimExpr> Mutate_(const prim::AndNode* node, InplaceMode inplace_mode);
508 virtual UnchangedOr<PrimExpr> Mutate_(const prim::OrNode* node, InplaceMode inplace_mode);
509 virtual UnchangedOr<PrimExpr> Mutate_(const prim::NotNode* node, InplaceMode inplace_mode);
510 virtual UnchangedOr<PrimExpr> Mutate_(const prim::SelectNode* node, InplaceMode inplace_mode);
511 virtual UnchangedOr<PrimExpr> Mutate_(const prim::LetNode* node, InplaceMode inplace_mode);
512 virtual UnchangedOr<PrimExpr> Mutate_(const prim::RampNode* node, InplaceMode inplace_mode);
513 virtual UnchangedOr<PrimExpr> Mutate_(const prim::BroadcastNode* node, InplaceMode inplace_mode);
514 virtual UnchangedOr<PrimExpr> Mutate_(const prim::ShuffleNode* node, InplaceMode inplace_mode);
515
516 protected:
526 static UnchangedOr<Expr> ReinferMutatedCallType(UnchangedOr<Expr> mutated,
527 const CallNode* original,
528 InplaceMode inplace_mode);
529
534 explicit ExprMutator(const VTable* vtable) : ObjectMutator(vtable) {}
539 static void InitVTable(VTable* vtable);
540};
541
542} // namespace tvm
543#endif // TVM_IR_EXPR_FUNCTOR_H_
Call corresponds to callable invocation.
Definition expr.h:935
A data type literal with AnyType as its expression type.
Definition expr.h:110
virtual R Dispatch_(const prim::OrNode *node, Args... args)
Definition expr_functor.h:190
virtual R Dispatch_(const prim::CastNode *node, Args... args)
Definition expr_functor.h:121
static void SetDispatch(VTable *vtable)
Register a hook for an additional expression type.
Definition expr_functor.h:289
virtual R Dispatch_(const prim::BitwiseNotNode *node, Args... args)
Definition expr_functor.h:142
virtual R Dispatch_(const prim::BitwiseAndNode *node, Args... args)
Definition expr_functor.h:133
virtual R Dispatch_(const LambdaExprNode *node, Args... args)
Definition expr_functor.h:76
virtual R Dispatch_(const prim::NENode *node, Args... args)
Definition expr_functor.h:172
virtual R Dispatch_(const prim::LTNode *node, Args... args)
Definition expr_functor.h:175
virtual R Dispatch_(const prim::LetNode *node, Args... args)
Definition expr_functor.h:199
virtual R Dispatch_(const CallNode *node, Args... args)
Definition expr_functor.h:100
virtual R Dispatch_(const prim::BitwiseOrNode *node, Args... args)
Definition expr_functor.h:136
virtual R Dispatch_(const TensorLoadNode *node, Args... args)
Definition expr_functor.h:91
virtual R Dispatch_(const prim::MulNode *node, Args... args)
Definition expr_functor.h:148
virtual R Dispatch_(const GenericConstNode *node, Args... args)
Definition expr_functor.h:103
virtual R Dispatch_(const OpaqueExprNode *node, Args... args)
Definition expr_functor.h:79
virtual R Dispatch_(const TupleGetItemNode *node, Args... args)
Definition expr_functor.h:85
virtual R Dispatch_(const prim::RampNode *node, Args... args)
Definition expr_functor.h:202
virtual R DispatchDefault_(const ffi::Object *node, Args... args)
Default node behavior, overridden by subclasses that handle arbitrary core nodes.
Definition expr_functor.h:218
virtual R Dispatch_(const IntImmNode *node, Args... args)
Definition expr_functor.h:109
virtual R Dispatch_(const prim::EQNode *node, Args... args)
Definition expr_functor.h:169
virtual R Dispatch_(const prim::AndNode *node, Args... args)
Definition expr_functor.h:187
ExprFunctor()
Construct a functor with the core expression hooks.
Definition expr_functor.h:55
virtual R Dispatch_(const VarNode *node, Args... args)
Definition expr_functor.h:94
virtual R Dispatch_(const prim::NotNode *node, Args... args)
Definition expr_functor.h:193
virtual R Dispatch_(const prim::BitwiseXorNode *node, Args... args)
Definition expr_functor.h:139
virtual R Dispatch_(const prim::LENode *node, Args... args)
Definition expr_functor.h:178
virtual R Dispatch_(const prim::RShiftNode *node, Args... args)
Definition expr_functor.h:130
virtual R Dispatch_(const DataTypeImmNode *node, Args... args)
Definition expr_functor.h:106
virtual R Dispatch_(const TupleNode *node, Args... args)
Definition expr_functor.h:82
virtual R Dispatch_(const prim::BroadcastNode *node, Args... args)
Definition expr_functor.h:205
virtual R Dispatch_(const OpNode *node, Args... args)
Definition expr_functor.h:115
virtual R Dispatch_(const prim::AddNode *node, Args... args)
Definition expr_functor.h:124
ExprFunctor(const VTable *vtable)
Construct a functor with an extended finalized table.
Definition expr_functor.h:230
virtual R Dispatch_(const prim::SelectNode *node, Args... args)
Definition expr_functor.h:196
virtual TVM_FFI_INLINE R Dispatch(const Expr &node, Args... args)
Dispatch to a node hook, including registered ancestor hooks.
Definition expr_functor.h:71
virtual R Dispatch_(const prim::ModNode *node, Args... args)
Definition expr_functor.h:154
TVM_FFI_INLINE R operator()(const Expr &node, Args... args)
Dispatch an expression through Dispatch.
Definition expr_functor.h:62
virtual R Dispatch_(const prim::GTNode *node, Args... args)
Definition expr_functor.h:181
virtual R Dispatch_(const prim::GENode *node, Args... args)
Definition expr_functor.h:184
virtual R Dispatch_(const FloatImmNode *node, Args... args)
Definition expr_functor.h:112
virtual R Dispatch_(const prim::LShiftNode *node, Args... args)
Definition expr_functor.h:127
static void InitVTable(VTable *vtable)
Register core expression hooks in a fresh mutable table.
Definition expr_functor.h:235
virtual R Dispatch_(const StringImmNode *node, Args... args)
Definition expr_functor.h:118
virtual R Dispatch_(const prim::MinNode *node, Args... args)
Definition expr_functor.h:163
virtual R Dispatch_(const GlobalVarNode *node, Args... args)
Definition expr_functor.h:97
virtual R Dispatch_(const prim::DivNode *node, Args... args)
Definition expr_functor.h:151
virtual R Dispatch_(const prim::FloorDivNode *node, Args... args)
Definition expr_functor.h:157
virtual R Dispatch_(const prim::MaxNode *node, Args... args)
Definition expr_functor.h:166
R result_type
The result type of this functor.
Definition expr_functor.h:53
virtual R Dispatch_(const prim::ShuffleNode *node, Args... args)
Definition expr_functor.h:208
virtual R Dispatch_(const TensorRegionNode *node, Args... args)
Definition expr_functor.h:88
virtual R Dispatch_(const prim::SubNode *node, Args... args)
Definition expr_functor.h:145
virtual R Dispatch_(const prim::FloorModNode *node, Args... args)
Definition expr_functor.h:160
Type-dispatched expression functor with a caller-selected signature.
Definition expr_functor.h:44
Structural Expr mutator with native overrides for core expressions and structural fallback for other ...
Definition expr_functor.h:431
virtual UnchangedOr< Expr > Mutate_(const GlobalVarNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::AndNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::RShiftNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::MulNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::BroadcastNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::LShiftNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::ModNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::FloorModNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::MinNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::BitwiseXorNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::BitwiseOrNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::GTNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::BitwiseAndNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::LetNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::SubNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::MaxNode *node, InplaceMode inplace_mode)
static void InitVTable(VTable *vtable)
Register core expression hooks in a fresh mutable table.
virtual UnchangedOr< Expr > Mutate_(const TupleNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< Expr > Mutate_(const OpaqueExprNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::NotNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< Expr > Mutate_(const TensorRegionNode *node, InplaceMode inplace_mode)
static UnchangedOr< Expr > ReinferMutatedCallType(UnchangedOr< Expr > mutated, const CallNode *original, InplaceMode inplace_mode)
Reinfer the result type of a Call after ordinary mutation.
virtual UnchangedOr< Expr > Mutate_(const TupleGetItemNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< Expr > Mutate_(const OpNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< Expr > Mutate_(const CallNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::NENode *node, InplaceMode inplace_mode)
virtual UnchangedOr< Expr > Mutate_(const StringImmNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::BitwiseNotNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const IntImmNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::AddNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::FloorDivNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::DivNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const FloatImmNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< Expr > Mutate_(const VarNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::CastNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::SelectNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::LENode *node, InplaceMode inplace_mode)
TVM_FFI_INLINE UnchangedOr< PrimExpr > Mutate(const PrimExpr &expr, InplaceMode inplace_mode=InplaceMode::kDisallow)
Mutate a primitive expression, preserving its expression category.
Definition expr_functor.h:446
virtual UnchangedOr< PrimExpr > Mutate_(const prim::GENode *node, InplaceMode inplace_mode)
ExprMutator(const VTable *vtable)
Construct a mutator with an extended native dispatch table.
Definition expr_functor.h:534
virtual UnchangedOr< Expr > Mutate_(const DataTypeImmNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const TensorLoadNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::EQNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::ShuffleNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::LTNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< Expr > Mutate_(const GenericConstNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::RampNode *node, InplaceMode inplace_mode)
virtual UnchangedOr< PrimExpr > Mutate_(const prim::OrNode *node, InplaceMode inplace_mode)
TVM_FFI_INLINE UnchangedOr< Expr > Mutate(const Expr &expr, InplaceMode inplace_mode=InplaceMode::kDisallow)
Mutate an expression, preserving its expression category.
Definition expr_functor.h:460
Structural Expr visitor with native overrides for core expressions.
Definition expr_functor.h:336
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::MulNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const CallNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::BroadcastNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const TensorRegionNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::RampNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::MaxNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const TupleNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::GTNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::RShiftNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::GENode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const TupleGetItemNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::AddNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const OpaqueExprNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::OrNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const VarNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const OpNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::NotNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::EQNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::MinNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::ShuffleNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::FloorDivNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::BitwiseAndNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::CastNode *node)
static void InitVTable(VTable *vtable)
Register core expression hooks in a fresh mutable table.
virtual ffi::Optional< VisitInterrupt > Visit_(const GlobalVarNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::SelectNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::BitwiseXorNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const StringImmNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::BitwiseNotNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::LTNode *node)
ExprVisitor(const VTable *vtable)
Construct a visitor with an extended native dispatch table.
Definition expr_functor.h:395
virtual ffi::Optional< VisitInterrupt > Visit_(const GenericConstNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::LShiftNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const DataTypeImmNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::DivNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::FloorModNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::LetNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::AndNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::BitwiseOrNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::SubNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const FloatImmNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::LENode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const TensorLoadNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::NENode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const IntImmNode *node)
virtual ffi::Optional< VisitInterrupt > Visit_(const prim::ModNode *node)
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
A typed staging expression representing a lambda computation.
Definition expr.h:783
A dynamically dispatched functor on the type of the first argument.
Definition object_functor.h:85
Native mutation with exact dispatch and structural fallback.
Definition object_functor.h:346
Native visiting with exact dispatch and structural fallback.
Definition object_functor.h:228
Metadata for a canonical primitive operator invoked through Call.
Definition op.h:86
Base node for opaque construction-time expressions.
Definition base_expr.h:394
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
A region of an indexed expression source.
Definition expr.h:1055
Get the index-th field out of a tuple.
Definition expr.h:405
Tuple container.
Definition expr.h:363
A local variable in the IR.
Definition expr.h:694
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
Base expr nodes in TVM.
Canonical primitive operators and their registration.
TIR expressions.
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 TVM_DEFINE_OBJECT_FUNCTOR_DEFAULT_CONSTRUCTOR(Class, Parent)
Define a default constructor backed by one initialized native dispatch table.
Definition object_functor.h:529
#define TVM_TIRX_DLL
Definition base.h:83
a <= b
Definition expr.h:495
Primitive vector expressions.