Jlm
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 
12 
13 namespace jlm::llvm::aa
14 {
15 
16 class RegionAwareModRefSummary;
17 using ModRefSetIndex = uint32_t;
18 
59 {
60 public:
61  class Statistics;
62  struct Context;
63 
64  ~RegionAwareModRefSummarizer() noexcept override;
65 
67 
69 
71  operator=(const RegionAwareModRefSummarizer &) = delete;
72 
73  std::unique_ptr<ModRefSummary>
75  const rvsdg::RvsdgModule & rvsdgModule,
76  const PointsToGraph & pointsToGraph,
77  util::StatisticsCollector & statisticsCollector) override;
78 
88  static std::unique_ptr<ModRefSummary>
89  Create(
90  const rvsdg::RvsdgModule & rvsdgModule,
91  const PointsToGraph & pointsToGraph,
92  util::StatisticsCollector & statisticsCollector);
93 
102  static std::unique_ptr<ModRefSummary>
103  Create(const rvsdg::RvsdgModule & rvsdgModule, const PointsToGraph & pointsToGraph);
104 
105 private:
112  void
113  createCallGraph(const rvsdg::RvsdgModule & rvsdgModule);
114 
119  void
121 
127  static util::HashSet<PointsToGraph::NodeIndex>
128  CreateSimpleAllocaSet(const PointsToGraph & pointsToGraph);
129 
138  util::HashSet<PointsToGraph::NodeIndex>
139  GetSimpleAllocasReachableFromRegionArguments(const rvsdg::Region & region);
140 
148  bool
149  IsRecursionPossible(const rvsdg::LambdaNode & lambda) const;
150 
160  size_t
162 
167  void
169 
174  void
176 
187  void
189  ModRefSetIndex index,
190  const util::HashSet<PointsToGraph::NodeIndex> & blocklist);
191 
196  void
197  AnnotateFunction(const rvsdg::LambdaNode & lambda);
198 
205  AnnotateRegion(const rvsdg::Region & region, const rvsdg::LambdaNode & lambda);
206 
209  const rvsdg::StructuralNode & structuralNode,
210  const rvsdg::LambdaNode & lambda);
211 
212  std::optional<ModRefSetIndex>
213  AnnotateSimpleNode(const rvsdg::SimpleNode & simpleNode, const rvsdg::LambdaNode & lambda);
214 
222  void
224  ModRefSetIndex modRefSetIndex,
225  const rvsdg::Output & origin,
226  std::optional<size_t> minTargetSize,
227  const rvsdg::LambdaNode & lambda);
228 
230  AnnotateLoad(const rvsdg::SimpleNode & loadNode, const rvsdg::LambdaNode & lambda);
231 
233  AnnotateStore(const rvsdg::SimpleNode & storeNode, const rvsdg::LambdaNode & lambda);
234 
236  AnnotateAlloca(const rvsdg::SimpleNode & allocaNode);
237 
239  AnnotateMalloc(const rvsdg::SimpleNode & mallocNode);
240 
242  AnnotateFree(const rvsdg::SimpleNode & freeNode, const rvsdg::LambdaNode & lambda);
243 
245  AnnotateMemcpy(const rvsdg::SimpleNode & memcpyNode, const rvsdg::LambdaNode & lambda);
246 
248  AnnotateMemset(const rvsdg::SimpleNode & memsetNode, const rvsdg::LambdaNode & lambda);
249 
251  AnnotateCall(const rvsdg::SimpleNode & callNode, const rvsdg::LambdaNode & lambda);
252 
257  void
259 
265  bool
266  VerifyBlocklists() const;
267 
273  void
275 
279  void
280  compressExternalInFunction(const rvsdg::LambdaNode & lambda);
281 
287  void
288  findAllModRefSets(const rvsdg::Node & node, util::HashSet<ModRefSetIndex> & modRefSets);
289 
293  static std::string
295 
305  static std::string
306  ToRegionTree(const rvsdg::Graph & rvsdg, const RegionAwareModRefSummary & modRefSummary);
307 
312 
313  std::unique_ptr<Context> Context_;
314 };
315 
316 }
317 
318 #endif // JLM_LLVM_OPT_ALIAS_ANALYSES_REGIONAWAREMODREFSUMMARIZER_HPP
static jlm::util::StatisticsCollector statisticsCollector
ModRefSetIndex AnnotateStore(const rvsdg::SimpleNode &storeNode, const rvsdg::LambdaNode &lambda)
void findAllModRefSets(const rvsdg::Node &node, util::HashSet< ModRefSetIndex > &modRefSets)
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, const rvsdg::LambdaNode &lambda)
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 compressExternalInFunction(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)
std::unique_ptr< RegionAwareModRefSummary > ModRefSummary_
ModRefSetIndex AnnotateMalloc(const rvsdg::SimpleNode &mallocNode)
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)
static std::string ToRegionTree(const rvsdg::Graph &rvsdg, const RegionAwareModRefSummary &modRefSummary)
ModRefSetIndex AnnotateMemset(const rvsdg::SimpleNode &memsetNode, const rvsdg::LambdaNode &lambda)
ModRefSetIndex AnnotateRegion(const rvsdg::Region &region, const rvsdg::LambdaNode &lambda)
util::HashSet< PointsToGraph::NodeIndex > GetSimpleAllocasReachableFromRegionArguments(const rvsdg::Region &region)
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)
ModRefSetIndex AnnotateAlloca(const rvsdg::SimpleNode &allocaNode)
Mod/Ref summary of region-aware mod/ref summarizer.