6 #ifndef JLM_LLVM_IR_AGGREGATION_HPP
7 #define JLM_LLVM_IR_AGGREGATION_HPP
16 class ControlFlowGraph;
158 std::vector<std::unique_ptr<AggregationNode>>
children_;
166 std::is_base_of<AggregationNode, T>::value,
167 "Template parameter T must be derived from jlm::AggregationNode");
169 return dynamic_cast<const T *
>(node) !=
nullptr;
203 [[nodiscard]] std::string
206 static std::unique_ptr<AggregationNode>
207 create(
const std::vector<llvm::Argument *> & arguments)
209 return std::make_unique<EntryAggregationNode>(arguments);
252 [[nodiscard]] std::string
255 static inline std::unique_ptr<AggregationNode>
256 create(
const std::vector<const Variable *> & results)
258 return std::make_unique<ExitAggregationNode>(results);
276 [[nodiscard]] std::string
285 static std::unique_ptr<AggregationNode>
288 return std::make_unique<BasicBlockAggregationNode>();
291 static std::unique_ptr<AggregationNode>
294 return std::make_unique<BasicBlockAggregationNode>(std::move(bb));
312 [[nodiscard]] std::string
315 static std::unique_ptr<AggregationNode>
316 create(std::unique_ptr<AggregationNode> n1, std::unique_ptr<AggregationNode> n2)
318 return std::make_unique<LinearAggregationNode>(std::move(n1), std::move(n2));
329 [[nodiscard]] std::
string
335 return std::make_unique<BranchAggregationNode>();
349 [[nodiscard]] std::string
352 static inline std::unique_ptr<AggregationNode>
353 create(std::unique_ptr<AggregationNode> body)
355 return std::make_unique<LoopAggregationNode>(std::move(body));
396 std::unique_ptr<AggregationNode>
400 ntacs(
const AggregationNode & root);
const_iterator end() const noexcept
virtual ~AggregationNode() noexcept
AggregationNode(const AggregationNode &other)=delete
AggregationNode(AggregationNode &&other)=delete
AggregationNode & operator=(const AggregationNode &other)=delete
iterator begin() noexcept
const AggregationNode * parent() const noexcept
virtual std::string debug_string() const =0
size_t nchildren() const noexcept
util::PtrIterator< AggregationNode, std::vector< std::unique_ptr< AggregationNode > >::iterator > iterator
AggregationNode * parent_
AggregationNode & operator=(AggregationNode &&other)=delete
size_t nnodes() const noexcept
const_iterator begin() const noexcept
void add_child(std::unique_ptr< AggregationNode > child)
size_t index() const noexcept
static void normalize(AggregationNode &node)
AggregationNode * parent() noexcept
util::PtrIterator< const AggregationNode, std::vector< std::unique_ptr< AggregationNode > >::const_iterator > const_iterator
AggregationNode * child(size_t n) const noexcept
std::vector< std::unique_ptr< AggregationNode > > children_
const ThreeAddressCodeList & tacs() const noexcept
static std::unique_ptr< AggregationNode > create(ThreeAddressCodeList &&bb)
std::string debug_string() const override
static std::unique_ptr< AggregationNode > create()
~BasicBlockAggregationNode() noexcept override
static std::unique_ptr< AggregationNode > create()
~BranchAggregationNode() noexcept override
std::string debug_string() const override
std::vector< llvm::Argument * > arguments_
const llvm::Argument * argument(size_t index) const noexcept
constiterator end() const
size_t narguments() const noexcept
constiterator begin() const
std::string debug_string() const override
util::PtrIterator< const llvm::Argument, std::vector< llvm::Argument * >::const_iterator > constiterator
static std::unique_ptr< AggregationNode > create(const std::vector< llvm::Argument * > &arguments)
~EntryAggregationNode() noexcept override
std::vector< const Variable * > results_
std::vector< const Variable * >::const_iterator const_iterator
const Variable * result(size_t index) const noexcept
static std::unique_ptr< AggregationNode > create(const std::vector< const Variable * > &results)
~ExitAggregationNode() noexcept override
const_iterator end() const
const_iterator begin() const
std::string debug_string() const override
size_t nresults() const noexcept
std::string debug_string() const override
~LinearAggregationNode() noexcept override
static std::unique_ptr< AggregationNode > create(std::unique_ptr< AggregationNode > n1, std::unique_ptr< AggregationNode > n2)
std::string debug_string() const override
~LoopAggregationNode() noexcept override
static std::unique_ptr< AggregationNode > create(std::unique_ptr< AggregationNode > body)
Global memory state passed between functions.
static ControlFlowGraphNode * aggregate(ControlFlowGraphNode *, ControlFlowGraphNode *, AggregationMap &)
size_t ntacs(const AggregationNode &root)
static bool is(const AggregationNode *node)