21 std::unique_ptr<SimpleOperation> operation,
22 const std::vector<jlm::rvsdg::Output *> &
operands)
24 Operation_(std::move(operation))
28 "Argument error - expected ",
72 for (
size_t n = 0; n < copiedNode->noutputs(); n++)
84 std::optional<std::vector<rvsdg::Output *>>
88 const std::vector<rvsdg::Output *> &
operands)
90 auto isCongruent = [&](
const Node & node)
92 auto simpleNode =
dynamic_cast<const SimpleNode *
>(&node);
93 return simpleNode && simpleNode->
GetOperation() == operation
99 for (
auto & node : region.
TopNodes())
101 if (isCongruent(node))
109 for (
const auto & user :
operands[0]->Users())
111 if (
const auto node = TryGetOwnerNode<SimpleNode>(user))
113 if (isCongruent(*node))
NodeOutput * addOutput(std::unique_ptr< NodeOutput > output)
rvsdg::Region * region() const noexcept
InputIteratorRange Inputs() noexcept
size_t noutputs() const noexcept
NodeInput * addInput(std::unique_ptr< NodeInput > input, bool notifyRegion)
virtual std::string debug_string() const =0
Represent acyclic RVSDG subgraphs.
void notifyNodeDestroy(Node *node)
TopNodeRange TopNodes() noexcept
void notifyNodeCreate(Node *node)
SimpleNode(rvsdg::Region ®ion, std::unique_ptr< SimpleOperation > operation, const std::vector< jlm::rvsdg::Output * > &operands)
const SimpleOperation & GetOperation() const noexcept override
std::unique_ptr< SimpleOperation > Operation_
Node * copy(Region *region, const std::vector< Output * > &operands) const override
std::string DebugString() const override
NodeInput * input(size_t index) const noexcept
NodeOutput * output(size_t index) const noexcept
static SimpleNode & Create(Region ®ion, std::unique_ptr< Operation > operation, const std::vector< rvsdg::Output * > &operands)
size_t nresults() const noexcept
size_t narguments() const noexcept
void insert(const Output *original, Output *substitute)
Output & lookup(const Output &original) const
std::optional< std::vector< rvsdg::Output * > > NormalizeSimpleOperationCommonNodeElimination(Region ®ion, const SimpleOperation &operation, const std::vector< rvsdg::Output * > &operands)
Performs common node elimination for a given operation and operands in a region.
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)
static std::vector< jlm::rvsdg::Output * > outputs(const Node *node)
static std::string strfmt(Args... args)