17 : type_(std::
move(type))
33std::unique_ptr<rvsdg::Operation>
36 return std::make_unique<LambdaOperation>(*
this);
62 for (std::size_t
n = 0;
n < type->Arguments().size(); ++
n)
72 std::vector<rvsdg::Input *> results;
85 subregion()->argument(GetOperation().Type()->NumArguments() + input.index()) };
88[[
nodiscard]] std::optional<LambdaNode::ContextVar>
92 auto numArguments = GetOperation().Type()->NumArguments();
95 return ContextVar{ input(output.index() - GetOperation().
Type()->NumArguments()),
104std::variant<LambdaNode::ArgumentVar, LambdaNode::ContextVar>
119[[
nodiscard]] std::vector<LambdaNode::ContextVar>
122 std::vector<ContextVar>
vars;
135 addInput(std::make_unique<StructuralInput>(
this, &origin, origin.
Type()),
true);
143 return new LambdaNode(parent, std::move(operation));
156 if (
GetOperation().type().NumResults() != results.size())
159 for (
size_t n = 0;
n < results.size();
n++)
170 for (
const auto & origin : results)
194 std::unique_ptr<LambdaOperation>(util::assertedCast<LambdaOperation>(
op.copy().release())));
201 subregionmap.insert(
cv.inner, lambda->AddContextVar(*origin).inner);
206 auto newArgs = lambda->GetFunctionArguments();
208 for (std::size_t
n = 0;
n <
args.size(); ++
n)
217 std::vector<jlm::rvsdg::Output *> results;
219 results.push_back(&
subregionmap.lookup(*result->origin()));
222 auto o = lambda->finalize(results);
262 const std::vector<jlm::rvsdg::Output *> & results,
263 std::unique_ptr<LambdaOperation>
op)
282 throw std::logic_error(
"node was not in a lambda");
util::HashSet< rvsdg::Output * > arguments
const jlm::rvsdg::Type & ResultType(size_t index) const noexcept
Output & Finalize(const std::vector< jlm::rvsdg::Output * > &results, std::unique_ptr< LambdaOperation > op)
Verifies well-formedness of lambda node and completes it.
LambdaNode::ContextVar AddContextVar(jlm::rvsdg::Output &origin)
Adds a context/free variable to the lambda node.
rvsdg::Region * GetRegion() noexcept
Returns region to place nodes in.
LambdaBuilder(Region ®ion, std::vector< std::shared_ptr< const Type > > argtypes)
Creates builder for a lambda construct.
std::vector< Output * > Arguments()
Obtains definition points of parameters to the function.
LambdaNode * copy(rvsdg::Region *region, const std::vector< jlm::rvsdg::Output * > &operands) const override
rvsdg::Output * finalize(const std::vector< jlm::rvsdg::Output * > &results)
std::variant< ArgumentVar, ContextVar > MapArgument(const rvsdg::Output &output) const
Maps region argument to its disposition (formal argument or context var).
std::vector< rvsdg::Output * > GetFunctionArguments() const
ContextVar MapInputContextVar(const rvsdg::Input &input) const noexcept
Maps input to context variable.
std::optional< ContextVar > MapBinderContextVar(const rvsdg::Output &output) const noexcept
Maps bound variable reference to context variable.
ContextVar AddContextVar(jlm::rvsdg::Output &origin)
Adds a context/free variable to the lambda node.
LambdaNode(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > op)
std::unique_ptr< LambdaOperation > Operation_
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
std::vector< rvsdg::Input * > GetFunctionResults() const
rvsdg::Output * output() const noexcept
rvsdg::Region * subregion() const noexcept
std::vector< ContextVar > GetContextVars() const noexcept
Gets all bound context variables.
LambdaOperation & GetOperation() const noexcept override
LambdaOperation(std::shared_ptr< const FunctionType > type)
bool operator==(const Operation &other) const noexcept override
const FunctionType & type() const noexcept
const std::shared_ptr< const FunctionType > & Type() const noexcept
std::unique_ptr< Operation > copy() const override
~LambdaOperation() override
std::string debug_string() const override
rvsdg::Region * region() const noexcept
size_t ninputs() const noexcept
size_t noutputs() const noexcept
virtual Node * copy(rvsdg::Region *region, const std::vector< jlm::rvsdg::Output * > &operands) const
size_t index() 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.
RegionArgument * argument(size_t index) const noexcept
void copy(Region *target, SubstitutionMap &smap) const
Copy a region with substitutions.
size_t nresults() const noexcept
RegionResult * result(size_t index) const noexcept
rvsdg::StructuralNode * node() const noexcept
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
constexpr Type() noexcept
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)
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.
rvsdg::LambdaNode & getSurroundingLambdaNode(rvsdg::Node &node)
static std::string strfmt(Args... args)
Formal argument variable.