23 return trace(output,
nullptr);
47 if (result.isDeadEnd())
51 return result.getOutput();
93OutputTracer::TraceStepResult
120 for (
auto branchResult :
exitVar.branchResult)
129 *branchResult->region()))
372 if (
const auto ctxVar = lambda->MapBinderContextVar(output))
382 const auto ctxVar =
delta->MapBinderContextVar(output);
403 const auto argument =
phiNode->MapArgument(output);
404 if (
const auto ctxVar = std::get_if<PhiNode::ContextVar>(&argument))
450 return tracer.
trace(output);
bool isReachableFromRegion(Region &targetRegion, Region &originRegion)
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.
static TraceStepResult createFinalOutput(Output &output)
static TraceStepResult createDeadEndResult()
static TraceStepResult createStepOutput(Output &output)
TraceStepResult traceInternal(Output &output, BackEdgeState backEdgeState, const Region *withinRegion)
void setRegionPredicateCheckingEnabled(bool value) noexcept
Output & insertInInvarianceCache(const Output &structuralOutput, Input &structuralInput)
void setEnterPhiNodes(bool value) noexcept
AlternativeRegionPredicateTracer regionPredicateTracer_
TraceStepResult traceThetaOutput(ThetaNode &thetaNode, Output &output, BackEdgeState backEdgeState)
virtual TraceStepResult traceStep(Output &output, BackEdgeState backEdgeState, const Region *withinRegion)
bool isDeepInvarianceCheckingEnabled() const noexcept
void setInterprocedural(bool value) noexcept
TraceStepResult traceGammaOutput(GammaNode &gammaNode, Output &output, BackEdgeState backEdgeState)
const Output * startingOutput_
Output & trace(Output &output)
bool isRegionPredicateCheckingEnabled() const noexcept
void setStructuralNodePolicy(StructuralNodePolicy value) noexcept
@ traceThroughIfDetectedInvariant
bool enableInvarianceCaching_
Input * lookupInInvarianceCache(const Output &structuralOutput)
std::unordered_map< const Output *, Input * > invariantOutputCache_
TraceStepResult traceThetaArgument(ThetaNode &thetaNode, Output &output)
bool isTracingIntoSubregionsEnabled() const noexcept
rvsdg::Region * region() const noexcept
Represent acyclic RVSDG subgraphs.
StructuralOutput * output(size_t index) const noexcept
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
Output & traceOutput(Output &output, bool mayEnterSubregions, const Region *withinRegion)
static bool ThetaLoopVarIsInvariant(const ThetaNode::LoopVar &loopVar) noexcept
Output & traceOutputIntraProcedurally(Output &output, bool mayEnterSubregions)
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.
static Output & mapGammaArgumentToOrigin(GammaNode &gammaNode, Output &output)
rvsdg::Input * post
Variable after iteration (output result from subregion).