24std::unique_ptr<Operation>
27 return std::make_unique<ThetaOperation>(*
this);
75 if (pre->nusers() == 1)
110 auto nlv = theta->AddLoopVar(&
smap.lookup(*
olv.input->origin()));
153 if (result.
index() == 0)
157 throw std::logic_error(
"cannot map loop continuation predicate to loop variable");
175[[
nodiscard]] std::vector<ThetaNode::LoopVar>
179 for (
size_t index = 0; index <
ninputs(); ++index)
static Output & createFalse(Region ®ion)
static std::shared_ptr< const ControlType > Create(std::size_t nalternatives)
Instantiates control type.
NodeInput * input(size_t index) const noexcept
NodeOutput * output(size_t index) const noexcept
size_t RemoveInputs(const util::HashSet< size_t > &indices)
rvsdg::Region * region() const noexcept
size_t ninputs() const noexcept
NodeOutput * addOutput(std::unique_ptr< NodeOutput > output)
size_t noutputs() const noexcept
NodeInput * addInput(std::unique_ptr< NodeInput > input, bool notifyRegion)
size_t RemoveOutputs(const util::HashSet< size_t > &indices)
size_t index() const noexcept
bool IsDead() const noexcept
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
static RegionArgument & Create(rvsdg::Region ®ion, StructuralInput *input, std::shared_ptr< const rvsdg::Type > type)
Creates region entry argument.
static RegionResult & Create(rvsdg::Region ®ion, rvsdg::Output &origin, StructuralOutput *output, std::shared_ptr< const rvsdg::Type > type)
Create region exit result.
Represent acyclic RVSDG subgraphs.
size_t RemoveResults(const util::HashSet< size_t > &indices)
RegionArgument * argument(size_t index) const noexcept
void copy(Region *target, SubstitutionMap &smap) const
Copy a region with substitutions.
RegionResult * result(size_t index) const noexcept
size_t RemoveArguments(const util::HashSet< size_t > &indices)
StructuralOutput * output(size_t index) const noexcept
StructuralInput * input(size_t index) const noexcept
LoopVar MapOutputLoopVar(const rvsdg::Output &output) const
Maps variable at exit to full varibale description.
void RemoveLoopVars(std::vector< LoopVar > loopVars)
Removes loop variables.
LoopVar MapPreLoopVar(const rvsdg::Output &argument) const
Maps variable at start of loop iteration to full varibale description.
std::vector< LoopVar > GetLoopVars() const
Returns all loop variables.
ThetaNode * copy(rvsdg::Region *region, rvsdg::SubstitutionMap &smap) const override
Copy a node with substitutions.
LoopVar MapPostLoopVar(const rvsdg::Input &result) const
Maps variable at end of loop iteration to full varibale description.
rvsdg::Region * subregion() const noexcept
static ThetaNode * create(rvsdg::Region *parent)
LoopVar MapInputLoopVar(const rvsdg::Input &input) const
Maps variable at entry to full varibale description.
RegionResult * predicate() const noexcept
~ThetaNode() noexcept override
ThetaNode(rvsdg::Region &parent)
LoopVar AddLoopVar(rvsdg::Output *origin)
Creates a new loop-carried variable.
std::unique_ptr< Operation > copy() const override
~ThetaOperation() noexcept override
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
Description of a loop-carried variable.