Jlm
Loading...
Searching...
No Matches
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
12namespace jlm::rvsdg
13{
14class DeltaNode;
15class GammaNode;
16class LambdaNode;
17class Output;
18class PhiNode;
19class Region;
20class RvsdgModule;
21class SimpleNode;
22class StructuralNode;
23class ThetaNode;
24}
25
26namespace jlm::util
27{
28class StatisticsCollector;
29}
30
31namespace jlm::llvm
32{
33
34namespace aa
35{
36
37class ModRefSummary;
38
54{
55public:
56 class Context;
57
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
78private:
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 EncodeMemset(const rvsdg::SimpleNode & memsetNode);
111
112 void
113 EncodeMemmove(const rvsdg::SimpleNode & memmoveNode);
114
115 void
116 EncodeLambda(const rvsdg::LambdaNode & lambda);
117
118 void
119 EncodeLambdaEntry(const rvsdg::LambdaNode & lambdaNode);
120
121 void
122 EncodeLambdaExit(const rvsdg::LambdaNode & lambdaNode);
123
124 void
125 EncodePhi(const rvsdg::PhiNode & phiNode);
126
127 void
128 EncodeDelta(const rvsdg::DeltaNode & deltaNode);
129
130 void
131 EncodeGamma(rvsdg::GammaNode & gammaNode);
132
133 void
134 EncodeGammaEntry(rvsdg::GammaNode & gammaNode);
135
136 void
137 EncodeGammaExit(rvsdg::GammaNode & gammaNode);
138
139 void
140 EncodeTheta(rvsdg::ThetaNode & thetaNode);
141
142 std::vector<rvsdg::Output *>
143 EncodeThetaEntry(rvsdg::ThetaNode & thetaNode);
144
145 void
147 rvsdg::ThetaNode & thetaNode,
148 const std::vector<rvsdg::Output *> & thetaStateOutputs);
149
159 [[nodiscard]] static rvsdg::SimpleNode &
161 const rvsdg::SimpleNode & node,
162 const std::vector<rvsdg::Output *> & memoryStates);
163
173 [[nodiscard]] static rvsdg::SimpleNode &
175 const rvsdg::SimpleNode & node,
176 const std::vector<rvsdg::Output *> & memoryStates);
177
188 [[nodiscard]] static std::vector<rvsdg::Output *>
190 const rvsdg::SimpleNode & memcpyNode,
191 const std::vector<rvsdg::Output *> & memoryStates);
192
203 [[nodiscard]] static std::vector<rvsdg::Output *>
205 const rvsdg::SimpleNode & memsetNode,
206 const std::vector<rvsdg::Output *> & memoryStates);
207
218 [[nodiscard]] static std::vector<rvsdg::Output *>
220 const rvsdg::SimpleNode & memmoveNode,
221 const std::vector<rvsdg::Output *> & memoryStates);
222
223 std::unique_ptr<Context> Context_;
224};
225
226}
227}
228
229#endif // JLM_LLVM_OPT_ALIAS_ANALYSES_MEMORYSTATEENCODER_HPP
static jlm::util::StatisticsCollector statisticsCollector
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)
static std::vector< rvsdg::Output * > ReplaceMemmoveNode(const rvsdg::SimpleNode &memmoveNode, const std::vector< rvsdg::Output * > &memoryStates)
void EncodeRegion(rvsdg::Region &region)
static rvsdg::SimpleNode & ReplaceLoadNode(const rvsdg::SimpleNode &node, const std::vector< rvsdg::Output * > &memoryStates)
void EncodeMemmove(const rvsdg::SimpleNode &memmoveNode)
void EncodeSimpleNode(const rvsdg::SimpleNode &simpleNode)
std::vector< rvsdg::Output * > EncodeThetaEntry(rvsdg::ThetaNode &thetaNode)
void EncodePhi(const rvsdg::PhiNode &phiNode)
static std::vector< rvsdg::Output * > ReplaceMemsetNode(const rvsdg::SimpleNode &memsetNode, const std::vector< rvsdg::Output * > &memoryStates)
void EncodeMemcpy(const rvsdg::SimpleNode &memcpyNode)
void EncodeGamma(rvsdg::GammaNode &gammaNode)
void EncodeFree(const rvsdg::SimpleNode &freeNode)
void EncodeMemset(const rvsdg::SimpleNode &memsetNode)
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.