Jlm
Loading...
Searching...
No Matches
lambda.hpp
Go to the documentation of this file.
1/*
2 * Copyright 2018 Nico Reißmann <nico.reissmann@gmail.com>
3 * Copyright 2025 Helge Bahmann <hcb@chaoticmind.net>
4 * See COPYING for terms of redistribution.
5 */
6
7#ifndef JLM_RVSDG_LAMBDA_HPP
8#define JLM_RVSDG_LAMBDA_HPP
9
11#include <jlm/rvsdg/graph.hpp>
15
16#include <optional>
17#include <utility>
18
19namespace jlm::rvsdg
20{
21
22class LambdaBuilder;
23
29{
30public:
31 ~LambdaOperation() override;
32
33 explicit LambdaOperation(std::shared_ptr<const FunctionType> type);
34
35 [[nodiscard]] const FunctionType &
37 {
38 return *type_;
39 }
40
41 [[nodiscard]] const std::shared_ptr<const FunctionType> &
43 {
44 return type_;
45 }
46
47 [[nodiscard]] std::string
48 debug_string() const override;
49
50 bool
51 operator==(const Operation & other) const noexcept override;
52
53 [[nodiscard]] std::unique_ptr<Operation>
54 copy() const override;
55
56private:
57 std::shared_ptr<const FunctionType> type_;
58};
59
83{
84public:
85 ~LambdaNode() override;
86
87private:
88 LambdaNode(rvsdg::Region & parent, std::unique_ptr<LambdaOperation> op);
89
90public:
119
124 {
129 };
130
131 [[nodiscard]] std::vector<rvsdg::Output *>
132 GetFunctionArguments() const;
133
134 [[nodiscard]] std::vector<rvsdg::Input *>
135 GetFunctionResults() const;
136
139 {
141 }
142
145
157 ContextVar
158 AddContextVar(jlm::rvsdg::Output & origin);
159
178 [[nodiscard]] ContextVar
180
198 [[nodiscard]] std::optional<ContextVar>
200
209 [[nodiscard]] std::vector<ContextVar>
211
221 std::variant<ArgumentVar, ContextVar>
223
234 size_t
236
244 size_t
246 {
247 auto match = [](const rvsdg::Input &)
248 {
249 return true;
250 };
251
253 }
254
257
258 LambdaNode *
259 copy(rvsdg::Region * region, const std::vector<jlm::rvsdg::Output *> & operands) const override;
260
261 LambdaNode *
262 copy(rvsdg::Region * region, rvsdg::SubstitutionMap & smap) const override;
263
276 Create(rvsdg::Region & parent, std::unique_ptr<LambdaOperation> operation);
277
285 rvsdg::Output *
286 finalize(const std::vector<jlm::rvsdg::Output *> & results);
287
288private:
290
292};
293
295size_t
297{
300 for (auto [input, argument] : GetContextVars())
301 {
302 if (argument->IsDead() && match(*input))
303 {
305 argumentIndices.insert(argument->index());
306 }
307 }
308
311
314
315 return numRemovedInputs;
316}
317
322{
323public:
331 LambdaBuilder(Region & region, std::vector<std::shared_ptr<const Type>> argtypes);
332
343 std::vector<Output *>
344 Arguments();
345
357 GetRegion() noexcept;
358
373
389 Output &
390 Finalize(const std::vector<jlm::rvsdg::Output *> & results, std::unique_ptr<LambdaOperation> op);
391
392private:
394};
395
405
408
409}
410
411#endif
Function type class.
size_t index() const noexcept
Definition node.hpp:52
Constructs a lambda node.
Definition lambda.hpp:322
LambdaNode * copy(rvsdg::Region *region, const std::vector< jlm::rvsdg::Output * > &operands) const override
Definition lambda.cpp:183
rvsdg::Output * finalize(const std::vector< jlm::rvsdg::Output * > &results)
Definition lambda.cpp:147
std::variant< ArgumentVar, ContextVar > MapArgument(const rvsdg::Output &output) const
Maps region argument to its disposition (formal argument or context var).
Definition lambda.cpp:105
size_t RemoveLambdaInputsWhere(const F &match)
Definition lambda.hpp:296
std::vector< rvsdg::Output * > GetFunctionArguments() const
Definition lambda.cpp:58
ContextVar MapInputContextVar(const rvsdg::Input &input) const noexcept
Maps input to context variable.
Definition lambda.cpp:81
friend class LambdaBuilder
Definition lambda.hpp:291
std::optional< ContextVar > MapBinderContextVar(const rvsdg::Output &output) const noexcept
Maps bound variable reference to context variable.
Definition lambda.cpp:89
ContextVar AddContextVar(jlm::rvsdg::Output &origin)
Adds a context/free variable to the lambda node.
Definition lambda.cpp:132
size_t PruneLambdaInputs()
Definition lambda.hpp:245
std::unique_ptr< LambdaOperation > Operation_
Definition lambda.hpp:289
static LambdaNode * Create(rvsdg::Region &parent, std::unique_ptr< LambdaOperation > operation)
Definition lambda.cpp:141
std::vector< rvsdg::Input * > GetFunctionResults() const
Definition lambda.cpp:70
rvsdg::Output * output() const noexcept
Definition lambda.cpp:177
rvsdg::Region * subregion() const noexcept
Definition lambda.hpp:138
std::vector< ContextVar > GetContextVars() const noexcept
Gets all bound context variables.
Definition lambda.cpp:120
LambdaOperation & GetOperation() const noexcept override
Definition lambda.cpp:52
Lambda operation.
Definition lambda.hpp:29
bool operator==(const Operation &other) const noexcept override
Definition lambda.cpp:27
const FunctionType & type() const noexcept
Definition lambda.hpp:36
const std::shared_ptr< const FunctionType > & Type() const noexcept
Definition lambda.hpp:42
std::unique_ptr< Operation > copy() const override
Definition lambda.cpp:34
std::shared_ptr< const FunctionType > type_
Definition lambda.hpp:57
std::string debug_string() const override
Definition lambda.cpp:21
size_t RemoveInputs(const util::HashSet< size_t > &indices)
Definition node.cpp:306
rvsdg::Region * region() const noexcept
Definition node.hpp:761
Represent acyclic RVSDG subgraphs.
Definition region.hpp:213
size_t RemoveArguments(const util::HashSet< size_t > &indices)
Definition region.cpp:213
rvsdg::Region * subregion(size_t index) const noexcept
StructuralInput * input(size_t index) const noexcept
bool insert(ItemType item)
Definition HashSet.hpp:210
#define JLM_ASSERT(x)
Definition common.hpp:16
static std::vector< jlm::rvsdg::Output * > operands(const Node *node)
Definition node.hpp:1049
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
Definition node.hpp:872
rvsdg::LambdaNode & getSurroundingLambdaNode(rvsdg::Node &node)
Definition lambda.cpp:273
Formal argument variable.
Definition lambda.hpp:124
rvsdg::Output * arg
Access argument object in subregion.
Definition lambda.hpp:128
Bound context variable.
Definition lambda.hpp:100
rvsdg::Input * input
Input variable bound into lambda node.
Definition lambda.hpp:108
rvsdg::Output * inner
Access to bound object in subregion.
Definition lambda.hpp:117