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  // When doing origin tracing, give up if the trace set grows larger than this
28  static constexpr size_t MaxTraceCollectionSize = 1000;
29 
30 public:
32  ~LocalAliasAnalysis() noexcept override;
33 
34  std::string
35  ToString() const override;
36 
38  Query(const rvsdg::Output & p1, size_t s1, const rvsdg::Output & p2, size_t s2) override;
39 
40 private:
41  struct TracedPointerOrigin;
42  struct TraceCollection;
43 
52  [[nodiscard]] static std::optional<int64_t>
53  CalculateGepOffset(const rvsdg::SimpleNode & gepNode);
54 
65  [[nodiscard]] static TracedPointerOrigin
66  TracePointerOriginPrecise(const rvsdg::Output & p);
67 
79  [[nodiscard]] static AliasQueryResponse
81  std::optional<int64_t> offset1,
82  size_t s1,
83  std::optional<int64_t> offset2,
84  size_t s2);
85 
97  [[nodiscard]] static bool
99 
112  [[nodiscard]] static bool
113  IsOriginalOrigin(const rvsdg::Output & pointer);
114 
121  [[nodiscard]] static bool
123 
130  [[nodiscard]] static std::optional<size_t>
131  GetOriginalOriginSize(const rvsdg::Output & pointer);
132 
147  [[nodiscard]] static std::optional<size_t>
149 
167  static void
169 
179  [[nodiscard]] static size_t
181 
188  static void
190 
200  static void
201  RemoveTopOriginsWithinTheFirstNBytes(TraceCollection & traces, size_t s, size_t N);
202 
215  [[nodiscard]] static bool
216  DoTraceCollectionsOverlap(TraceCollection & tc1, size_t s1, TraceCollection & tc2, size_t s2);
217 
235  [[nodiscard]] bool
236  IsOriginalOriginFullyTraceable(const rvsdg::Output & pointer);
237 
243  [[nodiscard]] bool
245 
250  std::unordered_map<const rvsdg::Output *, bool> IsFullyTraceable_;
251 };
252 
253 }
254 
255 #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)
static std::optional< int64_t > CalculateGepOffset(const rvsdg::SimpleNode &gepNode)
static bool HasOnlyOriginalTopOrigins(TraceCollection &traces)
static size_t GetMinimumOffsetFromStart(TraceCollection &traces)
static constexpr size_t MaxTraceCollectionSize
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)
static bool TraceAllPointerOrigins(TracedPointerOrigin p, TraceCollection &traceCollection)
static std::optional< size_t > GetOriginalOriginSize(const rvsdg::Output &pointer)
static std::optional< size_t > GetRemainingSize(TracedPointerOrigin trace)