Jlm
Loading...
Searching...
No Matches
RegionAwareModRefSummarizer.hpp
Go to the documentation of this file.
1/*
2 * Copyright 2022 Nico Reißmann <nico.reissmann@gmail.com>
3 * Copyright 2025 Håvard Krogstie <krogstie.havard@gmail.com>
4 * See COPYING for terms of redistribution.
5 */
6
7#ifndef JLM_LLVM_OPT_ALIAS_ANALYSES_REGIONAWAREMODREFSUMMARIZER_HPP
8#define JLM_LLVM_OPT_ALIAS_ANALYSES_REGIONAWAREMODREFSUMMARIZER_HPP
9
13
14#include <queue>
15
16namespace jlm::llvm::aa
17{
18
19class RegionAwareModRefSummary;
20using ModRefSetIndex = uint32_t;
21
64{
65public:
66 class Statistics;
67 struct Context;
68
69 ~RegionAwareModRefSummarizer() noexcept override;
70
72
74
76 operator=(const RegionAwareModRefSummarizer &) = delete;
77
78 std::unique_ptr<ModRefSummary>
80 const rvsdg::RvsdgModule & rvsdgModule,
81 const PointsToGraph & pointsToGraph,
82 util::StatisticsCollector & statisticsCollector) override;
83
93 static std::unique_ptr<ModRefSummary>
94 Create(
95 const rvsdg::RvsdgModule & rvsdgModule,
96 const PointsToGraph & pointsToGraph,
97 util::StatisticsCollector & statisticsCollector);
98
107 static std::unique_ptr<ModRefSummary>
108 Create(const rvsdg::RvsdgModule & rvsdgModule, const PointsToGraph & pointsToGraph);
109
110private:
117 void
118 createCallGraph(const rvsdg::RvsdgModule & rvsdgModule);
119
125 static util::HashSet<PointsToGraph::NodeIndex>
126 CreateSimpleAllocaSet(const PointsToGraph & pointsToGraph);
127
136 util::HashSet<PointsToGraph::NodeIndex>
138
145 util::HashSet<PointsToGraph::NodeIndex>
146 getSimpleAllocasReachableFromRegionArguments(const rvsdg::Region & region);
147
154 util::HashSet<PointsToGraph::NodeIndex>
155 getSimpleAllocasReachableFromCallArguments(const rvsdg::SimpleNode & call);
156
164 bool
165 IsRecursionPossible(const rvsdg::LambdaNode & lambda) const;
166
176 size_t
178
183 void
185
196 void
198 ModRefSetIndex index,
199 const util::HashSet<PointsToGraph::NodeIndex> & blocklist);
200
205 void
206 AnnotateFunction(const rvsdg::LambdaNode & lambda);
207
215 void
217 const rvsdg::Region & region,
218 ModRefSetIndex modRefSet,
219 const rvsdg::LambdaNode & lambda);
220
223 const rvsdg::StructuralNode & structuralNode,
224 const rvsdg::LambdaNode & lambda);
225
226 std::optional<ModRefSetIndex>
227 AnnotateSimpleNode(const rvsdg::SimpleNode & simpleNode, const rvsdg::LambdaNode & lambda);
228
236 void
238 ModRefSetIndex modRefSetIndex,
239 const rvsdg::Output & origin,
240 std::optional<size_t> minTargetSize,
241 ModRefEffect modRefEffect);
242
244 AnnotateLoad(const rvsdg::SimpleNode & loadNode, const rvsdg::LambdaNode & lambda);
245
247 AnnotateStore(const rvsdg::SimpleNode & storeNode, const rvsdg::LambdaNode & lambda);
248
250 AnnotateAlloca(const rvsdg::SimpleNode & allocaNode, const rvsdg::LambdaNode & lambda);
251
253 AnnotateMalloc(const rvsdg::SimpleNode & mallocNode, const rvsdg::LambdaNode & lambda);
254
256 AnnotateFree(const rvsdg::SimpleNode & freeNode, const rvsdg::LambdaNode & lambda);
257
259 AnnotateMemcpy(const rvsdg::SimpleNode & memcpyNode, const rvsdg::LambdaNode & lambda);
260
262 AnnotateMemset(const rvsdg::SimpleNode & memsetNode, const rvsdg::LambdaNode & lambda);
263
265 AnnotateMemmove(const rvsdg::SimpleNode & memmoveNode, const rvsdg::LambdaNode & lambda);
266
268 AnnotateCall(const rvsdg::SimpleNode & callNode, const rvsdg::LambdaNode & lambda);
269
274 void
276
282 bool
283 VerifyBlocklists() const;
284
290 void
292
298 void
300
311 void
312 materializeSetsInFunction(const rvsdg::LambdaNode & lambda);
313
317 static std::string
319
329 static std::string
330 ToRegionTree(const rvsdg::Graph & rvsdg, const RegionAwareModRefSummary & modRefSummary);
331
336
337 std::unique_ptr<Context> Context_;
338};
339
340}
341
342#endif // JLM_LLVM_OPT_ALIAS_ANALYSES_REGIONAWAREMODREFSUMMARIZER_HPP
static jlm::util::StatisticsCollector statisticsCollector
jlm::llvm::aa::PointsToGraph::NodeIndex NodeIndex
std::vector< rvsdg::Node * > nodes
ModRefSetIndex AnnotateStore(const rvsdg::SimpleNode &storeNode, const rvsdg::LambdaNode &lambda)
ModRefSetIndex AnnotateMalloc(const rvsdg::SimpleNode &mallocNode, const rvsdg::LambdaNode &lambda)
static util::HashSet< PointsToGraph::NodeIndex > CreateSimpleAllocaSet(const PointsToGraph &pointsToGraph)
ModRefSetIndex AnnotateLoad(const rvsdg::SimpleNode &loadNode, const rvsdg::LambdaNode &lambda)
void addPointerOriginTargets(ModRefSetIndex modRefSetIndex, const rvsdg::Output &origin, std::optional< size_t > minTargetSize, ModRefEffect modRefEffect)
ModRefSetIndex AnnotateMemcpy(const rvsdg::SimpleNode &memcpyNode, const rvsdg::LambdaNode &lambda)
static std::unique_ptr< ModRefSummary > Create(const rvsdg::RvsdgModule &rvsdgModule, const PointsToGraph &pointsToGraph, util::StatisticsCollector &statisticsCollector)
void materializeSetsInFunction(const rvsdg::LambdaNode &lambda)
void AddModRefSetBlocklist(ModRefSetIndex index, const util::HashSet< PointsToGraph::NodeIndex > &blocklist)
~RegionAwareModRefSummarizer() noexcept override
std::optional< ModRefSetIndex > AnnotateSimpleNode(const rvsdg::SimpleNode &simpleNode, const rvsdg::LambdaNode &lambda)
ModRefSetIndex AnnotateAlloca(const rvsdg::SimpleNode &allocaNode, const rvsdg::LambdaNode &lambda)
std::unique_ptr< RegionAwareModRefSummary > ModRefSummary_
void AddModRefSimpleConstraint(ModRefSetIndex from, ModRefSetIndex to)
bool IsRecursionPossible(const rvsdg::LambdaNode &lambda) const
static std::string CallGraphSCCsToString(const RegionAwareModRefSummarizer &summarizer)
std::unique_ptr< ModRefSummary > SummarizeModRefs(const rvsdg::RvsdgModule &rvsdgModule, const PointsToGraph &pointsToGraph, util::StatisticsCollector &statisticsCollector) override
void createCallGraph(const rvsdg::RvsdgModule &rvsdgModule)
util::HashSet< PointsToGraph::NodeIndex > getSimpleAllocasReachableFromRegionArguments(const rvsdg::Region &region)
static std::string ToRegionTree(const rvsdg::Graph &rvsdg, const RegionAwareModRefSummary &modRefSummary)
util::HashSet< PointsToGraph::NodeIndex > getReachableSimpleAllocas(std::queue< PointsToGraph::NodeIndex > &nodes)
ModRefSetIndex AnnotateMemset(const rvsdg::SimpleNode &memsetNode, const rvsdg::LambdaNode &lambda)
util::HashSet< PointsToGraph::NodeIndex > getSimpleAllocasReachableFromCallArguments(const rvsdg::SimpleNode &call)
ModRefSetIndex AnnotateMemmove(const rvsdg::SimpleNode &memmoveNode, const rvsdg::LambdaNode &lambda)
void AnnotateRegion(const rvsdg::Region &region, ModRefSetIndex modRefSet, const rvsdg::LambdaNode &lambda)
void AnnotateFunction(const rvsdg::LambdaNode &lambda)
ModRefSetIndex AnnotateFree(const rvsdg::SimpleNode &freeNode, const rvsdg::LambdaNode &lambda)
ModRefSetIndex AnnotateStructuralNode(const rvsdg::StructuralNode &structuralNode, const rvsdg::LambdaNode &lambda)
ModRefSetIndex AnnotateCall(const rvsdg::SimpleNode &callNode, const rvsdg::LambdaNode &lambda)
Mod/Ref summary of region-aware mod/ref summarizer.