Jlm
region.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2010 2011 2012 Helge Bahmann <hcb@chaoticmind.net>
3  * Copyright 2011 2012 2013 2014 2015 2016 Nico Reißmann <nico.reissmann@gmail.com>
4  * See COPYING for terms of redistribution.
5  */
6 
7 #ifndef JLM_RVSDG_REGION_HPP
8 #define JLM_RVSDG_REGION_HPP
9 
10 #include <jlm/rvsdg/node.hpp>
11 #include <jlm/util/common.hpp>
13 
14 namespace jlm::util
15 {
16 class Annotation;
17 class AnnotationMap;
18 }
19 
20 namespace jlm::rvsdg
21 {
22 
23 class Node;
24 class SimpleNode;
25 class SimpleOperation;
26 class StructuralInput;
27 class StructuralNode;
28 class StructuralOutput;
29 class SubstitutionMap;
30 class RegionObserver;
31 
40 class RegionArgument : public Output
41 {
43 
44 public:
47 
48  ~RegionArgument() noexcept override;
49 
51  rvsdg::Region * region,
53  std::shared_ptr<const rvsdg::Type> type);
54 
55  RegionArgument(const RegionArgument &) = delete;
56 
58 
60  operator=(const RegionArgument &) = delete;
61 
63  operator=(RegionArgument &&) = delete;
64 
65  [[nodiscard]] std::string
66  debug_string() const override;
67 
68  [[nodiscard]] StructuralInput *
69  input() const noexcept
70  {
71  return input_;
72  }
73 
82  virtual RegionArgument &
84 
103  static RegionArgument &
104  Create(rvsdg::Region & region, StructuralInput * input, std::shared_ptr<const rvsdg::Type> type);
105 
106 private:
108 };
109 
119 class RegionResult : public Input
120 {
122 
123 public:
126 
127  ~RegionResult() noexcept override;
128 
129  RegionResult(
130  rvsdg::Region * region,
131  rvsdg::Output * origin,
133  std::shared_ptr<const rvsdg::Type> type);
134 
135  RegionResult(const RegionResult &) = delete;
136 
138 
139  RegionResult &
140  operator=(const RegionResult &) = delete;
141 
142  RegionResult &
143  operator=(RegionResult &&) = delete;
144 
145  [[nodiscard]] std::string
146  debug_string() const override;
147 
148  [[nodiscard]] StructuralOutput *
149  output() const noexcept
150  {
151  return output_;
152  }
153 
163  virtual RegionResult &
165 
187  static RegionResult &
188  Create(
192  std::shared_ptr<const rvsdg::Type> type);
193 
194 private:
196 };
197 
212 class Region
213 {
214  using RegionArgumentIterator = std::vector<RegionArgument *>::iterator;
215  using RegionArgumentConstIterator = std::vector<RegionArgument *>::const_iterator;
218 
219  using RegionResultIterator = std::vector<RegionResult *>::iterator;
220  using RegionResultConstIterator = std::vector<RegionResult *>::const_iterator;
223 
227 
228  using TopNodeIterator = region_top_node_list::Iterator;
229  using TopNodeConstIterator = region_top_node_list::ConstIterator;
232 
233  using NodeIterator = region_nodes_list::Iterator;
234  using NodeConstIterator = region_nodes_list::ConstIterator;
237 
238  using BottomNodeIterator = region_bottom_node_list::Iterator;
239  using BottomNodeConstIterator = region_bottom_node_list::ConstIterator;
242 
243 public:
244  using Id = uint64_t;
245 
246  ~Region() noexcept;
247 
248  Region(rvsdg::Region * parent, Graph * graph);
249 
250  Region(rvsdg::StructuralNode * node, size_t index);
251 
252  Region(const Region &) = delete;
253 
254  Region &
255  operator=(const Region &) = delete;
256 
262  [[nodiscard]] Id
263  getRegionId() const noexcept
264  {
265  return id_;
266  }
267 
271  [[nodiscard]] RegionArgumentRange
272  Arguments() noexcept
273  {
274  return { arguments_.begin(), arguments_.end() };
275  }
276 
280  [[nodiscard]] RegionArgumentConstRange
281  Arguments() const noexcept
282  {
283  return { arguments_.begin(), arguments_.end() };
284  }
285 
289  [[nodiscard]] RegionResultRange
290  Results() noexcept
291  {
292  return { results_.begin(), results_.end() };
293  }
294 
298  [[nodiscard]] RegionResultConstRange
299  Results() const noexcept
300  {
301  return { results_.begin(), results_.end() };
302  }
303 
308  [[nodiscard]] TopNodeRange
309  TopNodes() noexcept
310  {
311  return { topNodes_.begin(), topNodes_.end() };
312  }
313 
318  [[nodiscard]] TopNodeConstRange
319  TopNodes() const noexcept
320  {
321  return { topNodes_.begin(), topNodes_.end() };
322  }
323 
327  [[nodiscard]] NodeRange
328  Nodes() noexcept
329  {
330  return { nodes_.begin(), nodes_.end() };
331  }
332 
336  [[nodiscard]] NodeConstRange
337  Nodes() const noexcept
338  {
339  return { nodes_.begin(), nodes_.end() };
340  }
341 
346  [[nodiscard]] BottomNodeRange
347  BottomNodes() noexcept
348  {
349  return { bottomNodes_.begin(), bottomNodes_.end() };
350  }
351 
356  [[nodiscard]] BottomNodeConstRange
357  BottomNodes() const noexcept
358  {
359  return { bottomNodes_.begin(), bottomNodes_.end() };
360  }
361 
362  [[nodiscard]] Graph *
363  graph() const noexcept
364  {
365  return graph_;
366  }
367 
368  inline rvsdg::StructuralNode *
369  node() const noexcept
370  {
371  return node_;
372  }
373 
374  size_t
375  index() const noexcept
376  {
377  return index_;
378  }
379 
385  [[nodiscard]] bool
386  IsRootRegion() const noexcept;
387 
396  addArgument(std::unique_ptr<RegionArgument> argument);
397 
409  insertArgument(size_t index, std::unique_ptr<RegionArgument> argument);
410 
419  size_t
420  RemoveArguments(const util::HashSet<size_t> & indices);
421 
427  size_t
428  PruneArguments();
429 
430  inline size_t
431  narguments() const noexcept
432  {
433  return arguments_.size();
434  }
435 
436  inline RegionArgument *
437  argument(size_t index) const noexcept
438  {
440  return arguments_[index];
441  }
442 
450  RegionResult &
451  addResult(std::unique_ptr<RegionResult> result);
452 
461  size_t
462  RemoveResults(const util::HashSet<size_t> & indices);
463 
464  inline size_t
465  nresults() const noexcept
466  {
467  return results_.size();
468  }
469 
470  [[nodiscard]] RegionResult *
471  result(size_t index) const noexcept
472  {
474  return results_[index];
475  }
476 
480  [[nodiscard]] size_t
481  numNodes() const noexcept
482  {
483  return numNodes_;
484  }
485 
489  [[nodiscard]] size_t
490  numTopNodes() const noexcept
491  {
492  return numTopNodes_;
493  }
494 
498  [[nodiscard]] size_t
499  numBottomNodes() const noexcept
500  {
501  return numBottomNodes_;
502  }
503 
509  void
510  removeNode(Node * node);
511 
522  void
523  copy(Region * target, SubstitutionMap & smap) const;
524 
529  void
530  prune(bool recursive);
531 
537  void
538  view() const;
539 
543  [[nodiscard]] Node::Id
544  getNextNodeId() const noexcept
545  {
546  return nextNodeId_;
547  }
548 
549 private:
557  void
559 
566  void
568 
576  void
578 
585  void
587 
594  void
595  onNodeAdded(Node & node);
596 
603  void
605 
612  [[nodiscard]] Node::Id
613  generateNodeId() noexcept
614  {
615  const auto nodeId = nextNodeId_;
616  nextNodeId_++;
617  return nodeId;
618  }
619 
620  void
622 
623  void
625 
626  void
627  notifyInputCreate(Input * input);
628 
629  void
630  notifyInputChange(Input * input, Output * old_origin, Output * new_origin);
631 
632  void
633  notifyInputDestroy(Input * input);
634 
635 public:
645  template<class Operation>
646  static inline bool
647  ContainsOperation(const rvsdg::Region & region, bool checkSubregions);
648 
658  template<class NodeType>
659  static inline bool
660  ContainsNodeType(const rvsdg::Region & region, bool checkSubregions);
661 
670  [[nodiscard]] static size_t
671  NumRegions(const rvsdg::Region & region) noexcept;
672 
697  [[nodiscard]] static std::string
698  ToTree(const rvsdg::Region & region, const util::AnnotationMap & annotationMap) noexcept;
699 
720  [[nodiscard]] static std::string
721  ToTree(const rvsdg::Region & region) noexcept;
722 
723 private:
724  static void
725  ToTree(
726  const rvsdg::Region & region,
727  const util::AnnotationMap & annotationMap,
728  size_t indentationDepth,
729  std::stringstream & stream) noexcept;
730 
731  [[nodiscard]] static std::string
733  const void * key,
734  const util::AnnotationMap & annotationMap,
735  char annotationSeparator,
736  char labelValueSeparator);
737 
738  [[nodiscard]] static std::string
739  ToString(
740  const std::vector<util::Annotation> & annotations,
741  char annotationSeparator,
742  char labelValueSeparator);
743 
744  [[nodiscard]] static std::string
745  ToString(const util::Annotation & annotation, char labelValueSeparator);
746 
748  size_t index_;
752 
753  // The region owns its results, arguments and nodes
754  std::vector<RegionResult *> results_;
755  std::vector<RegionArgument *> arguments_;
757  size_t numTopNodes_;
761  size_t numNodes_;
762 
763  // Allow RegionObservers to register themselves on const Regions
764  mutable RegionObserver * observers_ = nullptr;
765 
766  friend class Node;
767  friend class RegionObserver;
768  friend class SimpleNode;
769  friend class StructuralNode;
770  friend class Input;
771  friend class Output;
772  friend class RegionResult;
773 };
774 
783 {
784 public:
785  virtual ~RegionObserver() noexcept;
786 
787  explicit RegionObserver(const Region & region);
788 
789  RegionObserver(const RegionObserver &) = delete;
790 
792  operator=(const RegionObserver &) = delete;
793 
799  virtual void
800  onNodeCreate(Node * node) = 0;
801 
807  virtual void
808  onNodeDestroy(Node * node) = 0;
809 
815  virtual void
816  onInputCreate(Input * input) = 0;
817 
824  virtual void
825  onInputChange(Input * input, Output * old_origin, Output * new_origin) = 0;
826 
832  virtual void
833  onInputDestroy(Input * input) = 0;
834 
835 private:
838 
839  friend class Region;
840 };
841 
845 class RecordingObserver final : public RegionObserver
846 {
847 public:
848  ~RecordingObserver() noexcept override = default;
849 
850  explicit RecordingObserver(const Region & region)
851  : RegionObserver(region)
852  {}
853 
854  void
855  onInputDestroy(Input * input) override
856  {
857  destroyedInputIndices_.push_back(input->index());
858  }
859 
860  const std::vector<size_t> &
861  destroyedInputIndices() const noexcept
862  {
863  return destroyedInputIndices_;
864  }
865 
866  void
867  onNodeCreate(Node * node) override
868  {
869  createNodes_.push_back(node->GetNodeId());
870  }
871 
872  const std::vector<Node::Id> &
873  createdNodes() const noexcept
874  {
875  return createNodes_;
876  }
877 
878  void
879  onNodeDestroy(Node * node) override
880  {
881  destroyedNodes_.push_back(node->GetNodeId());
882  }
883 
884  const std::vector<Node::Id> &
885  destroyedNodes() const noexcept
886  {
887  return destroyedNodes_;
888  }
889 
890  void
891  onInputCreate(Input * input) override
892  {
893  createdInputIndices_.push_back(input->index());
894  }
895 
896  const std::vector<size_t> &
897  createdInputIndices() const noexcept
898  {
899  return createdInputIndices_;
900  }
901 
902  void
903  onInputChange(Input * input, Output *, Output *) override
904  {
905  changedInputIndices_.push_back(input->index());
906  }
907 
908  const std::vector<size_t> &
909  changedInputIndices() const noexcept
910  {
911  return changedInputIndices_;
912  }
913 
914 private:
915  std::vector<Node::Id> createNodes_{};
916  std::vector<Node::Id> destroyedNodes_{};
917  std::vector<size_t> createdInputIndices_{};
918  std::vector<size_t> changedInputIndices_{};
919  std::vector<size_t> destroyedInputIndices_{};
920 };
921 
928 std::unordered_map<const Node *, size_t>
929 computeDepthMap(const Region & region);
930 
931 static inline void
932 remove(Node * node)
933 {
934  return node->region()->removeNode(node);
935 }
936 
937 size_t
938 nnodes(const rvsdg::Region * region) noexcept;
939 
940 size_t
941 nstructnodes(const rvsdg::Region * region) noexcept;
942 
943 size_t
944 nsimpnodes(const rvsdg::Region * region) noexcept;
945 
946 size_t
947 ninputs(const rvsdg::Region * region) noexcept;
948 
970 template<typename NodeType>
971 inline NodeType *
972 TryGetRegionParentNode(const rvsdg::Input & input) noexcept
973 {
974  auto region = TryGetOwnerRegion(input);
975  if (region)
976  {
977  return dynamic_cast<NodeType *>(region->node());
978  }
979  else
980  {
981  return nullptr;
982  }
983 }
984 
1006 template<typename NodeType>
1007 inline NodeType *
1008 TryGetRegionParentNode(const rvsdg::Output & output) noexcept
1009 {
1010  auto region = TryGetOwnerRegion(output);
1011  if (region)
1012  {
1013  return dynamic_cast<NodeType *>(region->node());
1014  }
1015  else
1016  {
1017  return nullptr;
1018  }
1019 }
1020 
1040 template<typename NodeType>
1041 inline NodeType &
1043 {
1044  auto node = TryGetRegionParentNode<NodeType>(input);
1045  if (!node)
1046  {
1047  throw std::logic_error(std::string("expected node of type ") + typeid(NodeType).name());
1048  }
1049  return *node;
1050 }
1051 
1071 template<typename NodeType>
1072 inline NodeType &
1074 {
1075  auto node = TryGetRegionParentNode<NodeType>(output);
1076  if (!node)
1077  {
1078  throw std::logic_error(std::string("expected node of type ") + typeid(NodeType).name());
1079  }
1080  return *node;
1081 }
1082 
1083 } // namespace
1084 
1085 #endif
Output * origin() const noexcept
Definition: node.hpp:58
size_t index() const noexcept
Definition: node.hpp:52
Region * region() const noexcept
Definition: node.cpp:83
uint64_t Id
Definition: node.hpp:583
Id GetNodeId() const noexcept
Definition: node.hpp:600
rvsdg::Region * region() const noexcept
Definition: node.hpp:761
rvsdg::Region * region() const noexcept
Definition: node.cpp:151
std::vector< size_t > createdInputIndices_
Definition: region.hpp:917
std::vector< size_t > changedInputIndices_
Definition: region.hpp:918
std::vector< Node::Id > destroyedNodes_
Definition: region.hpp:916
void onInputDestroy(Input *input) override
Definition: region.hpp:855
std::vector< Node::Id > createNodes_
Definition: region.hpp:915
~RecordingObserver() noexcept override=default
std::vector< size_t > destroyedInputIndices_
Definition: region.hpp:919
const std::vector< Node::Id > & destroyedNodes() const noexcept
Definition: region.hpp:885
void onInputCreate(Input *input) override
Definition: region.hpp:891
const std::vector< size_t > & createdInputIndices() const noexcept
Definition: region.hpp:897
const std::vector< Node::Id > & createdNodes() const noexcept
Definition: region.hpp:873
void onNodeCreate(Node *node) override
Definition: region.hpp:867
const std::vector< size_t > & changedInputIndices() const noexcept
Definition: region.hpp:909
void onNodeDestroy(Node *node) override
Definition: region.hpp:879
void onInputChange(Input *input, Output *, Output *) override
Definition: region.hpp:903
const std::vector< size_t > & destroyedInputIndices() const noexcept
Definition: region.hpp:861
Represents the argument of a region.
Definition: region.hpp:41
util::IntrusiveListAnchor< RegionArgument > structural_input_anchor_
Definition: region.hpp:42
std::string debug_string() const override
Definition: region.cpp:50
virtual RegionArgument & Copy(Region &region, StructuralInput *input) const
Definition: region.cpp:56
StructuralInput * input() const noexcept
Definition: region.hpp:69
~RegionArgument() noexcept override
Definition: region.cpp:22
StructuralInput * input_
Definition: region.hpp:107
static RegionArgument & Create(rvsdg::Region &region, StructuralInput *input, std::shared_ptr< const rvsdg::Type > type)
Creates region entry argument.
Definition: region.cpp:62
util::IntrusiveListAccessor< RegionArgument, &RegionArgument::structural_input_anchor_ > structural_input_accessor
Definition: region.hpp:46
Proxy object to observe changes to a region.
Definition: region.hpp:783
virtual void onInputChange(Input *input, Output *old_origin, Output *new_origin)=0
virtual ~RegionObserver() noexcept
Definition: region.cpp:588
virtual void onNodeCreate(Node *node)=0
virtual void onNodeDestroy(Node *node)=0
virtual void onInputCreate(Input *input)=0
RegionObserver(const RegionObserver &)=delete
virtual void onInputDestroy(Input *input)=0
RegionObserver & operator=(const RegionObserver &)=delete
RegionObserver ** pprev_
Definition: region.hpp:836
RegionObserver * next_
Definition: region.hpp:837
RegionObserver(const Region &region)
Definition: region.cpp:597
Represents the result of a region.
Definition: region.hpp:120
StructuralOutput * output() const noexcept
Definition: region.hpp:149
StructuralOutput * output_
Definition: region.hpp:195
~RegionResult() noexcept override
Definition: region.cpp:70
util::IntrusiveListAccessor< RegionResult, &RegionResult::structural_output_anchor_ > structural_output_accessor
Definition: region.hpp:125
virtual RegionResult & Copy(rvsdg::Output &origin, StructuralOutput *output) const
Definition: region.cpp:105
util::IntrusiveListAnchor< RegionResult > structural_output_anchor_
Definition: region.hpp:121
std::string debug_string() const override
Definition: region.cpp:99
static RegionResult & Create(rvsdg::Region &region, rvsdg::Output &origin, StructuralOutput *output, std::shared_ptr< const rvsdg::Type > type)
Create region exit result.
Definition: region.cpp:111
Represent acyclic RVSDG subgraphs.
Definition: region.hpp:213
RegionResult * result(size_t index) const noexcept
Definition: region.hpp:471
size_t RemoveResults(const util::HashSet< size_t > &indices)
Definition: region.cpp:278
RegionArgument & addArgument(std::unique_ptr< RegionArgument > argument)
Definition: region.cpp:176
util::IteratorRange< NodeIterator > NodeRange
Definition: region.hpp:235
std::vector< RegionResult * >::const_iterator RegionResultConstIterator
Definition: region.hpp:220
void notifyNodeDestroy(Node *node)
Definition: region.cpp:417
RegionArgumentRange Arguments() noexcept
Definition: region.hpp:272
void copy(Region *target, SubstitutionMap &smap) const
Copy a region with substitutions.
Definition: region.cpp:314
Node::Id generateNodeId() noexcept
Definition: region.hpp:613
NodeConstRange Nodes() const noexcept
Definition: region.hpp:337
BottomNodeRange BottomNodes() noexcept
Definition: region.hpp:347
BottomNodeConstRange BottomNodes() const noexcept
Definition: region.hpp:357
util::IteratorRange< BottomNodeConstIterator > BottomNodeConstRange
Definition: region.hpp:241
static std::string ToString(const std::vector< util::Annotation > &annotations, char annotationSeparator, char labelValueSeparator)
Definition: region.cpp:545
util::IteratorRange< RegionArgumentConstIterator > RegionArgumentConstRange
Definition: region.hpp:217
static bool ContainsOperation(const rvsdg::Region &region, bool checkSubregions)
size_t numNodes() const noexcept
Definition: region.hpp:481
region_nodes_list nodes_
Definition: region.hpp:760
void view() const
Definition: region.cpp:342
util::IteratorRange< RegionArgumentIterator > RegionArgumentRange
Definition: region.hpp:216
Node::Id getNextNodeId() const noexcept
Definition: region.hpp:544
region_top_node_list::ConstIterator TopNodeConstIterator
Definition: region.hpp:229
TopNodeConstRange TopNodes() const noexcept
Definition: region.hpp:319
util::IteratorRange< NodeConstIterator > NodeConstRange
Definition: region.hpp:236
util::IteratorRange< TopNodeIterator > TopNodeRange
Definition: region.hpp:230
static std::string ToTree(const rvsdg::Region &region, const util::AnnotationMap &annotationMap) noexcept
Definition: region.cpp:471
void onNodeRemoved(Node &node)
Definition: region.cpp:400
rvsdg::StructuralNode * node() const noexcept
Definition: region.hpp:369
void onNodeAdded(Node &node)
Adds node to the list of nodes in the region.
Definition: region.cpp:392
region_top_node_list::Iterator TopNodeIterator
Definition: region.hpp:228
Graph * graph() const noexcept
Definition: region.hpp:363
void notifyInputChange(Input *input, Output *old_origin, Output *new_origin)
Definition: region.cpp:435
size_t numBottomNodes_
Definition: region.hpp:759
util::IteratorRange< BottomNodeIterator > BottomNodeRange
Definition: region.hpp:240
size_t nresults() const noexcept
Definition: region.hpp:465
region_nodes_list::ConstIterator NodeConstIterator
Definition: region.hpp:234
RegionObserver * observers_
Definition: region.hpp:764
region_nodes_list::Iterator NodeIterator
Definition: region.hpp:233
util::IteratorRange< TopNodeConstIterator > TopNodeConstRange
Definition: region.hpp:231
std::vector< RegionResult * > results_
Definition: region.hpp:754
static bool ContainsNodeType(const rvsdg::Region &region, bool checkSubregions)
RegionResult & addResult(std::unique_ptr< RegionResult > result)
Definition: region.cpp:262
TopNodeRange TopNodes() noexcept
Definition: region.hpp:309
Id getRegionId() const noexcept
Definition: region.hpp:263
region_bottom_node_list::Iterator BottomNodeIterator
Definition: region.hpp:238
std::vector< RegionArgument * >::const_iterator RegionArgumentConstIterator
Definition: region.hpp:215
void prune(bool recursive)
Definition: region.cpp:323
std::vector< RegionArgument * > arguments_
Definition: region.hpp:755
void onBottomNodeRemoved(Node &node)
Definition: region.cpp:384
size_t index() const noexcept
Definition: region.hpp:375
static std::string GetAnnotationString(const void *key, const util::AnnotationMap &annotationMap, char annotationSeparator, char labelValueSeparator)
Definition: region.cpp:531
RegionArgument * argument(size_t index) const noexcept
Definition: region.hpp:437
void notifyNodeCreate(Node *node)
Definition: region.cpp:408
size_t numTopNodes() const noexcept
Definition: region.hpp:490
util::IteratorRange< RegionResultIterator > RegionResultRange
Definition: region.hpp:221
bool IsRootRegion() const noexcept
Definition: region.cpp:170
static size_t NumRegions(const rvsdg::Region &region) noexcept
Definition: region.cpp:453
region_bottom_node_list::ConstIterator BottomNodeConstIterator
Definition: region.hpp:239
void onTopNodeRemoved(Node &node)
Definition: region.cpp:367
std::vector< RegionArgument * >::iterator RegionArgumentIterator
Definition: region.hpp:214
size_t numBottomNodes() const noexcept
Definition: region.hpp:499
~Region() noexcept
Definition: region.cpp:121
size_t RemoveArguments(const util::HashSet< size_t > &indices)
Definition: region.cpp:210
void removeNode(Node *node)
Definition: region.cpp:306
region_top_node_list topNodes_
Definition: region.hpp:756
void onTopNodeAdded(Node &node)
Adds node to the top nodes of the region.
Definition: region.cpp:358
region_bottom_node_list bottomNodes_
Definition: region.hpp:758
std::vector< RegionResult * >::iterator RegionResultIterator
Definition: region.hpp:219
NodeRange Nodes() noexcept
Definition: region.hpp:328
rvsdg::StructuralNode * node_
Definition: region.hpp:751
size_t numTopNodes_
Definition: region.hpp:757
void notifyInputDestroy(Input *input)
Definition: region.cpp:444
RegionResultConstRange Results() const noexcept
Definition: region.hpp:299
void notifyInputCreate(Input *input)
Definition: region.cpp:426
RegionArgument & insertArgument(size_t index, std::unique_ptr< RegionArgument > argument)
Definition: region.cpp:187
size_t narguments() const noexcept
Definition: region.hpp:431
void onBottomNodeAdded(Node &node)
Adds node to the set of bottom nodes in the region.
Definition: region.cpp:375
util::IteratorRange< RegionResultConstIterator > RegionResultConstRange
Definition: region.hpp:222
Node::Id nextNodeId_
Definition: region.hpp:750
size_t PruneArguments()
Definition: region.cpp:238
RegionResultRange Results() noexcept
Definition: region.hpp:290
RegionArgumentConstRange Arguments() const noexcept
Definition: region.hpp:281
Iterator end() noexcept
Iterator begin() noexcept
#define JLM_ASSERT(x)
Definition: common.hpp:16
size_t nsimpnodes(const rvsdg::Region *region) noexcept
Definition: region.cpp:662
size_t nstructnodes(const rvsdg::Region *region) noexcept
Definition: region.cpp:645
NodeType & AssertGetRegionParentNode(const rvsdg::Input &input)
Asserts that this is a result of a region inside a node of specified type.
Definition: region.hpp:1042
static void remove(Node *node)
Definition: region.hpp:932
std::unordered_map< const Node *, size_t > computeDepthMap(const Region &region)
Definition: region.cpp:609
static std::string type(const Node *n)
Definition: view.cpp:255
size_t nnodes(const jlm::rvsdg::Region *region) noexcept
Definition: region.cpp:629
size_t ninputs(const rvsdg::Region *region) noexcept
Definition: region.cpp:682
Region * TryGetOwnerRegion(const rvsdg::Input &input) noexcept
Definition: node.hpp:1021
NodeType * TryGetRegionParentNode(const rvsdg::Input &input) noexcept
Checks if this is a result of a region inside a node of specified type.
Definition: region.hpp:972