22 return trace(output,
true);
52 if (
const auto entryVar = std::get_if<GammaNode::EntryVar>(&roleVar))
54 return *entryVar->input->origin();
56 if (
const auto matchVar = std::get_if<GammaNode::MatchVar>(&roleVar))
58 return *matchVar->input->origin();
60 throw std::logic_error(
"Unhandled role variable type.");
69 Output * commonOrigin =
nullptr;
71 for (
auto branchResult : exitVar.branchResult)
73 auto tracedInner = branchResult->origin();
78 tracedInner = &
trace(*tracedInner,
false);
82 if (TryGetRegionParentNode<GammaNode>(*tracedInner) != &gammaNode)
89 if (commonOrigin ==
nullptr)
91 commonOrigin = &outerOrigin;
93 else if (commonOrigin != &outerOrigin)
113 tracedInner = &
trace(*tracedInner,
false);
116 if (tracedInner == loopVar.pre)
118 return loopVar.input->origin();
126 if (!mayLeaveRegion && TryGetRegionParentNode<Node>(output))
133 if (
const auto gammaNode = TryGetOwnerNode<GammaNode>(output))
142 if (
const auto gammaNode = TryGetRegionParentNode<GammaNode>(output))
148 if (
const auto thetaNode = TryGetOwnerNode<ThetaNode>(output))
159 if (
const auto thetaNode = TryGetRegionParentNode<ThetaNode>(output))
162 const auto loopVar = thetaNode->MapPreLoopVar(output);
176 if (
const auto lambda = rvsdg::TryGetRegionParentNode<LambdaNode>(output))
179 if (
const auto ctxVar = lambda->MapBinderContextVar(output))
180 return *ctxVar->input->origin();
186 if (
const auto delta = rvsdg::TryGetRegionParentNode<DeltaNode>(output))
189 const auto ctxVar = delta->MapBinderContextVar(output);
190 return *ctxVar.input->origin();
194 if (
const auto phiNode = rvsdg::TryGetOwnerNode<PhiNode>(output))
198 const auto fixVar = phiNode->MapOutputFixVar(output);
199 return *fixVar.result->origin();
205 if (
const auto phiNode = rvsdg::TryGetRegionParentNode<PhiNode>(output))
210 const auto argument = phiNode->MapArgument(output);
211 if (
const auto ctxVar = std::get_if<PhiNode::ContextVar>(&argument))
214 return *ctxVar->input->origin();
227 return tracer.
trace(output);
234 return tracer.
trace(output);
Conditional operator / pattern matching.
ExitVar MapOutputExitVar(const rvsdg::Output &output) const
Maps gamma output to exit variable description.
std::variant< MatchVar, EntryVar > MapBranchArgument(const rvsdg::Output &output) const
Maps branch subregion entry argument to its role (pattern match or entry variable).
Output * tryTraceThroughGamma(GammaNode &gammaNode, Output &output)
void setInterprocedural(bool value) noexcept
Output & trace(Output &output)
virtual Output & traceStep(Output &output, bool mayLeaveRegion)
bool traceThroughStrucutalNodes_
Output * tryTraceThroughTheta(ThetaNode &thetaNode, Output &output)
LoopVar MapOutputLoopVar(const rvsdg::Output &output) const
Maps variable at exit to full varibale description.
static Output & mapGammaArgumentToOrigin(GammaNode &gammaNode, Output &output)
Output & traceOutput(Output &output)
Output & traceOutputIntraProcedurally(Output &output)
rvsdg::Input * post
Variable after iteration (output result from subregion).