33 if (
auto entry = std::get_if<LoopNode::EntryVar>(&
loopvar))
35 exitvar.output->divert_users(entry->input->origin());
48 std::vector<LoopNode::ExitVar>
vars =
ln->getExitVars();
55 return !var.output->IsDead();
61 ln->removeExitVars(std::move(
vars));
69 std::vector<LoopNode::EntryVar>
vars =
ln->getEntryVars();
76 return !var.inner->IsDead();
82 ln->removeEntryVars(std::move(
vars));
91 std::vector<LoopNode::BackEdgeVar>
vars =
ln->getBackEdgeVars();
98 return !(var.pre->nusers() == 1 && var.post->origin() == var.pre);
104 ln->removeBackEdgeVars(std::move(
vars));
111 const auto mux_op = util::assertedCast<const MuxOperation>(&
dmux_node->GetOperation());
136 auto mux_op = util::assertedCast<const MuxOperation>(&
ndmux_node->GetOperation());
177 const auto mux_op = util::assertedCast<const MuxOperation>(&
ndmux_node->GetOperation());
188 auto backedge = std::get_if<LoopNode::BackEdgeVar>(&
var);
243 if (
auto extra_be = std::get_if<LoopNode::BackEdgeVar>(&
var))
268 if (
lcb_node->output(0)->nusers() != 1)
305 if (
auto pred_be = std::get_if<LoopNode::BackEdgeVar>(&
var))
378 std::unordered_set<rvsdg::SimpleNode *>
splits;
456 else if (
auto ln =
dynamic_cast<LoopNode *
>(node))
464 else if (
const auto mux =
dynamic_cast<const MuxOperation *
>(&node->GetOperation()))
517 const auto rootRegion = &graph.GetRootRegion();
520 throw util::Error(
"Root should have only one node now");
522 const auto lambdaNode =
~RhlsDeadNodeElimination() noexcept override
void Run(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
static rvsdg::Output * Create(const std::vector< rvsdg::Output * > &operands)
static std::vector< rvsdg::Output * > Create(rvsdg::Output &operand, const size_t numResults)
Node * node() const noexcept
NodeInput * input(size_t index) const noexcept
NodeOutput * output(size_t index) const noexcept
void divert_users(jlm::rvsdg::Output *new_origin)
Represent acyclic RVSDG subgraphs.
#define JLM_UNREACHABLE(msg)
static bool remove_loop_passthrough(LoopNode *ln)
static bool dead_loop_lcb(rvsdg::Node *lcb_node)
static bool dead_loop(rvsdg::Node *ndmux_node)
static bool remove_unused_loop_outputs(LoopNode *ln)
static bool fix_mem_split(rvsdg::Node *split_node)
static bool dead_spec_gamma(rvsdg::Node *dmux_node)
static bool remove_unused_loop_inputs(LoopNode *ln)
static bool fix_mem_merge(rvsdg::Node *merge_node)
rvsdg::Input * get_mem_state_user(rvsdg::Output *state_edge)
static bool dead_nonspec_gamma(rvsdg::Node *ndmux_node)
static bool remove_unused_loop_backedges(LoopNode *ln)
static util::StatisticsCollector statisticsCollector
static void remove(Node *node)
detail::BottomUpTraverserGeneric< false > BottomUpTraverser
Traverser for visiting every node in a region in a bottom up order.
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
Variable passed between hls loop iterations.
Variable entering the hls loop.
Variable exiting the hls loop.