21 const auto subregion =
loopNode->subregion();
22 for (
const auto argument : subregion->Arguments())
26 auto &
user = *argument->Users().begin();
49 for (
int i =
ln->noutputs() - 1;
i >= 0; --
i)
51 const auto out =
ln->output(
i);
52 if (
out->nusers() == 0)
54 ln->removeLoopOutput(
out);
66 for (
int i =
ln->ninputs() - 1;
i >= 0; --
i)
68 const auto in =
ln->input(
i);
70 const auto arg =
in->arguments.begin();
71 if (arg->nusers() != 1)
74 auto &
user = *arg->Users().begin();
77 result->output()->divert_users(
in->origin());
78 ln->removeLoopOutput(result->output());
79 ln->removeLoopInput(arg->input());
90 auto sr =
ln->subregion();
92 for (
int i =
ln->ninputs() - 1;
i >= 0; --
i)
94 auto in =
ln->input(
i);
96 auto arg =
in->arguments.begin();
97 if (arg->nusers() == 0)
99 ln->removeLoopInput(
in);
105 for (
int i =
sr->narguments() - 1;
i >= 0; --
i)
107 auto arg =
sr->argument(
i);
110 auto result =
ba->result();
112 if (arg->nusers() == 0 || (arg->nusers() == 1 && result->origin() == arg))
114 sr->RemoveResults({ result->index() });
115 sr->RemoveArguments({ arg->index() });
129 const auto mux_op = util::assertedCast<const MuxOperation>(&
dmux_node->GetOperation());
154 auto mux_op = util::assertedCast<const MuxOperation>(&
ndmux_node->GetOperation());
195 const auto mux_op = util::assertedCast<const MuxOperation>(&
ndmux_node->GetOperation());
265 region->RemoveResults({
backedge_arg->result()->index() });
276 if (
lcb_node->output(0)->nusers() != 1)
381 std::unordered_set<rvsdg::SimpleNode *>
splits;
459 else if (
auto ln =
dynamic_cast<LoopNode *
>(node))
467 else if (
const auto mux =
dynamic_cast<const MuxOperation *
>(&node->GetOperation()))
520 const auto rootRegion = &graph.GetRootRegion();
523 throw util::Error(
"Root should have only one node now");
static jlm::util::StatisticsCollector statisticsCollector
~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)
size_t nusers() const noexcept
Represents the result of a region.
Represent acyclic RVSDG subgraphs.
bool insert(ItemType item)
#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 remove_unused_loop_backedges(LoopNode *loopNode)
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 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.