FreeTensor
Loading...
Searching...
No Matches
comp_unique_bounds_combination.h
Go to the documentation of this file.
1#ifndef FREE_TENSOR_COMP_UNIQUE_BOUNDS_COMBINATION_H
2#define FREE_TENSOR_COMP_UNIQUE_BOUNDS_COMBINATION_H
3
4#include <optional>
5#include <string>
6#include <unordered_map>
7#include <unordered_set>
8
11#include <hash.h>
12#include <math/bounds.h>
13#include <visitor.h>
14
15namespace freetensor {
16
39 typedef Visitor BaseClass;
40
41 typedef std::vector<LowerBound> LowerBoundsList;
42 typedef std::vector<UpperBound> UpperBoundsList;
43 typedef ASTHashMap<Expr, LowerBoundsList> LowerBoundsMap;
44 typedef ASTHashMap<Expr, UpperBoundsList> UpperBoundsMap;
45
46 LowerBoundsMap lower_;
47 UpperBoundsMap upper_;
48
49 public:
51 // retrieving expr from Lower/UpperBound requires to be mutable. fake it
52 // here.
53 mutable std::vector<LowerBound> lowerBounds_;
54 mutable std::vector<UpperBound> upperBounds_;
55
57
58 public:
59 Bound(std::vector<LowerBound> lowerBounds,
60 std::vector<UpperBound> upperBounds)
61 : lowerBounds_(std::move(lowerBounds)),
62 upperBounds_(std::move(upperBounds)) {}
63
64 BoundType type() const override { return BoundType::Combination; }
65
66 int64_t lowerInt() const override;
67 int64_t upperInt() const override;
68 std::optional<int64_t> getInt() const override;
69
70 Expr lowerExpr() const override;
71 Expr upperExpr() const override;
72
74 const std::unordered_set<std::string> &scope) const override;
75
76 Expr simplestExpr(const Expr &reference,
77 const std::unordered_map<std::string, int>
78 &orderedScope) const override;
79 };
80
82 : CompUniqueBounds(transients) {}
83
84 Ref<CompUniqueBounds::Bound> getBound(const Expr &op) override;
85
94 bool alwaysLT(const Expr &lhs, const Expr &rhs) override;
95 bool alwaysLE(const Expr &lhs, const Expr &rhs) override;
96
97 std::pair<Expr, Expr> unionBounds(
98 const std::vector<Ref<CompUniqueBounds::Bound>> &bounds) override;
99
100 protected:
101 LowerBoundsList getLower(const Expr &op) {
102 (*this)(op);
103 return lower_.at(op);
104 }
105 UpperBoundsList getUpper(const Expr &op) {
106 (*this)(op);
107 return upper_.at(op);
108 }
109
110 template <class T> void setLower(const Expr &op, T &&list) {
111 lower_[op] = std::forward<T>(list);
112 }
113 template <class T> void setUpper(const Expr &op, T &&list) {
114 upper_[op] = std::forward<T>(list);
115 }
116
123 void updLower(LowerBoundsList &list, const LowerBound &bound) const;
124 void updUpper(UpperBoundsList &list, const UpperBound &bound) const;
127 private:
134 void visitLinear(const Expr &op);
135
136 void insertSignDataTypeInfo(const Expr &op);
137
138 protected:
139 void visitExpr(const Expr &op) override;
140
141 void visit(const Var &op) override;
142 void visit(const Load &op) override;
143 void visit(const Cast &op) override;
144 void visit(const Intrinsic &op) override;
145 void visit(const IntConst &op) override;
146 void visit(const Add &op) override;
147 void visit(const Sub &op) override;
148 void visit(const Mul &op) override;
149 void visit(const Square &op) override;
150 void visit(const FloorDiv &op) override;
151 void visit(const CeilDiv &op) override;
152 void visit(const Mod &op) override;
153 void visit(const Min &op) override;
154 void visit(const Max &op) override;
155 void visit(const IfExpr &op) override;
156};
157
158} // namespace freetensor
159
160#endif // FREE_TENSOR_COMP_UNIQUE_BOUNDS_COMBINATION_H
Definition: comp_transient_bounds.h:24
Definition: comp_unique_bounds_combination.h:50
BoundType type() const override
Definition: comp_unique_bounds_combination.h:64
Ref< CompUniqueBounds::Bound > restrictScope(const std::unordered_set< std::string > &scope) const override
Definition: comp_unique_bounds_combination.cc:63
Expr simplestExpr(const Expr &reference, const std::unordered_map< std::string, int > &orderedScope) const override
Definition: comp_unique_bounds_combination.cc:72
Bound(std::vector< LowerBound > lowerBounds, std::vector< UpperBound > upperBounds)
Definition: comp_unique_bounds_combination.h:59
int64_t upperInt() const override
Definition: comp_unique_bounds_combination.cc:26
std::optional< int64_t > getInt() const override
Definition: comp_unique_bounds_combination.cc:36
Expr lowerExpr() const override
Definition: comp_unique_bounds_combination.cc:42
int64_t lowerInt() const override
Definition: comp_unique_bounds_combination.cc:16
Expr upperExpr() const override
Definition: comp_unique_bounds_combination.cc:52
Definition: comp_unique_bounds_combination.h:38
void visit(const Var &op) override
Definition: comp_unique_bounds_combination.cc:270
LowerBoundsList getLower(const Expr &op)
Definition: comp_unique_bounds_combination.h:101
UpperBoundsList getUpper(const Expr &op)
Definition: comp_unique_bounds_combination.h:105
Ref< CompUniqueBounds::Bound > getBound(const Expr &op) override
Definition: comp_unique_bounds_combination.cc:150
void updUpper(UpperBoundsList &list, const UpperBound &bound) const
Definition: comp_unique_bounds_combination.cc:128
void visitExpr(const Expr &op) override
Definition: comp_unique_bounds_combination.cc:235
void updLower(LowerBoundsList &list, const LowerBound &bound) const
Definition: comp_unique_bounds_combination.cc:107
void setLower(const Expr &op, T &&list)
Definition: comp_unique_bounds_combination.h:110
void setUpper(const Expr &op, T &&list)
Definition: comp_unique_bounds_combination.h:113
std::pair< Expr, Expr > unionBounds(const std::vector< Ref< CompUniqueBounds::Bound > > &bounds) override
Definition: comp_unique_bounds_combination.cc:196
bool alwaysLT(const Expr &lhs, const Expr &rhs) override
Definition: comp_unique_bounds_combination.cc:174
bool alwaysLE(const Expr &lhs, const Expr &rhs) override
Definition: comp_unique_bounds_combination.cc:185
CompUniqueBoundsCombination(const CompTransientBoundsInterface &transients)
Definition: comp_unique_bounds_combination.h:81
Definition: comp_unique_bounds.h:17
Definition: comp_unique_bounds.h:13
BoundType
Definition: comp_unique_bounds.h:15
Definition: bounds.h:37
Definition: bounds.h:17
Definition: visitor.h:11
Definition: allocator.h:9
std::unordered_map< K, V, Hasher, HashComparator > ASTHashMap
Definition: hash.h:114
auto && lhs
Definition: const_fold.cc:70
auto auto && rhs
Definition: const_fold.cc:70
STL namespace.
int64_t lower_
Definition: shrink_linear_indices.cc:19
int64_t upper_
Definition: shrink_linear_indices.cc:19