26 #ifndef TVM_TIRX_STMT_FUNCTOR_H_
27 #define TVM_TIRX_STMT_FUNCTOR_H_
36 #include <unordered_map>
46 template <
typename FType>
49 #define STMT_FUNCTOR_DEFAULT \
51 return VisitStmtDefault_(op, std::forward<Args>(args)...); \
54 #define IR_STMT_FUNCTOR_DISPATCH(OP) \
55 vtable.template set_dispatch<OP>([](const ffi::ObjectRef& n, TSelf* self, Args... args) { \
56 return self->VisitStmt_(static_cast<const OP*>(n.get()), std::forward<Args>(args)...); \
59 template <
typename R,
typename... Args>
76 R
operator()(
const Stmt& n, Args... args) {
return VisitStmt(n, std::forward<Args>(args)...); }
84 static FType vtable = InitVTable();
85 return vtable(n,
this, std::forward<Args>(args)...);
106 TVM_FFI_THROW(InternalError) <<
"Do not have a default for " << op->GetTypeKey();
107 TVM_FFI_UNREACHABLE();
112 static FType InitVTable() {
136 #undef IR_STMT_FUNCTOR_DISPATCH
137 #undef STMT_FUNCTOR_DEFAULT
144 using StmtFunctor::operator();
147 using StmtFunctor::VisitStmt;
204 allow_copy_on_write_ =
true;
205 return VisitStmt(stmt);
221 bool allow_copy_on_write_{
false};
231 template <
typename TNode>
233 static_assert(std::is_base_of<StmtNode, TNode>::value,
234 "StmtMutator:: CopyOnWrite requires us to track uniqueness of all parent "
235 "nodes during the recursion. Because the child classes do not necessarily "
236 "check the Array, Expr and other structures during the visit, it is only safe to "
237 "call this function with StmtNodes for now. "
238 "Please create a new node directly in other cases.");
239 if (allow_copy_on_write_) {
241 return ffi::GetObjectPtr<TNode>(
const_cast<TNode*
>(node));
245 return ffi::make_object<TNode>(*node);
255 if (allow_copy_on_write_ && !stmt.unique()) {
256 allow_copy_on_write_ =
false;
257 Stmt ret = StmtFunctor::VisitStmt(stmt);
258 allow_copy_on_write_ =
true;
261 return StmtFunctor::VisitStmt(stmt);
321 std::function<
Stmt(
const Stmt&)> fmutate =
nullptr);
332 using StmtVisitor::operator();
333 using ExprVisitor::operator();
336 using ExprVisitor::VisitExpr;
338 using StmtVisitor::VisitStmt;
340 void VisitExpr(
const Expr& e)
override {
return ExprVisitor::VisitExpr(e); }
349 using StmtMutator::operator();
350 using ExprMutator::operator();
353 using ExprMutator::VisitExpr;
378 ffi::Optional<ffi::Array<ffi::String>> only_enable = std::nullopt);
387 std::function<
void(
const ffi::ObjectRef&)> fvisit);
415 template <
typename T>
417 std::function<ffi::Optional<Expr>(
const Var&
var)> vmap) {
418 return arr.Map([&vmap](
const auto& elem) {
return Substitute(elem, vmap); });
428 std::function<ffi::Optional<Expr>(
const Var&
var)> vmap) {
443 template <
typename Obj>
444 auto Substitute(Obj&& obj,
const ffi::Map<Var, Expr>& vmap) {
445 auto func = [&vmap](
const Var&
var) -> ffi::Optional<Expr> {
return vmap.Get(
var); };
446 return Substitute(std::forward<Obj>(obj), func);
458 template <
typename Obj,
typename Replacement>
459 auto Substitute(Obj&& obj,
const ffi::Map<Var, Replacement>& vmap) {
460 auto func = [&vmap](
const Var&
var) -> ffi::Optional<Expr> {
461 if (
auto replacement = vmap.Get(
var))
return Expr(replacement.value());
464 return Substitute(std::forward<Obj>(obj), func);
476 template <
typename Obj,
typename Replacement>
477 auto Substitute(Obj&& obj,
const std::unordered_map<const VarNode*, Replacement>& vmap) {
478 auto func = [&vmap](
const Var&
var) -> ffi::Optional<Expr> {
479 if (
auto it = vmap.find(
var.get()); it != vmap.end()) {
480 return Expr(it->second);
484 return Substitute(std::forward<Obj>(obj), func);
496 template <
typename Obj,
typename Replacement,
typename Hasher,
typename EqualityChecker>
498 const std::unordered_map<Var, Replacement, Hasher, EqualityChecker>& vmap) {
499 auto func = [&vmap](
const Var&
var) -> ffi::Optional<Expr> {
500 if (
auto it = vmap.find(
var); it != vmap.end()) {
501 return Expr(it->second);
505 return Substitute(std::forward<Obj>(obj), func);
517 template <
typename Obj,
typename Replacement>
518 auto Substitute(Obj&& obj,
const std::unordered_map<IterVar, Replacement>& iter_vmap) {
519 std::unordered_map<const VarNode*, Expr> vmap;
520 for (
const auto& [iter_var, expr] : iter_vmap) {
521 vmap[iter_var->var.get()] =
Expr(expr);
524 auto func = [&vmap](
const Var&
var) -> ffi::Optional<Expr> {
525 if (
auto it = vmap.find(
var.get()); it != vmap.end()) {
531 return Substitute(std::forward<Obj>(obj), func);
545 Stmt stmt, std::function<ffi::Optional<PrimExpr>(
const Var&)> vmap);
558 PrimExpr expr, std::function<ffi::Optional<PrimExpr>(
const Var&)> vmap);
568 const std::function<
bool(
const ffi::ObjectRef&)>& fvisit);
580 template <
typename Node,
typename = std::enable_if_t<std::is_base_of_v<StmtNode, Node>>>
584 void VisitStmt(
const Stmt& stmt)
final {
588 StmtVisitor::VisitStmt(stmt);
591 void VisitStmt_(
const Node* block)
override { contains_node =
true; }
593 bool contains_node{
false};
598 return visitor.contains_node;
Managed reference to ExprNode.
Definition: base_expr.h:311
A dynamically dispatched functor on the type of the first argument.
Definition: node_functor.h:62
Typed reference/view over any Expr whose ExprNode::ty is PrimType.
Definition: base_expr.h:354
Range container
Definition: expr.h:484
static Range FromMinExtent(PrimExpr min, PrimExpr extent, Span span=Span())
construct a new range with min and extent The corresponding constructor is removed,...
Allocate a buffer and declare it in scope.
Definition: stmt.h:259
Assert condition, if an error occurs, return the error message.
Definition: stmt.h:159
Define certain auxiliary attribute for the body to be a symbolic value. This provide auxiliary inform...
Definition: stmt.h:115
Bind a variable to a value in the enclosing scope.
Definition: stmt.h:76
A Break in control flow.
Definition: stmt.h:693
Load value from the high dimension buffer.
Definition: expr.h:545
Store value to the high dimension buffer.
Definition: stmt.h:201
Buffer is a symbolic n-darray structure. It is a composition of primitive symbolic types,...
Definition: buffer.h:187
A Continue in control flow.
Definition: stmt.h:718
Declare a buffer that can be used in the body.
Definition: stmt.h:238
Evaluates an expression. This is mostly used for putting a Call node into Stmt.
Definition: stmt.h:337
ExprMutator that mutates expressions.
Definition: expr_functor.h:246
Expr VisitExpr_(const VarNode *op) override
PrimExpr VisitPrimExpr(const PrimExpr &expr)
Visit a primitive expression and verify that it remains primitive.
Definition: expr_functor.h:253
ExprVisitor.
Definition: expr_functor.h:202
void VisitExpr_(const VarNode *op) override
A for loop, with possible type annotations.
Definition: stmt.h:587
IfThenElse statement.
Definition: stmt.h:517
A block is a basic schedule unit in TIR.
Definition: stmt.h:851
A block realization node represents execution of the block at the binding values.
Definition: stmt.h:920
Standalone statement that declares a scope-id binding (e.g. cta_id, warp_id, lane_id)....
Definition: stmt.h:963
The container of seq statement. Represent a sequence of statements.
Definition: stmt.h:312
Mutator that recursively mutates stmts and exprs on them.
Definition: stmt_functor.h:347
Expr VisitExpr(const Expr &e) override
Visitor to Exprs, can be overriden to do recursive changes to Exprs.
Definition: stmt_functor.h:358
Expr VisitExpr_(const BufferLoadNode *op) override
Visitor that recursively visit stmts and exprs on them.
Definition: stmt_functor.h:330
void VisitExpr_(const BufferLoadNode *op) override
void VisitExpr(const Expr &e) override
Visitor to Exprs, can be overriden to do recursive changes to Exprs.
Definition: stmt_functor.h:340
Definition: stmt_functor.h:60
virtual R VisitStmt_(const ScopeIdDefStmtNode *op, Args... args)
Definition: stmt_functor.h:103
virtual R VisitStmt_(const ContinueNode *op, Args... args)
Definition: stmt_functor.h:94
virtual R VisitStmt_(const BufferStoreNode *op, Args... args)
Definition: stmt_functor.h:97
virtual ~StmtFunctor()
virtual destructor
Definition: stmt_functor.h:69
virtual R VisitStmtDefault_(const ffi::Object *op, Args...)
Definition: stmt_functor.h:105
R operator()(const Stmt &n, Args... args)
Same as call.
Definition: stmt_functor.h:76
virtual R VisitStmt_(const IfThenElseNode *op, Args... args)
Definition: stmt_functor.h:90
virtual R VisitStmt_(const SBlockRealizeNode *op, Args... args)
Definition: stmt_functor.h:102
virtual R VisitStmt_(const ForNode *op, Args... args)
Definition: stmt_functor.h:91
virtual R VisitStmt_(const SeqStmtNode *op, Args... args)
Definition: stmt_functor.h:99
virtual R VisitStmt_(const SBlockNode *op, Args... args)
Definition: stmt_functor.h:101
virtual R VisitStmt_(const tirx::TilePrimitiveCallNode *op, Args... args)
Definition: stmt_functor.h:104
virtual R VisitStmt(const Stmt &n, Args... args)
The functor call.
Definition: stmt_functor.h:83
virtual R VisitStmt_(const AttrStmtNode *op, Args... args)
Definition: stmt_functor.h:89
virtual R VisitStmt_(const EvaluateNode *op, Args... args)
Definition: stmt_functor.h:100
virtual R VisitStmt_(const BreakNode *op, Args... args)
Definition: stmt_functor.h:93
virtual R VisitStmt_(const DeclBufferNode *op, Args... args)
Definition: stmt_functor.h:96
virtual R VisitStmt_(const AssertStmtNode *op, Args... args)
Definition: stmt_functor.h:98
R result_type
the result type of this functor
Definition: stmt_functor.h:67
virtual R VisitStmt_(const AllocBufferNode *op, Args... args)
Definition: stmt_functor.h:95
virtual R VisitStmt_(const WhileNode *op, Args... args)
Definition: stmt_functor.h:92
virtual R VisitStmt_(const BindNode *op, Args... args)
Definition: stmt_functor.h:88
Same as ExprFunctor except it is applied on statements.
Definition: stmt_functor.h:47
StmtMutator that mutates the statements.
Definition: stmt_functor.h:193
virtual Expr VisitExpr(const Expr &e)
Visitor to Exprs, can be overriden to do recursive changes to Exprs.
Definition: stmt_functor.h:271
Stmt operator()(Stmt stmt)
Mutate stmt.
Definition: stmt_functor.h:203
Stmt VisitStmt_(const tirx::TilePrimitiveCallNode *op) override
Stmt VisitStmt_(const EvaluateNode *op) override
Stmt VisitStmt_(const SBlockNode *op) override
Stmt VisitStmt_(const WhileNode *op) override
Stmt VisitStmt_(const SeqStmtNode *op) override
Stmt VisitStmt_(const ContinueNode *op) override
Stmt VisitStmt_(const SBlockRealizeNode *op) override
Stmt VisitStmt_(const IfThenElseNode *op) override
Stmt VisitStmt_(const ScopeIdDefStmtNode *op) override
Stmt VisitStmt_(const AttrStmtNode *op) override
virtual Buffer VisitBufferDef(const Buffer &buffer, bool alloc_data)
Visit buffer at definition site. Visits shape/strides/elem_offset via VisitExpr. If any field changes...
ffi::Map< Buffer, Buffer > buffer_remap_
Map from old buffer to new buffer, populated by VisitBufferDef.
Definition: stmt_functor.h:210
Stmt VisitStmt(const Stmt &stmt) override
Internal mutator that everyone calls.
Definition: stmt_functor.h:254
Stmt VisitStmt_(const BindNode *op) override
Stmt VisitStmt_(const ForNode *op) override
ffi::ObjectPtr< TNode > CopyOnWrite(const TNode *node)
Perform copy on write on node.
Definition: stmt_functor.h:232
Stmt VisitSeqStmt_(const SeqStmtNode *op, bool flatten_before_visit, std::function< Stmt(const Stmt &)> fmutate=nullptr)
Alternative advance method for SeqStmtNode.
PrimExpr VisitPrimExpr(const PrimExpr &e)
Mutate a primitive expression and verify that it remains primitive.
Definition: stmt_functor.h:273
virtual Buffer VisitBufferUse(const Buffer &buffer)
Visit buffer at use site (BufferStore, BufferLoad, SBlock reads/writes). By default,...
Stmt VisitStmt_(const BreakNode *op) override
Stmt VisitStmt_(const AllocBufferNode *op) override
Stmt VisitStmt_(const AssertStmtNode *op) override
Stmt VisitStmt_(const BufferStoreNode *op) override
Stmt VisitStmt_(const DeclBufferNode *op) override
StmtVisitor.
Definition: stmt_functor.h:142
void VisitStmt_(const ForNode *op) override
void VisitStmt_(const BindNode *op) override
void VisitStmt_(const SBlockNode *op) override
void VisitStmt_(const AttrStmtNode *op) override
void VisitStmt_(const BufferStoreNode *op) override
void VisitStmt_(const SBlockRealizeNode *op) override
void VisitStmt_(const SeqStmtNode *op) override
void VisitStmt_(const AssertStmtNode *op) override
void VisitStmt_(const tirx::TilePrimitiveCallNode *op) override
void VisitStmt_(const ContinueNode *op) override
virtual void VisitBufferUse(const Buffer &buffer)
Visit buffer at use site (BufferStore, BufferLoad, SBlock reads/writes). By default,...
void VisitStmt_(const WhileNode *op) override
void VisitStmt_(const BreakNode *op) override
void VisitStmt_(const EvaluateNode *op) override
virtual void VisitExpr(const Expr &e)
Visitor to Exprs, can be overriden to do recursive changes to Exprs.
Definition: stmt_functor.h:155
void VisitStmt_(const ScopeIdDefStmtNode *op) override
void VisitStmt_(const IfThenElseNode *op) override
virtual void VisitBufferDef(const Buffer &buffer, bool alloc_data)
Visit buffer at definition site (AllocBuffer, DeclBuffer, SBlock alloc_buffers). Visits buffer shape,...
void VisitStmt_(const AllocBufferNode *op) override
void VisitStmt_(const DeclBufferNode *op) override
Container of all statements.
Definition: stmt.h:64
TIRX TilePrimitiveCall stmt.
Definition: tirx_stmt.h:35
a named variable in TIR
Definition: var.h:68
A While loop.
Definition: stmt.h:662
tvm::Expr Expr
Definition: type.h:41
PrimVar var(std::string name_hint, PrimType t=PrimType::Int(32))
Construct a new Var expression.
void PostOrderVisit(const ffi::ObjectRef &node, std::function< void(const ffi::ObjectRef &)> fvisit)
Recursively visit a statement or expression in post DFS order, applying fvisit. Each node is guarante...
IndexMap Substitute(const IndexMap &index_map, std::function< ffi::Optional< PrimExpr >(const Var &var)> f_subst)
Substitute variables in an index map.
Stmt IRTransform(Stmt stmt, const ffi::Function &preorder, const ffi::Function &postorder, ffi::Optional< ffi::Array< ffi::String >> only_enable=std::nullopt)
recursively visit the ir nodes in post DFS order, and transform it
bool ContainsNode(const Stmt &stmt)
Check if the statement contains the specified node type.
Definition: stmt_functor.h:581
void PreOrderVisit(const ffi::ObjectRef &stmt_or_expr, const std::function< bool(const ffi::ObjectRef &)> &fvisit)
Recursively visit a statement or expression in pre DFS order, applying fvisit. If fvisit returns fals...
Stmt SubstituteWithDataTypeLegalization(Stmt stmt, std::function< ffi::Optional< PrimExpr >(const Var &)> vmap)
Substitute the var specified by vmap and legalize data types after substitution.
An object that builds and maintains block scope and StmtSref mapping for Dependence analysis.
Definition: analyzer.h:40
PrimExpr ret(PrimExpr value, Span span=Span())
Return the value.
Defines the Functor data structures.
#define IR_STMT_FUNCTOR_DISPATCH(OP)
Definition: stmt_functor.h:54
#define STMT_FUNCTOR_DEFAULT
Definition: stmt_functor.h:49
Functors for tirx expressions.