16 bool anyChanged =
false;
19 for (
int i = loopNode.
noutputs() - 1; i >= 0; --i)
21 auto output = loopNode.
output(i);
22 if (output->nusers() == 0)
34 bool anyChanged =
false;
35 auto loopSubregion = loopNode.
subregion();
38 for (
int i = loopNode.
ninputs() - 1; i >= 0; --i)
40 auto input = loopNode.
input(i);
42 auto argument = input->arguments.begin();
44 if (argument->nusers() == 0)
53 for (
int i = loopSubregion->narguments() - 1; i >= 0; --i)
55 auto argument = loopSubregion->argument(i);
59 auto result = backedgeArgument->result();
60 JLM_ASSERT(*result->Type() == *argument->Type());
62 if (argument->nusers() == 0 || (argument->nusers() == 1 && result->origin() == argument))
64 loopSubregion->RemoveResults({ result->index() });
65 loopSubregion->RemoveArguments({ argument->index() });
81 bool anyChanged =
false;
93 else if (
auto loopNode =
dynamic_cast<LoopNode *
>(node))
100 anyChanged |= changed;
112 if (rootRegion.numNodes() != 1)
114 throw util::Error(
"Root should have only one node now");
117 auto lambdaNode =
dynamic_cast<const rvsdg::LambdaNode *
>(rootRegion.Nodes().begin().ptr());
rvsdg::Region * subregion() const noexcept
void removeLoopOutput(rvsdg::StructuralOutput *output)
void removeLoopInput(rvsdg::StructuralInput *input)
Region & GetRootRegion() const noexcept
size_t ninputs() const noexcept
size_t noutputs() const noexcept
Represent acyclic RVSDG subgraphs.
size_t numBottomNodes() const noexcept
StructuralOutput * output(size_t index) const noexcept
StructuralInput * input(size_t index) const noexcept
static bool RemoveUnusedLoopOutputs(LoopNode &loopNode)
static bool RemoveUnusedInputs(LoopNode &loopNode)
static bool EliminateDeadNodesInRegion(rvsdg::Region ®ion)
void EliminateDeadNodes(llvm::LlvmRvsdgModule &rvsdgModule)
static void remove(Node *node)