FreeTensor
Loading...
Searching...
No Matches
simplify.h
Go to the documentation of this file.
1#ifndef FREE_TENSOR_SIMPLIFY_H
2#define FREE_TENSOR_SIMPLIFY_H
3
4#include <functional>
5#include <unordered_map>
6#include <unordered_set>
7
13#include <func.h>
14#include <math/bounds.h>
15#include <mutator.h>
16#include <pass/const_fold.h>
17#include <visitor.h>
18
19namespace freetensor {
20
26 const std::unordered_map<std::string, int> &varScope_;
27 int innerMost_ = 0;
28
29 public:
30 FindInnerMostScope(const std::unordered_map<std::string, int> &varScope)
31 : varScope_(varScope) {}
32 int innnerMost() const { return innerMost_; }
33
34 protected:
35 virtual void visit(const Var &op) override;
36 virtual void visit(const Load &op) override;
37};
38
39int findInnerMostScope(const std::unordered_map<std::string, int> &varScope,
40 const Expr &op);
41
63class SimplifyPass : public CompTransientBounds<SymbolTable<ConstFold>> {
65
66 // defining scope table
67 std::unordered_map<std::string, int> varScope_;
68 int curScope_ = 0;
69
71 std::function<Ref<CompUniqueBounds>(const CompTransientBoundsInterface &)>
72 compUniqueBoundsFactory_;
73 bool leafFirstBoundAnalysis_;
74
75 public:
78 compUniqueBoundsFactory,
79 bool leafFirstBoundAnalysis)
80 : compUniqueBoundsFactory_(compUniqueBoundsFactory),
81 leafFirstBoundAnalysis_(leafFirstBoundAnalysis) {}
82
83 private:
84 template <class T> bool equals(const Expr &op, T &&val) const {
85 if (op->nodeType() == ASTNodeType::IntConst &&
86 op.as<IntConstNode>()->val_ == val) {
87 return true;
88 }
89 if (op->nodeType() == ASTNodeType::FloatConst &&
90 op.as<FloatConstNode>()->val_ == val) {
91 return true;
92 }
93 return false;
94 }
95
96 protected:
97 using BaseClass::visit;
98
99 Stmt visitStmt(const Stmt &op) override;
100 Expr visitExpr(const Expr &op) override;
101
102 Expr visit(const Add &op) override;
103 Expr visit(const Sub &op) override;
104 Expr visit(const Mul &op) override;
105 Expr visit(const FloorDiv &op) override;
106 Expr visit(const CeilDiv &op) override;
107 Expr visit(const RoundTowards0Div &op) override;
108 Expr visit(const Mod &op) override;
109 Expr visit(const Remainder &op) override;
110 Expr visit(const LT &op) override;
111 Expr visit(const LE &op) override;
112 Expr visit(const GT &op) override;
113 Expr visit(const GE &op) override;
114 Expr visit(const EQ &op) override;
115 Expr visit(const NE &op) override;
116 Expr visit(const IfExpr &op) override;
117 Stmt visit(const ReduceTo &op) override;
118 Stmt visit(const VarDef &op) override;
119 Stmt visit(const For &op) override;
120 Stmt visit(const If &op) override;
121 Stmt visit(const Assert &op) override;
122};
123
125 public:
127 : SimplifyPass(
128 [](const CompTransientBoundsInterface &tr) {
130 },
131 true) {}
132};
133
134class PBSimplify : public SimplifyPass {
135 public:
137 : SimplifyPass(
138 [](const CompTransientBoundsInterface &tr) {
140 },
141 false) {}
142};
143
158Stmt builtinSimplify(const Stmt &op);
159Stmt pbSimplify(const Stmt &op);
160Stmt simplify(const Stmt &op);
166
167} // namespace freetensor
168
169#endif // FREE_TENSOR_SIMPLIFY_H
virtual ASTNodeType nodeType() const =0
Definition: simplify.h:124
BuiltinSimplify()
Definition: simplify.h:126
Definition: comp_transient_bounds.h:24
Definition: comp_transient_bounds.h:50
BaseClass::StmtRetType visit(const For &op) override
Definition: comp_transient_bounds.h:128
Definition: simplify.h:25
virtual void visit(const Var &op) override
Definition: simplify.cc:127
FindInnerMostScope(const std::unordered_map< std::string, int > &varScope)
Definition: simplify.h:30
int innnerMost() const
Definition: simplify.h:32
Definition: expr.h:93
int64_t val_
Definition: expr.h:95
Definition: simplify.h:134
PBSimplify()
Definition: simplify.h:136
Definition: ref.h:24
static Ref make()
Definition: ref.h:105
Ref< U > as() const
Definition: ref.h:83
Definition: simplify.h:63
Expr visitExpr(const Expr &op) override
Definition: simplify.cc:158
Stmt visitStmt(const Stmt &op) override
Definition: simplify.cc:150
Expr visit(const Add &op) override
Definition: simplify.cc:203
SimplifyPass(std::function< Ref< CompUniqueBounds >(const CompTransientBoundsInterface &)> compUniqueBoundsFactory, bool leafFirstBoundAnalysis)
Definition: simplify.h:76
Definition: visitor.h:11
#define DEFINE_PASS_FOR_FUNC(pass)
Definition: func.h:88
Definition: allocator.h:9
Ref< RemainderNode > Remainder
Definition: expr.h:324
Ref< RoundTowards0DivNode > RoundTowards0Div
Definition: expr.h:277
Ref< VarDefNode > VarDef
Definition: stmt.h:107
Ref< CeilDivNode > CeilDiv
Definition: expr.h:257
Stmt simplify(const Stmt &op)
Definition: simplify.cc:1036
Stmt pbSimplify(const Stmt &op)
Definition: simplify.cc:1032
Ref< ReduceToNode > ReduceTo
Definition: stmt.h:248
Ref< SubNode > Sub
Definition: expr.h:186
Ref< IfNode > If
Definition: stmt.h:352
Ref< IfExprNode > IfExpr
Definition: expr.h:705
Ref< ForNode > For
Definition: stmt.h:308
Stmt builtinSimplify(const Stmt &op)
Definition: simplify.cc:1028
Ref< GENode > GE
Definition: expr.h:408
Ref< GTNode > GT
Definition: expr.h:394
Ref< FloorDivNode > FloorDiv
Definition: expr.h:237
Ref< MulNode > Mul
Definition: expr.h:200
Ref< LTNode > LT
Definition: expr.h:366
Ref< NENode > NE
Definition: expr.h:436
Ref< StmtNode > Stmt
Definition: ast.h:152
int findInnerMostScope(const std::unordered_map< std::string, int > &varScope, const Expr &op)
Definition: simplify.cc:143
Ref< EQNode > EQ
Definition: expr.h:422
Ref< AddNode > Add
Definition: expr.h:172
Ref< ExprNode > Expr
Definition: ast.h:184
Ref< ModNode > Mod
Definition: expr.h:301
Ref< AssertNode > Assert
Definition: stmt.h:392
Ref< LENode > LE
Definition: expr.h:380