24 return trace(output,
nullptr);
70 for (
auto branchResult :
exitVar.branchResult)
187 const auto loopVar = thetaNode->MapPreLoopVar(output);
214 if (
const auto ctxVar = lambda->MapBinderContextVar(output))
215 return *
ctxVar->input->origin();
224 const auto ctxVar =
delta->MapBinderContextVar(output);
225 return *
ctxVar.input->origin();
234 return *
fixVar.result->origin();
245 const auto argument =
phiNode->MapArgument(output);
246 if (
const auto ctxVar = std::get_if<PhiNode::ContextVar>(&argument))
249 return *
ctxVar->input->origin();
268std::optional<Output *>
276 return it->second !=
nullptr ?
it->second->origin() :
nullptr;
288 return tracer.
trace(output);
Conditional operator / pattern matching.
ExitVar MapOutputExitVar(const rvsdg::Output &output) const
Maps gamma output to exit variable description.
const rvsdg::Input & mapBranchArgumentToInput(const rvsdg::Output &output) const
Maps branch subregion entry argument to its corresponding gamma input.
Output * tryTraceThroughGamma(GammaNode &gammaNode, Output &output)
void setInterprocedural(bool value) noexcept
Output * insertInCache(const Output &output, Input *traceResult)
Output & trace(Output &output)
virtual Output & traceStep(Output &output, const rvsdg::Region *withinRegion)
bool traceThroughStrucutalNodes_
std::unordered_map< const Output *, Input * > traceCache_
OutputTracer(bool enableCaching) noexcept
Output * tryTraceThroughTheta(ThetaNode &thetaNode, Output &output)
std::optional< Output * > lookupInCache(const Output &output)
Represent acyclic RVSDG subgraphs.
LoopVar MapOutputLoopVar(const rvsdg::Output &output) const
Maps variable at exit to full varibale description.
LoopVar MapPreLoopVar(const rvsdg::Output &argument) const
Maps variable at start of loop iteration to full varibale description.
rvsdg::Region * subregion() const noexcept
static bool ThetaLoopVarIsInvariant(const ThetaNode::LoopVar &loopVar) noexcept
Output & traceOutput(Output &output, const rvsdg::Region *withinRegion)
Region * TryGetOwnerRegion(const rvsdg::Input &input) noexcept
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
Output & traceOutputIntraProcedurally(Output &output)
static Output & mapGammaArgumentToOrigin(GammaNode &gammaNode, Output &output)
rvsdg::Input * post
Variable after iteration (output result from subregion).