7#ifndef JLM_RVSDG_NODE_HPP
8#define JLM_RVSDG_NODE_HPP
66 [[
nodiscard]]
const std::shared_ptr<const rvsdg::Type> &
221 const std::shared_ptr<const rvsdg::Type> & type);
226 std::shared_ptr<const rvsdg::Type>
Type_;
239 std::is_base_of<jlm::rvsdg::Input, T>::value,
240 "Template parameter T must be derived from jlm::rvsdg::input.");
242 return dynamic_cast<const T *
>(&input) !=
nullptr;
365 [[
nodiscard]]
const std::shared_ptr<const rvsdg::Type> &
524 std::shared_ptr<const rvsdg::Type>
Type_;
548 std::is_base_of<jlm::rvsdg::Output, T>::value,
549 "Template parameter T must be derived from jlm::rvsdg::output.");
551 return dynamic_cast<const T *
>(output) !=
nullptr;
562 return std::get<Node *>(
GetOwner());
574 return std::get<Node *>(
GetOwner());
735 throw std::logic_error(
"Output does not belong to this node!");
808 std::vector<std::unique_ptr<NodeInput>>
inputs_;
827template<
class OperationType>
843template<
typename TOperation>
847 return dynamic_cast<const TOperation *
>(&node.GetOperation());
870template<
typename NodeType>
874 auto owner = input.GetOwner();
875 if (
const auto node = std::get_if<Node *>(&
owner))
877 return dynamic_cast<NodeType *
>(*node);
905template<
typename NodeType>
909 auto owner = output.GetOwner();
910 if (
const auto node = std::get_if<Node *>(&
owner))
912 return dynamic_cast<NodeType *
>(*node);
938template<
typename NodeType>
945 throw std::logic_error(std::string(
"expected node of type ") +
typeid(NodeType).name());
968template<
typename NodeType>
975 throw std::logic_error(std::string(
"expected node of type ") +
typeid(NodeType).name());
993template<
typename OperationType>
1013template<
typename OperationType>
1023 auto owner = input.GetOwner();
1024 if (
auto region = std::get_if<Region *>(&
owner))
1037 auto owner = output.GetOwner();
1038 if (
auto region = std::get_if<Region *>(&
owner))
1048static inline std::vector<jlm::rvsdg::Output *>
1051 std::vector<jlm::rvsdg::Output *>
operands;
1057static inline std::vector<jlm::rvsdg::Output *>
1060 std::vector<jlm::rvsdg::Output *>
outputs;
1076static inline std::vector<Output *>
1081 std::vector<Output *>
outputs;
Node * node() const noexcept
Graph * graph() const noexcept
NodeInput * input(size_t index) const noexcept
std::size_t numSuccessors() const noexcept
util::IntrusiveListAnchor< Node > region_top_node_list_anchor_
NodeOutput * output(size_t index) const noexcept
virtual Node * copy(rvsdg::Region *region, SubstitutionMap &smap) const =0
Copy a node with substitutions.
util::IteratorRange< Input::ConstIterator > InputConstIteratorRange
Id GetNodeId() const noexcept
virtual std::string DebugString() const =0
util::IteratorRange< Input::Iterator > InputIteratorRange
OutputIteratorRange Outputs() noexcept
bool IsDead() const noexcept
Determines whether the node is dead.
virtual const Operation & GetOperation() const noexcept=0
std::vector< std::unique_ptr< NodeInput > > inputs_
std::vector< std::unique_ptr< NodeOutput > > outputs_
util::IteratorRange< Output::ConstIterator > OutputConstIteratorRange
util::IntrusiveListAccessor< Node, &Node::region_top_node_list_anchor_ > region_top_node_list_accessor
size_t RemoveInputs(const util::HashSet< size_t > &indices)
InputConstIteratorRange Inputs() const noexcept
rvsdg::Region * region() const noexcept
util::IntrusiveListAccessor< Node, &Node::region_bottom_node_list_anchor_ > region_bottom_node_list_accessor
InputIteratorRange Inputs() noexcept
size_t ninputs() const noexcept
util::IteratorRange< Output::Iterator > OutputIteratorRange
util::IntrusiveListAnchor< Node > region_node_list_anchor_
NodeOutput * addOutput(std::unique_ptr< NodeOutput > output)
util::IntrusiveListAccessor< Node, &Node::region_node_list_anchor_ > region_node_list_accessor
size_t noutputs() const noexcept
OutputConstIteratorRange Outputs() const noexcept
util::IntrusiveListAnchor< Node > region_bottom_node_list_anchor_
std::size_t numSuccessors_
NodeInput * addInput(std::unique_ptr< NodeInput > input, bool notifyRegion)
size_t RemoveOutputs(const util::HashSet< size_t > &indices)
virtual Node * copy(rvsdg::Region *region, const std::vector< jlm::rvsdg::Output * > &operands) const
const Output * GetOutput() const noexcept
constexpr ConstIterator(const Output *output)
ConstIterator & operator++()
bool operator!=(const ConstIterator &other) const
Output * ComputeNext() const
const Output * operator->() const
std::ptrdiff_t difference_type
const Output & operator*() const
bool operator==(const ConstIterator &other) const
std::forward_iterator_tag iterator_category
ConstIterator operator++(int)
constexpr Iterator(Output *output)
Output * operator->() const
std::ptrdiff_t difference_type
bool operator==(const Iterator &other) const
std::forward_iterator_tag iterator_category
bool operator!=(const Iterator &other) const
Output * GetOutput() const noexcept
Output * ComputeNext() const
rvsdg::Input & SingleUser() noexcept
jlm::util::IteratorRange< UsersList::ConstIterator > UsersConstRange
void add_user(jlm::rvsdg::Input *user)
rvsdg::Region * region() const noexcept
virtual ~Output() noexcept
virtual std::string debug_string() const
size_t index() const noexcept
size_t divertUsersWhere(Output &newOrigin, const F &match)
void divert_users(jlm::rvsdg::Output *new_origin)
void remove_user(jlm::rvsdg::Input *user)
std::variant< Node *, Region * > Owner_
std::shared_ptr< const rvsdg::Type > Type_
std::variant< Node *, Region * > GetOwner() const noexcept
UsersConstRange Users() const
bool IsDead() const noexcept
jlm::util::IteratorRange< UsersList::Iterator > UsersRange
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
size_t nusers() const noexcept
Represent acyclic RVSDG subgraphs.
bool insert(ItemType item)
bool empty() const noexcept
ConstIterator cend() const noexcept
ConstIterator cbegin() const noexcept
Iterator begin() noexcept
static bool is(const jlm::rvsdg::Input &input) noexcept
NodeType & AssertGetOwnerNode(const rvsdg::Input &input)
Asserts that this is an input to a node of specified type.
static std::vector< Output * > Outputs(const Node &node, const size_t startIdx, const size_t size)
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)
static std::vector< jlm::rvsdg::Output * > outputs(const Node *node)
Output & RouteToRegion(Output &output, Region ®ion)
bool IsOwnerNodeOperation(const rvsdg::Input &input) noexcept
Checks if the input belongs to a node of the specified operation type.
const TOperation * tryGetOperation(const Node &node) noexcept
static void divert_users(Node *node, const std::vector< Output * > &outputs)
Region * TryGetOwnerRegion(const rvsdg::Input &input) noexcept
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.