1#include "taichi/ir/frontend_ir.h"
2#include "taichi/ir/statements.h"
3#include "taichi/ir/visitors.h"
4
5namespace taichi::lang {
6
7BasicStmtVisitor::BasicStmtVisitor() {
8 allow_undefined_visitor = true;
9}
10
11void BasicStmtVisitor::visit(Block *stmt_list) {
12 std::vector<Stmt *> statements;
13 // Make a copy in case the pass modifies the block itself
14 for (auto &stmt : stmt_list->statements)
15 statements.push_back(stmt.get());
16 for (auto &stmt : statements)
17 stmt->accept(this);
18}
19
20void BasicStmtVisitor::visit(IfStmt *if_stmt) {
21 preprocess_container_stmt(if_stmt);
22 if (if_stmt->true_statements)
23 if_stmt->true_statements->accept(this);
24 if (if_stmt->false_statements)
25 if_stmt->false_statements->accept(this);
26}
27
28void BasicStmtVisitor::visit(WhileStmt *stmt) {
29 preprocess_container_stmt(stmt);
30 stmt->body->accept(this);
31}
32
33void BasicStmtVisitor::visit(RangeForStmt *for_stmt) {
34 preprocess_container_stmt(for_stmt);
35 for_stmt->body->accept(this);
36}
37
38void BasicStmtVisitor::visit(StructForStmt *for_stmt) {
39 preprocess_container_stmt(for_stmt);
40 for_stmt->body->accept(this);
41}
42
43void BasicStmtVisitor::visit(MeshForStmt *for_stmt) {
44 preprocess_container_stmt(for_stmt);
45 for_stmt->body->accept(this);
46}
47
48void BasicStmtVisitor::visit(OffloadedStmt *stmt) {
49 preprocess_container_stmt(stmt);
50 stmt->all_blocks_accept(this);
51}
52
53void BasicStmtVisitor::visit(FrontendWhileStmt *stmt) {
54 preprocess_container_stmt(stmt);
55 stmt->body->accept(this);
56}
57
58void BasicStmtVisitor::visit(FrontendForStmt *stmt) {
59 preprocess_container_stmt(stmt);
60 stmt->body->accept(this);
61}
62
63void BasicStmtVisitor::visit(FrontendIfStmt *stmt) {
64 preprocess_container_stmt(stmt);
65 if (stmt->true_statements)
66 stmt->true_statements->accept(this);
67 if (stmt->false_statements)
68 stmt->false_statements->accept(this);
69}
70
71} // namespace taichi::lang
72