Jlm
MemoryStateEncoder.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2021 Nico Reißmann <nico.reissmann@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
6 #ifndef JLM_LLVM_OPT_ALIAS_ANALYSES_MEMORYSTATEENCODER_HPP
7 #define JLM_LLVM_OPT_ALIAS_ANALYSES_MEMORYSTATEENCODER_HPP
8 
9 #include <memory>
10 #include <vector>
11 
12 namespace jlm::rvsdg
13 {
14 class DeltaNode;
15 class GammaNode;
16 class LambdaNode;
17 class Output;
18 class PhiNode;
19 class Region;
20 class RvsdgModule;
21 class SimpleNode;
22 class StructuralNode;
23 class ThetaNode;
24 }
25 
26 namespace jlm::util
27 {
28 class StatisticsCollector;
29 }
30 
31 namespace jlm::llvm
32 {
33 
34 namespace aa
35 {
36 
37 class ModRefSummary;
38 
53 class MemoryStateEncoder final
54 {
55 public:
56  class Context;
57 
58  ~MemoryStateEncoder() noexcept;
59 
61 
63 
65 
67  operator=(const MemoryStateEncoder &) = delete;
68 
70  operator=(MemoryStateEncoder &&) = delete;
71 
72  void
73  Encode(
74  rvsdg::RvsdgModule & rvsdgModule,
75  const ModRefSummary & modRefSummary,
76  util::StatisticsCollector & statisticsCollector);
77 
78 private:
79  void
80  EncodeRegion(rvsdg::Region & region);
81 
82  void
83  EncodeStructuralNode(rvsdg::StructuralNode & structuralNode);
84 
85  void
86  EncodeSimpleNode(const rvsdg::SimpleNode & simpleNode);
87 
88  void
89  EncodeAlloca(const rvsdg::SimpleNode & allocaNode);
90 
91  void
92  EncodeMalloc(const rvsdg::SimpleNode & mallocNode);
93 
94  void
95  EncodeLoad(const rvsdg::SimpleNode & node);
96 
97  void
98  EncodeStore(const rvsdg::SimpleNode & node);
99 
100  void
101  EncodeFree(const rvsdg::SimpleNode & freeNode);
102 
103  void
104  EncodeCall(const rvsdg::SimpleNode & callNode);
105 
106  void
107  EncodeMemcpy(const rvsdg::SimpleNode & memcpyNode);
108 
109  void
110  EncodeLambda(const rvsdg::LambdaNode & lambda);
111 
112  void
113  EncodeLambdaEntry(const rvsdg::LambdaNode & lambdaNode);
114 
115  void
116  EncodeLambdaExit(const rvsdg::LambdaNode & lambdaNode);
117 
118  void
119  EncodePhi(const rvsdg::PhiNode & phiNode);
120 
121  void
122  EncodeDelta(const rvsdg::DeltaNode & deltaNode);
123 
124  void
125  EncodeGamma(rvsdg::GammaNode & gammaNode);
126 
127  void
128  EncodeGammaEntry(rvsdg::GammaNode & gammaNode);
129 
130  void
131  EncodeGammaExit(rvsdg::GammaNode & gammaNode);
132 
133  void
134  EncodeTheta(rvsdg::ThetaNode & thetaNode);
135 
136  std::vector<rvsdg::Output *>
137  EncodeThetaEntry(rvsdg::ThetaNode & thetaNode);
138 
139  void
141  rvsdg::ThetaNode & thetaNode,
142  const std::vector<rvsdg::Output *> & thetaStateOutputs);
143 
153  [[nodiscard]] static rvsdg::SimpleNode &
155  const rvsdg::SimpleNode & node,
156  const std::vector<rvsdg::Output *> & memoryStates);
157 
167  [[nodiscard]] static rvsdg::SimpleNode &
169  const rvsdg::SimpleNode & node,
170  const std::vector<rvsdg::Output *> & memoryStates);
171 
182  [[nodiscard]] static std::vector<rvsdg::Output *>
184  const rvsdg::SimpleNode & memcpyNode,
185  const std::vector<rvsdg::Output *> & memoryStates);
186 
187  std::unique_ptr<Context> Context_;
188 };
189 
190 }
191 }
192 
193 #endif // JLM_LLVM_OPT_ALIAS_ANALYSES_MEMORYSTATEENCODER_HPP
Context for the memory state encoder.
static std::vector< rvsdg::Output * > ReplaceMemcpyNode(const rvsdg::SimpleNode &memcpyNode, const std::vector< rvsdg::Output * > &memoryStates)
void EncodeMalloc(const rvsdg::SimpleNode &mallocNode)
void Encode(rvsdg::RvsdgModule &rvsdgModule, const ModRefSummary &modRefSummary, util::StatisticsCollector &statisticsCollector)
void EncodeCall(const rvsdg::SimpleNode &callNode)
void EncodeLambdaEntry(const rvsdg::LambdaNode &lambdaNode)
void EncodeAlloca(const rvsdg::SimpleNode &allocaNode)
static rvsdg::SimpleNode & ReplaceStoreNode(const rvsdg::SimpleNode &node, const std::vector< rvsdg::Output * > &memoryStates)
void EncodeStructuralNode(rvsdg::StructuralNode &structuralNode)
void EncodeDelta(const rvsdg::DeltaNode &deltaNode)
void EncodeLambda(const rvsdg::LambdaNode &lambda)
void EncodeLoad(const rvsdg::SimpleNode &node)
void EncodeGammaExit(rvsdg::GammaNode &gammaNode)
void EncodeStore(const rvsdg::SimpleNode &node)
std::unique_ptr< Context > Context_
void EncodeGammaEntry(rvsdg::GammaNode &gammaNode)
void EncodeRegion(rvsdg::Region &region)
static rvsdg::SimpleNode & ReplaceLoadNode(const rvsdg::SimpleNode &node, const std::vector< rvsdg::Output * > &memoryStates)
void EncodeSimpleNode(const rvsdg::SimpleNode &simpleNode)
std::vector< rvsdg::Output * > EncodeThetaEntry(rvsdg::ThetaNode &thetaNode)
void EncodePhi(const rvsdg::PhiNode &phiNode)
void EncodeMemcpy(const rvsdg::SimpleNode &memcpyNode)
void EncodeGamma(rvsdg::GammaNode &gammaNode)
void EncodeFree(const rvsdg::SimpleNode &freeNode)
void EncodeLambdaExit(const rvsdg::LambdaNode &lambdaNode)
void EncodeThetaExit(rvsdg::ThetaNode &thetaNode, const std::vector< rvsdg::Output * > &thetaStateOutputs)
void EncodeTheta(rvsdg::ThetaNode &thetaNode)
Global memory state passed between functions.