FreeTensor
Loading...
Searching...
No Matches
comp_unique_bounds.h
Go to the documentation of this file.
1#ifndef FREE_TENSOR_COMP_UNIQUE_BOUNDS_H
2#define FREE_TENSOR_COMP_UNIQUE_BOUNDS_H
3
4#include <optional>
5#include <string>
6#include <unordered_map>
7#include <unordered_set>
8
10
11namespace freetensor {
12
14 public:
16
17 class Bound {
18 protected:
19 static int
20 countScope(const Expr &op,
21 const std::unordered_map<std::string, int> &orderedScope);
22 static int countHeavyOps(const Expr &op);
23
24 public:
25 virtual ~Bound() {}
26
27 virtual BoundType type() const = 0;
28
35 virtual int64_t lowerInt() const = 0;
36 virtual int64_t upperInt() const = 0;
42 virtual std::optional<int64_t> getInt() const = 0;
43
49 virtual Expr lowerExpr() const = 0;
50 virtual Expr upperExpr() const = 0;
53 virtual Ref<Bound>
54 restrictScope(const std::unordered_set<std::string> &scope) const = 0;
55
57 const Expr &reference,
58 const std::unordered_map<std::string, int> &orderedScope) const = 0;
59 };
60
61 protected:
63
64 public:
66 : transients_(transients) {}
67 virtual ~CompUniqueBounds() {}
68
69 virtual Ref<Bound> getBound(const Expr &op) = 0;
70
71 int64_t getIntLower(const Expr &op) { return getBound(op)->lowerInt(); }
72 int64_t getIntUpper(const Expr &op) { return getBound(op)->upperInt(); }
73 std::optional<int64_t> getInt(const Expr &op) {
74 return getBound(op)->getInt();
75 }
76
77 virtual bool alwaysLT(const Expr &lhs, const Expr &rhs) = 0;
78 virtual bool alwaysLE(const Expr &lhs, const Expr &rhs) = 0;
79
80 virtual std::pair<Expr, Expr>
81 unionBounds(const std::vector<Ref<Bound>> &bounds) = 0;
82};
83
84} // namespace freetensor
85
86#endif // FREE_TENSOR_COMP_UNIQUE_BOUNDS_H
Definition: comp_transient_bounds.h:24
Definition: comp_unique_bounds.h:17
static int countScope(const Expr &op, const std::unordered_map< std::string, int > &orderedScope)
Definition: comp_unique_bounds.cc:33
virtual BoundType type() const =0
virtual ~Bound()
Definition: comp_unique_bounds.h:25
virtual Expr simplestExpr(const Expr &reference, const std::unordered_map< std::string, int > &orderedScope) const =0
virtual std::optional< int64_t > getInt() const =0
virtual Ref< Bound > restrictScope(const std::unordered_set< std::string > &scope) const =0
static int countHeavyOps(const Expr &op)
Definition: comp_unique_bounds.cc:27
virtual int64_t upperInt() const =0
virtual Expr lowerExpr() const =0
virtual Expr upperExpr() const =0
virtual int64_t lowerInt() const =0
Definition: comp_unique_bounds.h:13
virtual std::pair< Expr, Expr > unionBounds(const std::vector< Ref< Bound > > &bounds)=0
int64_t getIntLower(const Expr &op)
Definition: comp_unique_bounds.h:71
virtual bool alwaysLE(const Expr &lhs, const Expr &rhs)=0
virtual ~CompUniqueBounds()
Definition: comp_unique_bounds.h:67
int64_t getIntUpper(const Expr &op)
Definition: comp_unique_bounds.h:72
virtual bool alwaysLT(const Expr &lhs, const Expr &rhs)=0
CompUniqueBounds(const CompTransientBoundsInterface &transients)
Definition: comp_unique_bounds.h:65
virtual Ref< Bound > getBound(const Expr &op)=0
std::optional< int64_t > getInt(const Expr &op)
Definition: comp_unique_bounds.h:73
BoundType
Definition: comp_unique_bounds.h:15
const CompTransientBoundsInterface & transients_
Definition: comp_unique_bounds.h:62
Definition: allocator.h:9
auto && lhs
Definition: const_fold.cc:70
auto auto && rhs
Definition: const_fold.cc:70