Jlm
push.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_PUSH_HPP
7 #define JLM_LLVM_OPT_PUSH_HPP
8 
9 #include <jlm/rvsdg/theta.hpp>
11 
12 namespace jlm::rvsdg
13 {
14 class GammaNode;
15 class LambdaNode;
16 }
17 
18 namespace jlm::llvm
19 {
20 
36 class NodeHoisting final : public rvsdg::Transformation
37 {
38  class Context;
39 
40 public:
41  class Statistics;
42 
43  ~NodeHoisting() noexcept override;
44 
45  NodeHoisting();
46 
47  void
48  Run(rvsdg::RvsdgModule & rvsdgModule, util::StatisticsCollector & statisticsCollector) override;
49 
50 private:
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::Output *>
67  getOperandsFromTargetRegion(rvsdg::Node & node, rvsdg::Region & targetRegion);
68 
69  static rvsdg::Output &
70  getOperandFromTargetRegion(rvsdg::Output & output, rvsdg::Region & targetRegion);
71 
72  size_t
73  computeRegionDepth(const rvsdg::Region & region) const;
74 
75  rvsdg::Region &
76  computeTargetRegion(const rvsdg::Node & node) const;
77 
78  rvsdg::Region &
79  computeTargetRegion(const rvsdg::Output & output) 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.
Definition: push.hpp:37
void hoistNodesInRootRegion(rvsdg::Region &region)
Definition: push.cpp:381
void hoistNodes(rvsdg::Region &region)
Definition: push.cpp:344
void hoistNodesInLambda(rvsdg::LambdaNode &lambdaNode)
Definition: push.cpp:370
void Run(rvsdg::RvsdgModule &rvsdgModule, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
Definition: push.cpp:411
~NodeHoisting() noexcept override
rvsdg::Region & computeTargetRegion(const rvsdg::Node &node) const
Definition: push.cpp:207
static std::vector< rvsdg::Output * > getOperandsFromTargetRegion(rvsdg::Node &node, rvsdg::Region &targetRegion)
Definition: push.cpp:305
std::unique_ptr< Context > context_
Definition: push.hpp:84
static bool isInvariantMemoryStateLoopVar(const rvsdg::ThetaNode::LoopVar &loopVar)
Definition: push.cpp:122
void copyNodeToTargetRegion(rvsdg::Node &node) const
Definition: push.cpp:318
void markNodes(const rvsdg::Region &region)
Definition: push.cpp:245
static rvsdg::Output & getOperandFromTargetRegion(rvsdg::Output &output, rvsdg::Region &targetRegion)
Definition: push.cpp:278
size_t computeRegionDepth(const rvsdg::Region &region) const
Definition: push.cpp:110
Represents an RVSDG transformation.
Global memory state passed between functions.