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);
156std::ostream &operator<<(std::ostream &out,
const IR::Vector<IR::Annotation> &v);
159void IR::IndexedVector<T>::visit_children(Visitor &v) {
160 for (
auto i = begin(); i != end();) {
161 auto n = v.apply_visitor(*i);
171 if (
auto l = n->template to<Vector<T>>()) {
173 i = insert(i, l->begin(), l->end());
174 i += l->Vector<T>::size();
177 if (
auto e = n->template to<T>()) {
181 BUG(
"visitor returned invalid type %s for IndexedVector<%s>", n->node_type_name(),
182 T::static_type_name());
186void IR::IndexedVector<T>::visit_children(Visitor &v)
const {
187 for (
auto &a : *
this) v.visit(a);
190void IR::IndexedVector<T>::toJSON(JSONGenerator &json)
const {
191 const char *sep =
"";
192 Vector<T>::toJSON(json);
193 json <<
"," << std::endl << json.indent++ <<
"\"declarations\" : {";
194 for (
const auto &k : declarations) {
195 json << sep << std::endl << json.indent << k.first <<
" : " << k.second;
200 json << std::endl << json.indent;
204IRNODE_DEFINE_APPLY_OVERLOAD(IndexedVector, template <class T>, <T>)
207static inline
void namemap_insert_helper(typename MAP::iterator, typename MAP::key_type k,
208 typename MAP::mapped_type v, MAP &, MAP &new_symbols) {
209 new_symbols.emplace(std::move(k), std::move(v));
212template <
class MAP,
class InputIterator>
213static inline void namemap_insert_helper(
typename MAP::iterator, InputIterator b, InputIterator e,
214 MAP &, MAP &new_symbols) {
215 new_symbols.insert(b, e);
219static inline void namemap_insert_helper(
typename ordered_map<cstring, T>::iterator it, cstring k,
220 T v, ordered_map<cstring, T> &symbols,
221 ordered_map<cstring, T> &) {
222 symbols.emplace_hint(it, std::move(k), std::move(v));
225template <
class T,
class InputIterator>
226static inline void namemap_insert_helper(
typename ordered_map<cstring, T>::iterator it,
227 InputIterator b, InputIterator e,
228 ordered_map<cstring, T> &symbols,
229 ordered_map<cstring, T> &) {
230 symbols.insert(it, b, e);
233template <
class T,
template <
class K,
class V,
class COMP,
class ALLOC>
class MAP ,
236void IR::NameMap<T, MAP, COMP, ALLOC>::visit_children(Visitor &v) {
238 for (
auto i = symbols.begin(); i != symbols.end();) {
239 const IR::Node *n = v.apply_visitor(i->second, i->first.c_str());
240 if (!n && i->second) {
241 i = symbols.erase(i);
245 if (n == i->second) {
249 if (
auto m = n->to<NameMap>()) {
250 namemap_insert_helper(i, m->symbols.begin(), m->symbols.end(), symbols, new_symbols);
251 i = symbols.erase(i);
254 if (
auto s = n->to<T>()) {
255 if (match_name(i->first, s)) {
259 namemap_insert_helper(i, cstring(obj_name(s)), std::move(s), symbols, new_symbols);
260 i = symbols.erase(i);
264 BUG(
"visitor returned invalid type %s for NameMap<%s>", n->node_type_name(),
265 T::static_type_name());
267 symbols.insert(new_symbols.begin(), new_symbols.end());
269template <
class T,
template <
class K,
class V,
class COMP,
class ALLOC>
class MAP ,
272void IR::NameMap<T, MAP, COMP, ALLOC>::visit_children(Visitor &v)
const {
273 for (
auto &k : symbols) {
274 v.visit(k.second, k.first.c_str());
277template <
class T,
template <
class K,
class V,
class COMP,
class ALLOC>
class MAP ,
280void IR::NameMap<T, MAP, COMP, ALLOC>::toJSON(JSONGenerator &json)
const {
281 const char *sep =
"";
283 json <<
"," << std::endl << json.indent++ <<
"\"symbols\" : {";
284 for (
auto &k : symbols) {
285 json << sep << std::endl << json.indent << k.first <<
" : " << k.second;
290 json << std::endl << json.indent;
295template <
class KEY,
class VALUE,
296 template <
class K,
class V,
class COMP,
class ALLOC>
class MAP ,
299void IR::NodeMap<KEY, VALUE, MAP, COMP, ALLOC>::visit_children(Visitor &v) {
301 for (
auto i = symbols.begin(); i != symbols.end();) {
304 if (!nk && i->first) {
305 i = symbols.erase(i);
306 }
else if (nk == i->first) {
311 i = symbols.erase(i);
316 if (nv) new_symbols.emplace(nk, nv);
317 i = symbols.erase(i);
320 symbols.insert(new_symbols.begin(), new_symbols.end());
322template <
class KEY,
class VALUE,
323 template <
class K,
class V,
class COMP,
class ALLOC>
class MAP ,
326void IR::NodeMap<KEY, VALUE, MAP, COMP, ALLOC>::visit_children(Visitor &v)
const {
327 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