24 std::unique_ptr<Operation>
27 return std::make_unique<ThetaOperation>(*
this);
69 for (
const auto & [
input, pre, post,
output] : loopVars)
75 if (pre->nusers() == 1)
81 argumentIndices.
insert(pre->index());
82 resultIndices.
insert(post->index());
92 [[maybe_unused]]
const auto numRemovedOutputs =
RemoveOutputs(outputIndices);
95 [[maybe_unused]]
const auto numRemovedInputs =
RemoveInputs(inputIndices);
107 std::vector<LoopVar> newLoopVars;
108 for (
auto olv : oldLoopVars)
110 auto nlv = theta->AddLoopVar(&smap.
lookup(*olv.input->origin()));
111 newLoopVars.push_back(nlv);
112 rmap.
insert(olv.pre, nlv.pre);
120 for (
size_t i = 0; i < oldLoopVars.size(); ++i)
122 newLoopVars[i].post->divert_to(&rmap.
lookup(*oldLoopVars[i].post->origin()));
142 JLM_ASSERT(rvsdg::TryGetRegionParentNode<ThetaNode>(argument) ==
this);
152 JLM_ASSERT(rvsdg::TryGetRegionParentNode<ThetaNode>(result) ==
this);
153 if (result.
index() == 0)
157 throw std::logic_error(
"cannot map loop continuation predicate to loop variable");
175 [[nodiscard]] std::vector<ThetaNode::LoopVar>
178 std::vector<LoopVar> loopvars;
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.
NodeOutput * addOutput(std::unique_ptr< NodeOutput > output)
rvsdg::Region * region() const noexcept
size_t RemoveInputs(const util::HashSet< size_t > &indices)
size_t ninputs() const noexcept
size_t noutputs() const noexcept
NodeInput * addInput(std::unique_ptr< NodeInput > input, bool notifyRegion)
size_t RemoveOutputs(const util::HashSet< size_t > &indices)
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
size_t index() const noexcept
bool IsDead() 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.
RegionResult * result(size_t index) const noexcept
size_t RemoveResults(const util::HashSet< size_t > &indices)
void copy(Region *target, SubstitutionMap &smap) const
Copy a region with substitutions.
RegionArgument * argument(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
void insert(const Output *original, Output *substitute)
Output & lookup(const Output &original) const
LoopVar MapOutputLoopVar(const rvsdg::Output &output) const
Maps variable at exit to full varibale description.
void RemoveLoopVars(std::vector< LoopVar > loopVars)
Removes loop variables.
RegionResult * predicate() const noexcept
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
LoopVar MapInputLoopVar(const rvsdg::Input &input) const
Maps variable at entry to full varibale description.
static ThetaNode * create(rvsdg::Region *parent)
~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
bool insert(ItemType item)
std::size_t Size() const noexcept
Description of a loop-carried variable.