Jlm
LocalAliasAnalysis.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2025 HÃ¥vard Krogstie <krogstie.havard@gmail.com>
3  * See COPYING for terms of redistribution.
4  */
5 
6 #ifndef JLM_LLVM_OPT_ALIAS_ANALYSES_LOCALALIASANALYSIS_HPP
7 #define JLM_LLVM_OPT_ALIAS_ANALYSES_LOCALALIASANALYSIS_HPP
8 
11 
12 #include <optional>
13 #include <unordered_map>
14 
15 namespace jlm::llvm::aa
16 {
25 class LocalAliasAnalysis final : public AliasAnalysis
26 {
27 
28 public:
30 
31  ~LocalAliasAnalysis() noexcept override;
32 
38  size_t
40 
46  void
47  setMaxTraceCollectionSize(size_t maxTraceCollectionSize);
48 
49  std::string
50  ToString() const override;
51 
53  Query(const rvsdg::Output & p1, size_t s1, const rvsdg::Output & p2, size_t s2) override;
54 
55 private:
56  struct TracedPointerOrigin;
57  struct TraceCollection;
58 
67  [[nodiscard]] static std::optional<int64_t>
68  CalculateGepOffset(const rvsdg::SimpleNode & gepNode);
69 
80  [[nodiscard]] static TracedPointerOrigin
81  TracePointerOriginPrecise(const rvsdg::Output & p);
82 
94  [[nodiscard]] static AliasQueryResponse
96  std::optional<int64_t> offset1,
97  size_t s1,
98  std::optional<int64_t> offset2,
99  size_t s2);
100 
112  [[nodiscard]] bool
114 
127  [[nodiscard]] static bool
128  IsOriginalOrigin(const rvsdg::Output & pointer);
129 
136  [[nodiscard]] static bool
138 
145  [[nodiscard]] static std::optional<size_t>
146  GetOriginalOriginSize(const rvsdg::Output & pointer);
147 
162  [[nodiscard]] static std::optional<size_t>
164 
182  static void
184 
194  [[nodiscard]] static size_t
196 
203  static void
205 
215  static void
216  RemoveTopOriginsWithinTheFirstNBytes(TraceCollection & traces, size_t s, size_t N);
217 
230  [[nodiscard]] static bool
231  DoTraceCollectionsOverlap(TraceCollection & tc1, size_t s1, TraceCollection & tc2, size_t s2);
232 
250  [[nodiscard]] bool
251  IsOriginalOriginFullyTraceable(const rvsdg::Output & pointer);
252 
258  [[nodiscard]] bool
260 
265  size_t maxTraceCollectionSize_ = 1000;
266 
271  std::unordered_map<const rvsdg::Output *, bool> IsFullyTraceable_;
272 };
273 
274 }
275 
276 #endif // JLM_LLVM_OPT_ALIAS_ANALYSES_LOCALALIASANALYSIS_HPP
static void RemoveTopOriginsWithinTheFirstNBytes(TraceCollection &traces, size_t s, size_t N)
static bool IsOriginalOrigin(const rvsdg::Output &pointer)
~LocalAliasAnalysis() noexcept override
bool HasOnlyFullyTraceableTopOrigins(TraceCollection &traces)
AliasQueryResponse Query(const rvsdg::Output &p1, size_t s1, const rvsdg::Output &p2, size_t s2) override
std::string ToString() const override
std::unordered_map< const rvsdg::Output *, bool > IsFullyTraceable_
static TracedPointerOrigin TracePointerOriginPrecise(const rvsdg::Output &p)
static bool DoTraceCollectionsOverlap(TraceCollection &tc1, size_t s1, TraceCollection &tc2, size_t s2)
static void RemoveTopOriginsSmallerThanSize(TraceCollection &traces, size_t s)
void setMaxTraceCollectionSize(size_t maxTraceCollectionSize)
static std::optional< int64_t > CalculateGepOffset(const rvsdg::SimpleNode &gepNode)
static bool HasOnlyOriginalTopOrigins(TraceCollection &traces)
static size_t GetMinimumOffsetFromStart(TraceCollection &traces)
bool IsOriginalOriginFullyTraceable(const rvsdg::Output &pointer)
static void RemoveTopOriginsWithRemainingSizeBelow(TraceCollection &traces, size_t s)
static AliasQueryResponse QueryOffsets(std::optional< int64_t > offset1, size_t s1, std::optional< int64_t > offset2, size_t s2)
bool TraceAllPointerOrigins(TracedPointerOrigin p, TraceCollection &traceCollection)
static std::optional< size_t > GetOriginalOriginSize(const rvsdg::Output &pointer)
static std::optional< size_t > GetRemainingSize(TracedPointerOrigin trace)