17#ifndef IR_IR_INLINE_H_
18#define IR_IR_INLINE_H_
21#include "ir/indexed_vector.h"
22#include "ir/json_generator.h"
23#include "ir/namemap.h"
24#include "ir/nodemap.h"
25#include "ir/visitor.h"
26#include "lib/ordered_map.h"
30#define DEFINE_APPLY_FUNCTIONS(CLASS, TEMPLATE, TT, INLINE) \
31 TEMPLATE INLINE bool IR::CLASS TT::apply_visitor_preorder(Modifier &v) { \
32 Node::traceVisit("Mod pre"); \
33 return v.preorder(this); \
35 TEMPLATE INLINE void IR::CLASS TT::apply_visitor_postorder(Modifier &v) { \
36 Node::traceVisit("Mod post"); \
39 TEMPLATE INLINE void IR::CLASS TT::apply_visitor_revisit(Modifier &v, const Node *n) const { \
40 Node::traceVisit("Mod revisit"); \
43 TEMPLATE INLINE void IR::CLASS TT::apply_visitor_loop_revisit(Modifier &v) const { \
44 Node::traceVisit("Mod loop_revisit"); \
45 v.loop_revisit(this); \
47 TEMPLATE INLINE bool IR::CLASS TT::apply_visitor_preorder(Inspector &v) const { \
48 Node::traceVisit("Insp pre"); \
49 return v.preorder(this); \
51 TEMPLATE INLINE void IR::CLASS TT::apply_visitor_postorder(Inspector &v) const { \
52 Node::traceVisit("Insp post"); \
55 TEMPLATE INLINE void IR::CLASS TT::apply_visitor_revisit(Inspector &v) const { \
56 Node::traceVisit("Insp revisit"); \
59 TEMPLATE INLINE void IR::CLASS TT::apply_visitor_loop_revisit(Inspector &v) const { \
60 Node::traceVisit("Insp loop_revisit"); \
61 v.loop_revisit(this); \
63 TEMPLATE INLINE const IR::Node *IR::CLASS TT::apply_visitor_preorder(Transform &v) { \
64 Node::traceVisit("Trans pre"); \
65 return v.preorder(this); \
67 TEMPLATE INLINE const IR::Node *IR::CLASS TT::apply_visitor_postorder(Transform &v) { \
68 Node::traceVisit("Trans post"); \
69 return v.postorder(this); \
71 TEMPLATE INLINE void IR::CLASS TT::apply_visitor_revisit(Transform &v, const Node *n) const { \
72 Node::traceVisit("Trans revisit"); \
75 TEMPLATE INLINE void IR::CLASS TT::apply_visitor_loop_revisit(Transform &v) const { \
76 Node::traceVisit("Trans loop_revisit"); \
77 v.loop_revisit(this); \
80IRNODE_ALL_TEMPLATES(DEFINE_APPLY_FUNCTIONS,
inline)
83void IR::Vector<T>::visit_children(Visitor &v) {
84 for (
auto i = vec.begin(); i != vec.end();) {
85 const IR::Node *n = v.apply_visitor(*i);
95 if (
auto l = n->to<Vector<T>>()) {
97 i = insert(i, l->vec.begin(), l->vec.end());
101 if (
const auto *v = n->to<VectorBase>()) {
105 i = insert(i, v->size() - 1, nullptr);
106 for (const auto *el : *v) {
108 if (auto e = el->template to<T>()) {
111 BUG(
"visitor returned invalid type %s for Vector<%s>", el->node_type_name(),
112 T::static_type_name());
118 if (
auto e = n->to<T>()) {
122 BUG(
"visitor returned invalid type %s for Vector<%s>", n->node_type_name(),
123 T::static_type_name());
127void IR::Vector<T>::visit_children(Visitor &v)
const {
128 for (
auto &a : vec) v.visit(a);
131void IR::Vector<T>::parallel_visit_children(Visitor &v) {
132 SplitFlowVisitVector<T>(v, *
this).run_visit();
135void IR::Vector<T>::parallel_visit_children(Visitor &v)
const {
136 SplitFlowVisitVector<T>(v, *
this).run_visit();
138IRNODE_DEFINE_APPLY_OVERLOAD(Vector, template <class T>, <T>)
140void IR::Vector<T>::toJSON(JSONGenerator &json)
const {
141 const char *sep =
"";
143 json <<
"," << std::endl << json.indent++ <<
"\"vec\" : [";
144 for (
auto &k : vec) {
145 json << sep << std::endl << json.indent << k;
150 json << std::endl << json.indent;
155std::ostream &operator<<(std::ostream &out,
const IR::Vector<IR::Expression> &v);
158void IR::IndexedVector<T>::visit_children(Visitor &v) {
159 for (
auto i = begin(); i != end();) {
160 auto n = v.apply_visitor(*i);
170 if (
auto l = n->template to<Vector<T>>()) {
172 i = insert(i, l->begin(), l->end());
173 i += l->Vector<T>::size();
176 if (
auto e = n->template to<T>()) {
180 BUG(
"visitor returned invalid type %s for IndexedVector<%s>", n->node_type_name(),
181 T::static_type_name());
185void IR::IndexedVector<T>::visit_children(Visitor &v)
const {
186 for (
auto &a : *
this) v.visit(a);
189void IR::IndexedVector<T>::toJSON(JSONGenerator &json)
const {
190 const char *sep =
"";
191 Vector<T>::toJSON(json);
192 json <<
"," << std::endl << json.indent++ <<
"\"declarations\" : {";
193 for (
const auto &k : declarations) {
194 json << sep << std::endl << json.indent << k.first <<
" : " << k.second;
199 json << std::endl << json.indent;
203IRNODE_DEFINE_APPLY_OVERLOAD(IndexedVector, template <class T>, <T>)
206static inline
void namemap_insert_helper(typename MAP::iterator, typename MAP::key_type k,
207 typename MAP::mapped_type v, MAP &, MAP &new_symbols) {
208 new_symbols.emplace(std::move(k), std::move(v));
211template <
class MAP,
class InputIterator>
212static inline void namemap_insert_helper(
typename MAP::iterator, InputIterator b, InputIterator e,
213 MAP &, MAP &new_symbols) {
214 new_symbols.insert(b, e);
218static inline void namemap_insert_helper(
typename ordered_map<cstring, T>::iterator it, cstring k,
219 T v, ordered_map<cstring, T> &symbols,
220 ordered_map<cstring, T> &) {
221 symbols.emplace_hint(it, std::move(k), std::move(v));
224template <
class T,
class InputIterator>
225static inline void namemap_insert_helper(
typename ordered_map<cstring, T>::iterator it,
226 InputIterator b, InputIterator e,
227 ordered_map<cstring, T> &symbols,
228 ordered_map<cstring, T> &) {
229 symbols.insert(it, b, e);
232template <
class T,
template <
class K,
class V,
class COMP,
class ALLOC>
class MAP ,
235void IR::NameMap<T, MAP, COMP, ALLOC>::visit_children(Visitor &v) {
237 for (
auto i = symbols.begin(); i != symbols.end();) {
238 const IR::Node *n = v.apply_visitor(i->second, i->first.c_str());
239 if (!n && i->second) {
240 i = symbols.erase(i);
244 if (n == i->second) {
248 if (
auto m = n->to<NameMap>()) {
249 namemap_insert_helper(i, m->symbols.begin(), m->symbols.end(), symbols, new_symbols);
250 i = symbols.erase(i);
253 if (
auto s = n->to<T>()) {
254 if (match_name(i->first, s)) {
258 namemap_insert_helper(i, cstring(obj_name(s)), std::move(s), symbols, new_symbols);
259 i = symbols.erase(i);
263 BUG(
"visitor returned invalid type %s for NameMap<%s>", n->node_type_name(),
264 T::static_type_name());
266 symbols.insert(new_symbols.begin(), new_symbols.end());
268template <
class T,
template <
class K,
class V,
class COMP,
class ALLOC>
class MAP ,
271void IR::NameMap<T, MAP, COMP, ALLOC>::visit_children(Visitor &v)
const {
272 for (
auto &k : symbols) {
273 v.visit(k.second, k.first.c_str());
276template <
class T,
template <
class K,
class V,
class COMP,
class ALLOC>
class MAP ,
279void IR::NameMap<T, MAP, COMP, ALLOC>::toJSON(JSONGenerator &json)
const {
280 const char *sep =
"";
282 json <<
"," << std::endl << json.indent++ <<
"\"symbols\" : {";
283 for (
auto &k : symbols) {
284 json << sep << std::endl << json.indent << k.first <<
" : " << k.second;
289 json << std::endl << json.indent;
294template <
class KEY,
class VALUE,
295 template <
class K,
class V,
class COMP,
class ALLOC>
class MAP ,
298void IR::NodeMap<KEY, VALUE, MAP, COMP, ALLOC>::visit_children(Visitor &v) {
300 for (
auto i = symbols.begin(); i != symbols.end();) {
303 if (!nk && i->first) {
304 i = symbols.erase(i);
305 }
else if (nk == i->first) {
310 i = symbols.erase(i);
315 if (nv) new_symbols.emplace(nk, nv);
316 i = symbols.erase(i);
319 symbols.insert(new_symbols.begin(), new_symbols.end());
321template <
class KEY,
class VALUE,
322 template <
class K,
class V,
class COMP,
class ALLOC>
class MAP ,
325void IR::NodeMap<KEY, VALUE, MAP, COMP, ALLOC>::visit_children(Visitor &v)
const {
326 for (
auto &k : symbols) {
The namespace encapsulating IR node classes.
TODO: this is not really specific to BMV2, it should reside somewhere else.
Definition applyOptionsPragmas.cpp:24