Jlm
Loading...
Searching...
No Matches
NodeHoisting.hpp
Go to the documentation of this file.
1/*
2 * Copyright 2017 Nico Reißmann <nico.reissmann@gmail.com>
3 * See COPYING for terms of redistribution.
4 */
5
6#ifndef JLM_LLVM_OPT_NODEHOISTING_HPP
7#define JLM_LLVM_OPT_NODEHOISTING_HPP
8
9#include <jlm/rvsdg/theta.hpp>
11
12namespace jlm::rvsdg
13{
14class GammaNode;
15class LambdaNode;
16}
17
18namespace jlm::llvm
19{
20
37{
38 class Context;
39
40public:
41 class Statistics;
42
43 ~NodeHoisting() noexcept override;
44
46
47 void
48 Run(rvsdg::RvsdgModule & rvsdgModule, util::StatisticsCollector & statisticsCollector) override;
49
50private:
51 void
52 hoistNodesInRootRegion(rvsdg::Region & region);
53
54 void
55 hoistNodesInLambda(rvsdg::LambdaNode & lambdaNode);
56
57 void
58 markNodes(const rvsdg::Region & region);
59
60 void
61 hoistNodes(rvsdg::Region & region);
62
63 void
64 copyNodeToTargetRegion(rvsdg::Node & node) const;
65
66 static std::vector<rvsdg::Input *>
67 getUsersFromTargetRegion(rvsdg::Node & node, rvsdg::Region & targetRegion);
68
69 static rvsdg::Input &
70 getUserFromTargetRegion(rvsdg::Input & input, rvsdg::Region & targetRegion);
71
72 rvsdg::Region &
73 computeTargetRegion(const rvsdg::Node & node) const;
74
75 rvsdg::Region &
76 computeTargetRegion(const rvsdg::Output & output) const;
77
78 void
79 printHoistChain(const rvsdg::Region & region) const;
80
81 static bool
82 isInvariantMemoryStateLoopVar(const rvsdg::ThetaNode::LoopVar & loopVar);
83
84 std::unique_ptr<Context> context_{};
85};
86
87}
88
89#endif
Node Hoisting Transformation.
void hoistNodesInRootRegion(rvsdg::Region &region)
void hoistNodes(rvsdg::Region &region)
void hoistNodesInLambda(rvsdg::LambdaNode &lambdaNode)
void Run(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
~NodeHoisting() noexcept override
static std::vector< rvsdg::Input * > getUsersFromTargetRegion(rvsdg::Node &node, rvsdg::Region &targetRegion)
rvsdg::Region & computeTargetRegion(const rvsdg::Node &node) const
std::unique_ptr< Context > context_
static bool isInvariantMemoryStateLoopVar(const rvsdg::ThetaNode::LoopVar &loopVar)
void copyNodeToTargetRegion(rvsdg::Node &node) const
void printHoistChain(const rvsdg::Region &region) const
void markNodes(const rvsdg::Region &region)
static rvsdg::Input & getUserFromTargetRegion(rvsdg::Input &input, rvsdg::Region &targetRegion)
Represents an RVSDG transformation.
Global memory state passed between functions.
static util::StatisticsCollector statisticsCollector