Jlm
LoadChainSeparation.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2025 Nico Reißmann <nico.reissmann@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
6 #ifndef JLM_LLVM_OPT_LOADCHAINSEPARATION_HPP
7 #define JLM_LLVM_OPT_LOADCHAINSEPARATION_HPP
8 
10 
11 namespace jlm::rvsdg
12 {
13 class GammaNode;
14 class LambdaNode;
15 class ThetaNode;
16 }
17 
18 namespace jlm::llvm
19 {
20 
37 {
38  class Context;
39 
40  // FIXME: I really would like to rename this pass to ReferenceChainSeparation
41 public:
42  ~LoadChainSeparation() noexcept override;
43 
45 
47 
49  operator=(const LoadChainSeparation &) = delete;
50 
51  void
52  Run(rvsdg::RvsdgModule & module, util::StatisticsCollector & statisticsCollector) override;
53 
54 private:
55  void
56  separateReferenceChainsInRegion(rvsdg::Region & region);
57 
58  void
59  separateReferenceChainsInLambda(rvsdg::LambdaNode & lambdaNode);
60 
61  void
63  rvsdg::ThetaNode & thetaNode,
64  util::HashSet<rvsdg::Output *> & visitedOutputs);
65 
66  void
67  separateRefenceChainsInGamma(rvsdg::GammaNode & gammaNode);
68 
79  bool
81  rvsdg::Output & startOutput,
82  util::HashSet<rvsdg::Output *> & visitedOutputs);
83 
88  {
92  enum class Type
93  {
97  Modification,
98 
102  Reference,
103  };
104 
110  };
111 
112  struct ModRefChain
113  {
114  void
115  add(ModRefChainLink modRefChainLink)
116  {
118  links.push_back(std::move(modRefChainLink));
119  }
120 
122  std::vector<ModRefChainLink> links{};
123  };
124 
126  {
127  void
128  add(ModRefChain modRefChain)
129  {
130  // We only care about chains that have at least two links
131  if (modRefChain.links.size() >= 2)
132  {
133  modRefChains.push_back(std::move(modRefChain));
134  }
135 
137  }
138 
140  std::vector<ModRefChain> modRefChains{};
141  };
142 
152  void
154  rvsdg::Output & startOutput,
155  util::HashSet<rvsdg::Output *> & visitedOutputs,
156  ModRefChainSummary & summary);
157 
167  static std::vector<ModRefChain>
168  extractReferenceSubchains(const ModRefChain & modRefChain);
169 
176  static rvsdg::Input &
178 
179  std::unique_ptr<Context> Context_{};
180 };
181 
182 }
183 
184 #endif
void Run(rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Perform RVSDG transformation.
std::unique_ptr< Context > Context_
static rvsdg::Input & mapMemoryStateOutputToInput(const rvsdg::Output &output)
void separateRefenceChainsInGamma(rvsdg::GammaNode &gammaNode)
static std::vector< ModRefChain > extractReferenceSubchains(const ModRefChain &modRefChain)
void traceModRefChains(rvsdg::Output &startOutput, util::HashSet< rvsdg::Output * > &visitedOutputs, ModRefChainSummary &summary)
void separateReferenceChainsInLambda(rvsdg::LambdaNode &lambdaNode)
bool separateReferenceChains(rvsdg::Output &startOutput, util::HashSet< rvsdg::Output * > &visitedOutputs)
~LoadChainSeparation() noexcept override
void separateReferenceChainsInRegion(rvsdg::Region &region)
void separateRefenceChainsInTheta(rvsdg::ThetaNode &thetaNode, util::HashSet< rvsdg::Output * > &visitedOutputs)
Represents an RVSDG transformation.
Global memory state passed between functions.
void add(ModRefChainLink modRefChainLink)