23 for (
auto & user : output.
Users())
25 worklist.emplace_back(&user);
32 std::deque<rvsdg::Input *> worklist;
35 std::vector<rvsdg::SimpleNode *> directCalls;
37 std::vector<rvsdg::Input *> otherUsers;
39 while (!worklist.empty())
41 auto input = worklist.front();
44 if (
auto lambdaNode = rvsdg::TryGetOwnerNode<rvsdg::LambdaNode>(*input))
51 if (rvsdg::TryGetRegionParentNode<rvsdg::LambdaNode>(*input))
53 otherUsers.emplace_back(input);
57 if (
auto gammaNode = rvsdg::TryGetOwnerNode<rvsdg::GammaNode>(*input))
59 auto rolevar = gammaNode->MapInput(*input);
60 if (
auto entryvar = std::get_if<rvsdg::GammaNode::EntryVar>(&rolevar))
62 for (
auto & argument : entryvar->branchArgument)
70 if (
auto gamma = rvsdg::TryGetRegionParentNode<rvsdg::GammaNode>(*input))
72 auto output = gamma->MapBranchResultExitVar(*input).output;
77 if (
auto theta = rvsdg::TryGetOwnerNode<rvsdg::ThetaNode>(*input))
79 auto loopvar = theta->MapInputLoopVar(*input);
84 if (
auto theta = rvsdg::TryGetRegionParentNode<rvsdg::ThetaNode>(*input))
86 auto loopvar = theta->MapPostLoopVar(*input);
91 if (
auto phi = rvsdg::TryGetOwnerNode<rvsdg::PhiNode>(*input))
93 auto ctxvar = phi->MapInputContextVar(*input);
98 if (
auto phi = rvsdg::TryGetRegionParentNode<rvsdg::PhiNode>(*input))
100 auto fixvar = phi->MapResultFixVar(*input);
103 auto output = fixvar.output;
108 if (
auto deltaNode = rvsdg::TryGetOwnerNode<rvsdg::DeltaNode>(*input))
110 auto ctxVar = deltaNode->MapInputContextVar(*input);
115 if (rvsdg::TryGetRegionParentNode<rvsdg::DeltaNode>(*input))
117 otherUsers.emplace_back(input);
121 auto inputNode = rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*input);
122 if (is<CallOperation>(inputNode) && input == inputNode->input(0))
124 directCalls.emplace_back(inputNode);
130 rvsdgExport = graphExport;
134 if (rvsdg::TryGetOwnerNode<rvsdg::SimpleNode>(*input))
136 otherUsers.emplace_back(input);
143 return CallSummary{ rvsdgExport, std::move(directCalls), std::move(otherUsers) };
ContextVar MapInputContextVar(const rvsdg::Input &input) const noexcept
Maps input to context variable.
rvsdg::Output * output() const noexcept
#define JLM_UNREACHABLE(msg)
Global memory state passed between functions.
static void AddToWorklist(std::deque< rvsdg::Input * > &worklist, rvsdg::Output &output)
CallSummary ComputeCallSummary(const rvsdg::LambdaNode &lambdaNode)
rvsdg::Output * inner
Access to bound object in subregion.