12#include <unordered_map>
59 if (std::dynamic_pointer_cast<const ControlType>(input->
Type()))
101 observers_.emplace(®ion, std::make_unique<Observer>(region,
this));
111 std::unordered_map<Input *, PredicateValueRange> &
visitedInputs,
148 std::unordered_map<Input *, PredicateValueRange> &
visitedInputs,
156 auto origin = input.
origin();
169 return PredicateValueRange::CreateSingleValue(op.value());
173 return PredicateValueRange::CreateUnknown(type);
181 auto exitVar = node.MapOutputExitVar(*origin);
196 auto loopVar = node.MapOutputLoopVar(*origin);
222 if (
auto entry = std::get_if<GammaNode::EntryVar>(&
argVar))
233 auto loopVar = node.MapPreLoopVar(*origin);
271 std::unordered_map<Input *, PredicateValueRange>
visitedInputs;
301 req.push_back(std::make_pair(node.predicate(), region.index()));
Conditional operator / pattern matching.
std::variant< MatchVar, EntryVar > MapBranchArgument(const rvsdg::Output &output) const
Maps branch subregion entry argument to its role (pattern match or entry variable).
rvsdg::Region * region() const noexcept
Value range for a predicate.
static PredicateValueRange CreateEmpty(const ControlType &type)
Constructs empty value range (unsatisfiable predicate range).
static PredicateValueRange CreateUnknown(const ControlType &type)
Constructs full value range (every value possible).
Proxy object to observe changes to a region.
Observer(const Region ®ion, RegionPredicateTrace *tracer)
RegionPredicateTrace * tracer_
void onInputCreate(Input *input) override
void onNodeDestroy(Node *node) override
void onNodeCreate(Node *node) override
void onInputChange(Input *input, Output *, Output *) override
void onInputDestroy(Input *input) override
Traces region reachability by predicate assertions.
PredicateValueRange GetRegionPredicateAssignConstraints(Region ®ion, Input &predUse)
Computes value range for a predicate when exiting a region.
PredicateSatRequired GetRegionSatRequired(Region ®ion)
Computes required predicate assignments for region.
std::unordered_map< Region *, PredicateSatRequired > predSat_
bool CheckPredicatesSatisfiable(Region &originRegion, Region &targetRegion)
Checks for dynamic reachability between two regions.
void ObserveRegion(Region ®ion)
PredicateValueRange Compute(RegionPredRange ®ionPredRange, Input &input, std::unordered_map< Input *, PredicateValueRange > &visitedInputs, const ControlType &type)
const PredicateValueRange & ComputeAndRecord(RegionPredRange ®ionPredRange, Input &input, std::unordered_map< Input *, PredicateValueRange > &visitedInputs, const ControlType &type)
std::unordered_map< Region *, PredicateValueRange > RegionPredRange
std::unordered_map< Input *, RegionPredRange > predAssignment_
std::unordered_map< Region *, std::unique_ptr< Observer > > observers_
Represent acyclic RVSDG subgraphs.
rvsdg::StructuralNode * node() const noexcept
const SimpleOperation & GetOperation() const noexcept override
void MatchTypeWithDefault(T &obj, const Fns &... fns)
Pattern match over subclass type of given object with default handler.
void MatchType(T &obj, const Fns &... fns)
Pattern match over subclass type of given object.
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
std::vector< std::pair< Input *, std::size_t > > PredicateSatRequired
Describes which predicates need to be satisfied.