6 #ifndef JLM_RVSDG_SIMPLE_NODE_HPP
7 #define JLM_RVSDG_SIMPLE_NODE_HPP
16 class SimpleOperation;
26 std::unique_ptr<SimpleOperation> operation,
27 const std::vector<jlm::rvsdg::Output *> &
operands);
31 input(
size_t index)
const noexcept;
34 output(
size_t index)
const noexcept;
51 std::unique_ptr<Operation> operation,
52 const std::vector<rvsdg::Output *> &
operands)
54 if (!is<SimpleOperation>(*operation))
55 throw util::Error(
"Expected operation derived from SimpleOperation");
57 std::unique_ptr<SimpleOperation> simpleOperation(
58 util::assertedCast<SimpleOperation>(operation.release()));
75 std::optional<std::vector<rvsdg::Output *>>
79 const std::vector<rvsdg::Output *> &
operands);
126 template<
typename OperatorType,
typename... OperatorArguments>
133 std::make_unique<OperatorType>(std::move(operatorArguments)...),
168 template<
typename OperatorType,
typename... OperatorArguments>
174 std::make_unique<OperatorType>(std::move(operatorArguments)...),
198 template<
typename TOperation>
199 [[nodiscard]] std::pair<SimpleNode *, const TOperation *>
202 const auto simpleNode = TryGetOwnerNode<SimpleNode>(input);
205 return std::make_pair(
nullptr,
nullptr);
208 if (
auto operation =
dynamic_cast<const TOperation *
>(&simpleNode->GetOperation()))
210 return std::make_pair(simpleNode, operation);
213 return std::make_pair(simpleNode,
nullptr);
236 template<
typename TOperation>
237 [[nodiscard]] std::pair<SimpleNode *, const TOperation *>
240 const auto simpleNode = TryGetOwnerNode<SimpleNode>(output);
243 return std::make_pair(
nullptr,
nullptr);
246 if (
auto operation =
dynamic_cast<const TOperation *
>(&simpleNode->GetOperation()))
248 return std::make_pair(simpleNode, operation);
251 return std::make_pair(simpleNode,
nullptr);
273 template<
typename TOperation>
274 [[nodiscard]] std::pair<const SimpleNode *, const TOperation *>
277 const auto simpleNode =
dynamic_cast<const SimpleNode *
>(&node);
280 return std::make_pair(
nullptr,
nullptr);
282 if (
auto operation =
dynamic_cast<const TOperation *
>(&simpleNode->GetOperation()))
284 return std::make_pair(simpleNode, operation);
286 return std::make_pair(simpleNode,
nullptr);
rvsdg::Region * region() const noexcept
NodeInput * input(size_t index) const noexcept
NodeOutput * output(size_t index) const noexcept
Represent acyclic RVSDG subgraphs.
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)
SimpleNode & CreateOpNode(const std::vector< Output * > &operands, OperatorArguments... operatorArguments)
Creates a simple node characterized by its operator.
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.
std::pair< SimpleNode *, const TOperation * > TryGetSimpleNodeAndOptionalOp(const Input &input) noexcept
Checks if this is an input to a SimpleNode and of specified operation type.
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)