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 GammaNode;
15class LambdaNode;
16class Output;
17class Region;
18class RvsdgModule;
19class SimpleNode;
20class ThetaNode;
21}
22
23namespace jlm::util
24{
25class StatisticsCollector;
26}
27
28namespace jlm::llvm::aa
29{
30
31class ModRefSummary;
32
48{
49public:
51 class Statistics;
52 class StateMap;
53
55 {
56 size_t numReplacedLoads = 0;
58
61 };
62
64
66
68
70
72 operator=(const MemoryStateEncoder &) = delete;
73
75 operator=(MemoryStateEncoder &&) = delete;
76
77 void
78 Encode(
79 rvsdg::RvsdgModule & rvsdgModule,
80 const ModRefSummary & modRefSummary,
81 util::StatisticsCollector & statisticsCollector);
82
83private:
84 void
85 encodeInterProcedural(rvsdg::Region & region);
86
87 void
88 encodeIntraProcedural(rvsdg::Region & region, StateMap & stateMap);
89
90 void
91 encodeAlloca(const rvsdg::SimpleNode & allocaNode, StateMap & stateMap) const;
92
93 void
94 encodeMalloc(const rvsdg::SimpleNode & mallocNode, StateMap & stateMap) const;
95
96 void
97 encodeLoad(const rvsdg::SimpleNode & node, StateMap & stateMap);
98
99 void
100 encodeStore(const rvsdg::SimpleNode & node, StateMap & stateMap);
101
102 void
103 encodeFree(const rvsdg::SimpleNode & freeNode, StateMap & stateMap) const;
104
105 void
106 encodeCall(const rvsdg::SimpleNode & callNode, StateMap & stateMap) const;
107
108 void
109 encodeMemcpy(const rvsdg::SimpleNode & memcpyNode, StateMap & stateMap) const;
110
111 void
112 encodeMemset(const rvsdg::SimpleNode & memsetNode, StateMap & stateMap) const;
113
114 void
115 encodeMemmove(const rvsdg::SimpleNode & memmoveNode, StateMap & stateMap) const;
116
117 void
118 encodeLambda(const rvsdg::LambdaNode & lambda);
119
120 void
121 encodeGamma(rvsdg::GammaNode & gammaNode, StateMap & stateMap);
122
123 void
124 encodeTheta(rvsdg::ThetaNode & thetaNode, StateMap & stateMap);
125
126 std::unique_ptr<MemoryStateTypeCounters>
127 gatherStatistics(const rvsdg::Region & region) const;
128
138 [[nodiscard]] static rvsdg::SimpleNode &
140 const rvsdg::SimpleNode & node,
141 const std::vector<rvsdg::Output *> & memoryStates);
142
152 [[nodiscard]] static rvsdg::SimpleNode &
154 const rvsdg::SimpleNode & node,
155 const std::vector<rvsdg::Output *> & memoryStates);
156
167 [[nodiscard]] static rvsdg::SimpleNode &
169 const rvsdg::SimpleNode & memCpyNode,
170 const std::vector<rvsdg::Output *> & memoryStates);
171
182 [[nodiscard]] static rvsdg::SimpleNode &
184 const rvsdg::SimpleNode & memsetNode,
185 const std::vector<rvsdg::Output *> & memoryStates);
186
197 [[nodiscard]] static rvsdg::SimpleNode &
199 const rvsdg::SimpleNode & memmoveNode,
200 const std::vector<rvsdg::Output *> & memoryStates);
201
203 std::unique_ptr<Statistics> statistics_;
204 const ModRefSummary * modRefSummary_ = nullptr;
205};
206
207}
208
209#endif // JLM_LLVM_OPT_ALIAS_ANALYSES_MEMORYSTATEENCODER_HPP
Hash map for mapping points-to graph memory nodes to RVSDG memory states.
Statistics class for memory state encoder encoding.
void encodeMemmove(const rvsdg::SimpleNode &memmoveNode, StateMap &stateMap) const
void encodeStore(const rvsdg::SimpleNode &node, StateMap &stateMap)
void encodeMemcpy(const rvsdg::SimpleNode &memcpyNode, StateMap &stateMap) const
void encodeMalloc(const rvsdg::SimpleNode &mallocNode, StateMap &stateMap) const
void Encode(rvsdg::RvsdgModule &rvsdgModule, const ModRefSummary &modRefSummary, util::StatisticsCollector &statisticsCollector)
void encodeTheta(rvsdg::ThetaNode &thetaNode, StateMap &stateMap)
void encodeIntraProcedural(rvsdg::Region &region, StateMap &stateMap)
static rvsdg::SimpleNode & replaceStoreNode(const rvsdg::SimpleNode &node, const std::vector< rvsdg::Output * > &memoryStates)
static rvsdg::SimpleNode & replaceMemmoveNode(const rvsdg::SimpleNode &memmoveNode, const std::vector< rvsdg::Output * > &memoryStates)
void encodeLambda(const rvsdg::LambdaNode &lambda)
void encodeLoad(const rvsdg::SimpleNode &node, StateMap &stateMap)
static rvsdg::SimpleNode & replaceMemcpyNode(const rvsdg::SimpleNode &memCpyNode, const std::vector< rvsdg::Output * > &memoryStates)
void encodeMemset(const rvsdg::SimpleNode &memsetNode, StateMap &stateMap) const
std::unique_ptr< Statistics > statistics_
void encodeCall(const rvsdg::SimpleNode &callNode, StateMap &stateMap) const
static rvsdg::SimpleNode & replaceLoadNode(const rvsdg::SimpleNode &node, const std::vector< rvsdg::Output * > &memoryStates)
void encodeFree(const rvsdg::SimpleNode &freeNode, StateMap &stateMap) const
void encodeAlloca(const rvsdg::SimpleNode &allocaNode, StateMap &stateMap) const
std::unique_ptr< MemoryStateTypeCounters > gatherStatistics(const rvsdg::Region &region) const
void encodeInterProcedural(rvsdg::Region &region)
static rvsdg::SimpleNode & replaceMemsetNode(const rvsdg::SimpleNode &memsetNode, const std::vector< rvsdg::Output * > &memoryStates)
void encodeGamma(rvsdg::GammaNode &gammaNode, StateMap &stateMap)
static util::StatisticsCollector statisticsCollector