23std::unique_ptr<Operation>
26 return std::make_unique<PhiOperation>(*
this);
42 auto input =
addInput(std::make_unique<StructuralInput>(
this, &origin, origin.
Type()),
true);
49[[
nodiscard]] std::vector<PhiNode::ContextVar>
52 std::vector<PhiNode::ContextVar>
vars;
65 std::vector<PhiNode::FixVar>
vars;
75[[
nodiscard]] std::optional<PhiNode::FixVar>
79 if (argument.index() < subregion()->nresults())
81 size_t n = argument.index();
82 return FixVar{ subregion()->argument(
n), subregion()->
result(
n), output(
n) };
94 return FixVar{ subregion()->argument(result.index()),
95 subregion()->
result(result.index()),
96 output(result.index()) };
103 return FixVar{ subregion()->argument(output.index()),
104 subregion()->
result(output.index()),
113 subregion()->argument(input.index() + subregion()->nresults()) };
116[[
nodiscard]] std::optional<PhiNode::ContextVar>
120 if (argument.index() >= subregion()->nresults())
122 size_t n = argument.index();
123 return ContextVar{ input(
n - subregion()->nresults()), subregion()->argument(
n) };
131[[
nodiscard]] std::variant<PhiNode::FixVar, PhiNode::ContextVar>
135 if (
auto ctxvar = MapArgumentContextVar(argument))
139 else if (
auto fixvar = MapArgumentFixVar(argument))
145 JLM_UNREACHABLE(
"phi binder is neither context nor fixpoint variable");
154 for (
const auto [
input, argument] :
vars)
173 for (
const auto & [argument, result,
output] :
vars)
201 auto newcv =
pb.AddContextVar(origin);
208 auto newrv =
pb.AddFixVar(
var.recref->Type());
225std::vector<rvsdg::LambdaNode *>
229 [&](
auto &
phiNode,
auto & lambdaNodes)
231 for (
auto & node :
phiNode.subregion()->Nodes())
244 std::vector<rvsdg::LambdaNode *> lambdaNodes;
262 std::make_unique<RegionArgument>(
subregion(),
nullptr, type));
277 if (
var.result->origin() ==
var.recref)
278 throw util::Error(
"Recursion variable not properly set.");
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
size_t noutputs() const noexcept
size_t RemoveOutputs(const util::HashSet< size_t > &indices)
size_t index() const noexcept
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
PhiNode::ContextVar AddContextVar(jlm::rvsdg::Output &origin)
PhiNode::FixVar AddFixVar(std::shared_ptr< const jlm::rvsdg::Type > type)
void begin(rvsdg::Region *parent)
rvsdg::Region * subregion() const noexcept
A phi node represents the fixpoint of mutually recursive definitions.
FixVar MapResultFixVar(const rvsdg::Input &result) const noexcept
Maps region result to fixpoint variable.
PhiNode * copy(rvsdg::Region *region, rvsdg::SubstitutionMap &smap) const override
Copy a node with substitutions.
ContextVar MapInputContextVar(const rvsdg::Input &input) const noexcept
Maps input to context variable.
std::optional< ContextVar > MapArgumentContextVar(const rvsdg::Output &argument) const noexcept
Attempts to map bound variable reference to context variable.
static std::vector< rvsdg::LambdaNode * > ExtractLambdaNodes(const PhiNode &phiNode)
std::vector< FixVar > GetFixVars() const noexcept
Gets all fixpoint variables.
void RemoveContextVars(std::vector< ContextVar > vars)
Removes context variables from phi node.
FixVar MapOutputFixVar(const rvsdg::Output &output) const noexcept
Maps output to fixpoint variable.
std::vector< ContextVar > GetContextVars() const noexcept
Gets all bound context variables.
std::optional< FixVar > MapArgumentFixVar(const rvsdg::Output &argument) const noexcept
Tries to map region argument to fixpoint variable.
rvsdg::Region * subregion() const noexcept
std::variant< FixVar, ContextVar > MapArgument(const rvsdg::Output &argument) const noexcept
Maps region argument to its function.
ContextVar AddContextVar(jlm::rvsdg::Output &origin)
Adds a context variable to the phi node.
void RemoveFixVars(std::vector< FixVar > vars)
Removes fixpoint variables from the phi node.
const PhiOperation & GetOperation() const noexcept override
std::string debug_string() const override
std::unique_ptr< Operation > copy() const override
Represent acyclic RVSDG subgraphs.
size_t RemoveResults(const util::HashSet< size_t > &indices)
RegionArgument * argument(size_t index) const noexcept
RegionArgument & addArgument(std::unique_ptr< RegionArgument > argument)
void copy(Region *target, SubstitutionMap &smap) const
Copy a region with substitutions.
RegionResult & addResult(std::unique_ptr< RegionResult > result)
RegionResult * result(size_t index) const noexcept
size_t RemoveArguments(const util::HashSet< size_t > &indices)
RegionArgument & insertArgument(size_t index, std::unique_ptr< RegionArgument > argument)
StructuralInput * addInput(std::unique_ptr< StructuralInput > input, bool notifyRegion)
StructuralOutput * addOutput(std::unique_ptr< StructuralOutput > input)
StructuralOutput * output(size_t index) const noexcept
StructuralInput * input(size_t index) const noexcept
Output & lookup(const Output &original) const
bool insert(ItemType item)
#define JLM_UNREACHABLE(msg)
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
Description of a recursively defined variable.
rvsdg::Input * result
Definition result of a variable within the phi region.