17 AddForksToRegion(module.Rvsdg().GetRootRegion());
26 forkInsertion.
Run(module, statisticsCollector);
33 for (
const auto argument : region.
Arguments())
35 if (argument->nusers() > 1)
39 for (
auto & node : region.
Nodes())
44 for (
auto & subregion : structuralNode->Subregions())
51 for (
size_t n = 0; n < node.noutputs(); n++)
53 const auto output = node.output(n);
54 if (output->nusers() > 1)
70 size_t currentForkOutput = 0;
71 while (output.
nusers() != 1)
74 if (&*userIt == forkNode.input(0))
77 userIt = std::next(userIt);
80 JLM_ASSERT(currentForkOutput < forkNode.noutputs());
81 userIt->divert_to(forkNode.output(currentForkOutput));
85 JLM_ASSERT(currentForkOutput == forkNode.noutputs());
91 const auto node = rvsdg::TryGetOwnerNode<rvsdg::Node>(output);
92 return node !=
nullptr ? node->ninputs() == 0 :
false;
void Run(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
static bool IsConstantFork(const rvsdg::Output &output)
static void CreateAndRun(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector)
~ForkInsertion() noexcept override
static void AddForksToRegion(rvsdg::Region ®ion)
static void AddForkToOutput(rvsdg::Output &output)
static rvsdg::Node & CreateNode(const size_t numResults, rvsdg::Output &operand, const bool isConstant=false)
size_t nusers() const noexcept
Represent acyclic RVSDG subgraphs.
RegionArgumentRange Arguments() noexcept
NodeRange Nodes() noexcept