24 virtual bool match(
const IR::Node *) = 0;
26 Pattern(Base *p) : pattern(p) {}
29 class MatchExt :
public Base {
33 bool match(
const IR::Node *n)
override {
return (m = n->
to<T>()); }
34 MatchExt(
const T *&m) : m(m) {}
37 class Const :
public Base {
41 bool match(
const IR::Node *n)
override {
42 if (
auto k = n->
to<IR::Constant>())
return k->value == value;
45 Const(big_int v) : value(v) {}
46 Const(
int v) : value(v) {}
49 class Unary :
public Base {
53 bool match(
const IR::Node *n)
override {
54 if (
auto b = n->
to<T>())
return expr->match(b->expr);
57 Unary(Base *e) : expr(e) {}
60 class Binary :
public Base {
65 bool match(
const IR::Node *n)
override {
66 if (
auto b = n->
to<T>()) {
67 if (left->match(b->left) && right->match(b->right))
return true;
68 if (commutative && left->match(b->right) && right->match(b->left))
return true;
72 Binary(Base *l, Base *r,
bool commute =
false) : left(l), right(r), commutative(commute) {}
77 class Match :
public Base {
81 bool match(
const IR::Node *n)
override {
return (m = n->
to<T>()); }
82 Match() : m(
nullptr) {}
83 const T *operator->()
const {
return m; }
84 operator const T *()
const {
return m; }
85 Pattern operator*(
const Pattern &a) {
return Pattern(*
this) * a; }
86 Pattern operator/(
const Pattern &a) {
return Pattern(*
this) / a; }
87 Pattern operator%(
const Pattern &a) {
return Pattern(*
this) % a; }
88 Pattern operator+(
const Pattern &a) {
return Pattern(*
this) + a; }
89 Pattern operator-(
const Pattern &a) {
return Pattern(*
this) - a; }
90 Pattern operator<<(
const Pattern &a) {
return Pattern(*
this) << a; }
91 Pattern operator>>(
const Pattern &a) {
return Pattern(*
this) >> a; }
92 Pattern operator==(
const Pattern &a) {
return Pattern(*
this) == a; }
93 Pattern operator!=(
const Pattern &a) {
return Pattern(*
this) != a; }
94 Pattern operator<(
const Pattern &a) {
return Pattern(*
this) < a; }
95 Pattern operator<=(
const Pattern &a) {
return Pattern(*
this) <= a; }
96 Pattern operator>(
const Pattern &a) {
return Pattern(*
this) > a; }
97 Pattern operator>=(
const Pattern &a) {
return Pattern(*
this) >= a; }
98 Pattern Relation(
const Pattern &a) {
return Pattern(*this).Relation(a); }
99 Pattern operator&(
const Pattern &a) {
return Pattern(*
this) & a; }
100 Pattern operator|(
const Pattern &a) {
return Pattern(*
this) | a; }
101 Pattern operator^(
const Pattern &a) {
return Pattern(*
this) ^ a; }
102 Pattern operator&&(
const Pattern &a) {
return Pattern(*
this) && a; }
103 Pattern operator||(
const Pattern &a) {
return Pattern(*
this) || a; }
105 Pattern operator+(
int a) {
return Pattern(*
this) + Pattern(a); }
106 Pattern operator-(
int a) {
return Pattern(*
this) - Pattern(a); }
107 Pattern operator==(
int a) {
return Pattern(*
this) == Pattern(a); }
108 Pattern operator!=(
int a) {
return Pattern(*
this) != Pattern(a); }
111 template <
class T = IR::AssignmentStatement>
112 class Assign :
public Base {
113 static_assert(std::is_base_of_v<IR::BaseAssignmentStatement, T>);
117 bool match(
const IR::Node *n)
override {
118 if (
auto as = n->
to<T>()) {
119 if (left->match(as->left) && right->match(as->right))
return true;
123 Assign(Base *l, Base *r) : left(l), right(r) {}
124 Assign(
const Pattern &l,
const Pattern &r) : left(l.pattern), right(r.pattern) {}
125 Assign(Base *l,
int val) : left(l), right(
new Const(val)) {}
126 Assign(Base *l, big_int val) : left(l), right(
new Const(val)) {}
130 Pattern(
const T *&m) : pattern(new MatchExt<T>(m)) {}
133 explicit Pattern(big_int v) : pattern(new Const(v)) {}
134 explicit Pattern(
int v) : pattern(new Const(v)) {}
135 Pattern operator-()
const {
return Pattern(
new Unary<IR::Neg>(pattern)); }
136 Pattern operator~()
const {
return Pattern(
new Unary<IR::Cmpl>(pattern)); }
137 Pattern operator!()
const {
return Pattern(
new Unary<IR::LNot>(pattern)); }
138 Pattern operator*(
const Pattern &r)
const {
139 return Pattern(
new Binary<IR::Mul>(pattern, r.pattern,
true));
141 Pattern operator/(
const Pattern &r)
const {
142 return Pattern(
new Binary<IR::Div>(pattern, r.pattern));
144 Pattern operator%(
const Pattern &r)
const {
145 return Pattern(
new Binary<IR::Mod>(pattern, r.pattern));
147 Pattern operator+(
const Pattern &r)
const {
148 return Pattern(
new Binary<IR::Add>(pattern, r.pattern,
true));
150 Pattern operator-(
const Pattern &r)
const {
151 return Pattern(
new Binary<IR::Sub>(pattern, r.pattern));
153 Pattern operator<<(
const Pattern &r)
const {
154 return Pattern(
new Binary<IR::Shl>(pattern, r.pattern));
156 Pattern operator>>(
const Pattern &r)
const {
157 return Pattern(
new Binary<IR::Shr>(pattern, r.pattern));
159 Pattern operator==(
const Pattern &r)
const {
160 return Pattern(
new Binary<IR::Equ>(pattern, r.pattern,
true));
162 Pattern operator!=(
const Pattern &r)
const {
163 return Pattern(
new Binary<IR::Neq>(pattern, r.pattern,
true));
165 Pattern operator<(
const Pattern &r)
const {
166 return Pattern(
new Binary<IR::Lss>(pattern, r.pattern));
168 Pattern operator<=(
const Pattern &r)
const {
169 return Pattern(
new Binary<IR::Leq>(pattern, r.pattern));
171 Pattern operator>(
const Pattern &r)
const {
172 return Pattern(
new Binary<IR::Grt>(pattern, r.pattern));
174 Pattern operator>=(
const Pattern &r)
const {
175 return Pattern(
new Binary<IR::Geq>(pattern, r.pattern));
177 Pattern Relation(
const Pattern &r)
const {
178 return Pattern(
new Binary<IR::Operation::Relation>(pattern, r.pattern,
true));
180 Pattern operator&(
const Pattern &r)
const {
181 return Pattern(
new Binary<IR::BAnd>(pattern, r.pattern,
true));
183 Pattern operator|(
const Pattern &r)
const {
184 return Pattern(
new Binary<IR::BOr>(pattern, r.pattern,
true));
186 Pattern operator^(
const Pattern &r)
const {
187 return Pattern(
new Binary<IR::BXor>(pattern, r.pattern,
true));
189 Pattern operator&&(
const Pattern &r)
const {
190 return Pattern(
new Binary<IR::LAnd>(pattern, r.pattern));
192 Pattern operator||(
const Pattern &r)
const {
193 return Pattern(
new Binary<IR::LOr>(pattern, r.pattern));
201 return *
this == Pattern(m);
208 Pattern operator==(
const Match<T> &m)
const {
209 return *
this == Pattern(m);
212 bool match(
const IR::Node *n) {
return pattern->match(n); }
std::pair< HalfOpenRange< Unit, Order >, HalfOpenRange< Unit, Order > > operator-(HalfOpenRange< Unit, Order > left, HalfOpenRange< Unit, Order > right)
Definition lib/bitrange.h:716