Jlm
Loading...
Searching...
No Matches
Andersen.hpp
Go to the documentation of this file.
1/*
2 * Copyright 2023, 2024 HÃ¥vard Krogstie <krogstie.havard@gmail.com>
3 * See COPYING for terms of redistribution.
4 */
5
6#ifndef JLM_LLVM_OPT_ALIAS_ANALYSES_ANDERSEN_HPP
7#define JLM_LLVM_OPT_ALIAS_ANALYSES_ANDERSEN_HPP
8
12#include <jlm/rvsdg/gamma.hpp>
13#include <jlm/rvsdg/theta.hpp>
14
15namespace jlm::llvm::aa
16{
17
24class Andersen final : public PointsToAnalysis
25{
26 class Statistics;
27
28public:
34 static inline const char * const ENV_TEST_ALL_CONFIGS = "JLM_ANDERSEN_TEST_ALL_CONFIGS";
35
41 static inline const char * const ENV_USE_EXACT_CONFIG = "JLM_ANDERSEN_USE_EXACT_CONFIG";
42
48 static inline const char * const ENV_DOUBLE_CHECK = "JLM_ANDERSEN_DOUBLE_CHECK";
49
53 static inline const char * const ENV_DUMP_SUBSET_GRAPH = "JLM_ANDERSEN_DUMP_SUBSET_GRAPH";
54
59 {
60 Configuration() = default;
61
62 public:
63 enum class Solver
64 {
65 Naive,
67 };
68
73 void
74 SetSolver(Solver solver) noexcept
75 {
76 Solver_ = solver;
77 }
78
79 [[nodiscard]] Solver
80 GetSolver() const noexcept
81 {
82 return Solver_;
83 }
84
89 void
94
96 GetWorklistSoliverPolicy() const noexcept
97 {
99 }
100
107 void
109 {
111 }
112
113 [[nodiscard]] bool
118
124 void
129
130 [[nodiscard]] bool
135
141 void
142 EnableOnlineCycleDetection(bool enable) noexcept
143 {
145 }
146
147 [[nodiscard]] bool
149 {
151 }
152
158 void
159 EnableHybridCycleDetection(bool enable) noexcept
160 {
162 }
163
164 [[nodiscard]] bool
166 {
168 }
169
175 void
176 EnableLazyCycleDetection(bool enable) noexcept
177 {
179 }
180
181 [[nodiscard]] bool
183 {
185 }
186
192 void
193 EnableDifferencePropagation(bool enable) noexcept
194 {
196 }
197
198 [[nodiscard]] bool
200 {
202 }
203
207 void
208 EnablePreferImplicitPointees(bool enable) noexcept
209 {
211 }
212
213 [[nodiscard]] bool
215 {
217 }
218
219 [[nodiscard]] std::string
220 ToString() const;
221
225 static Configuration
227 {
228 Configuration config;
230 // Constraints are normalized inside the Worklist's representation either way
235 config.EnableOnlineCycleDetection(false);
236 config.EnableHybridCycleDetection(true);
237 config.EnableLazyCycleDetection(true);
238 config.EnableDifferencePropagation(true);
239 config.EnablePreferImplicitPointees(true);
240 return config;
241 }
242
248 [[nodiscard]] static Configuration
250 {
251 Configuration config;
254 config.SetSolver(Solver::Naive);
255 return config;
256 }
257
262 [[nodiscard]] static std::vector<Configuration>
264
265 private:
266 // All techniques are turned off by default
277 };
278
280
281 ~Andersen() noexcept override;
282
283 Andersen(const Andersen &) = delete;
284
285 Andersen(Andersen &&) = delete;
286
287 Andersen &
288 operator=(const Andersen &) = delete;
289
290 Andersen &
291 operator=(Andersen &&) = delete;
292
297 void
299
303 [[nodiscard]] const Configuration &
304 GetConfiguration() const;
305
315 std::unique_ptr<PointsToGraph>
316 Analyze(const rvsdg::RvsdgModule & module, util::StatisticsCollector & statisticsCollector)
317 override;
318
323 std::unique_ptr<PointsToGraph>
324 Analyze(const LlvmRvsdgModule & module);
325
339 [[nodiscard]] static std::unique_ptr<PointsToGraph>
341
342 [[nodiscard]] static std::unique_ptr<PointsToGraph>
344
345private:
346 void
347 AnalyzeRegion(rvsdg::Region & region);
348
349 void
350 AnalyzeSimpleNode(const rvsdg::SimpleNode & node);
351
352 void
353 AnalyzeAlloca(const rvsdg::SimpleNode & node);
354
355 void
356 AnalyzeMalloc(const rvsdg::SimpleNode & node);
357
358 void
359 AnalyzeLoad(const rvsdg::SimpleNode & node);
360
361 void
362 AnalyzeStore(const rvsdg::SimpleNode & node);
363
364 void
365 AnalyzeCall(const rvsdg::SimpleNode & callNode);
366
367 void
368 AnalyzeGep(const rvsdg::SimpleNode & node);
369
370 void
371 AnalyzePtrMask(const rvsdg::SimpleNode & node);
372
373 void
374 AnalyzeBitcast(const rvsdg::SimpleNode & node);
375
376 void
377 AnalyzeBits2ptr(const rvsdg::SimpleNode & node);
378
379 void
380 AnalyzePtrToInt(const rvsdg::SimpleNode & node);
381
382 void
383 AnalyzeConstantPointerNull(const rvsdg::SimpleNode & node);
384
385 void
386 AnalyzeUndef(const rvsdg::SimpleNode & node);
387
388 void
389 AnalyzePoison(const rvsdg::SimpleNode & node);
390
391 void
392 AnalyzeFreeze(const rvsdg::SimpleNode & node);
393
394 void
395 AnalyzeMemcpy(const rvsdg::SimpleNode & node);
396
397 void
398 AnalyzeMemset(const rvsdg::SimpleNode & node);
399
400 void
401 AnalyzeMemmove(const rvsdg::SimpleNode & node);
402
403 void
404 AnalyzeConstantArray(const rvsdg::SimpleNode & node);
405
406 void
407 AnalyzeConstantStruct(const rvsdg::SimpleNode & node);
408
409 void
410 AnalyzeConstantAggregateZero(const rvsdg::SimpleNode & node);
411
412 void
413 AnalyzeInsertValue(const rvsdg::SimpleNode & node);
414
415 void
416 AnalyzeExtractValue(const rvsdg::SimpleNode & node);
417
418 void
419 AnalyzeValist(const rvsdg::SimpleNode & node);
420
421 void
422 AnalyzePointerToFunction(const rvsdg::SimpleNode & node);
423
424 void
425 AnalyzeFunctionToPointer(const rvsdg::SimpleNode & node);
426
427 void
428 AnalyzeIOBarrier(const rvsdg::SimpleNode & node);
429
430 void
431 AnalyzeStructuralNode(const rvsdg::StructuralNode & node);
432
433 void
434 AnalyzeLambda(const rvsdg::LambdaNode & node);
435
436 void
437 AnalyzeDelta(const rvsdg::DeltaNode & node);
438
439 void
440 AnalyzePhi(const rvsdg::PhiNode & node);
441
442 void
443 AnalyzeGamma(const rvsdg::GammaNode & node);
444
445 void
446 AnalyzeTheta(const rvsdg::ThetaNode & node);
447
448 void
449 AnalyzeRvsdg(const rvsdg::Graph & graph);
450
457 void
458 AnalyzeModule(const rvsdg::RvsdgModule & module, Statistics & statistics);
459
466 static void
468 PointerObjectConstraintSet & constraints,
469 const Configuration & config,
470 Statistics & statistics);
471
472 Configuration Config_ = Configuration::DefaultConfiguration();
473
474 std::unique_ptr<PointerObjectSet> Set_ = {};
475 std::unique_ptr<PointerObjectConstraintSet> Constraints_ = {};
476};
477
478}
479
480#endif
static jlm::util::StatisticsCollector statisticsCollector
void EnableOnlineCycleDetection(bool enable) noexcept
Definition Andersen.hpp:142
bool IsOfflineVariableSubstitutionEnabled() const noexcept
Definition Andersen.hpp:114
bool IsLazyCycleDetectionEnabled() const noexcept
Definition Andersen.hpp:182
PointerObjectConstraintSet::WorklistSolverPolicy GetWorklistSoliverPolicy() const noexcept
Definition Andersen.hpp:96
void EnableDifferencePropagation(bool enable) noexcept
Definition Andersen.hpp:193
bool IsHybridCycleDetectionEnabled() const noexcept
Definition Andersen.hpp:165
void EnableHybridCycleDetection(bool enable) noexcept
Definition Andersen.hpp:159
bool IsPreferImplicitPointeesEnabled() const noexcept
Definition Andersen.hpp:214
bool IsDifferencePropagationEnabled() const noexcept
Definition Andersen.hpp:199
static Configuration NaiveSolverConfiguration() noexcept
Definition Andersen.hpp:249
void EnableOfflineConstraintNormalization(bool enable) noexcept
Definition Andersen.hpp:125
PointerObjectConstraintSet::WorklistSolverPolicy WorklistSolverPolicy_
Definition Andersen.hpp:270
void SetSolver(Solver solver) noexcept
Definition Andersen.hpp:74
bool IsOnlineCycleDetectionEnabled() const noexcept
Definition Andersen.hpp:148
static std::vector< Configuration > GetAllConfigurations()
Definition Andersen.cpp:76
void EnablePreferImplicitPointees(bool enable) noexcept
Definition Andersen.hpp:208
static Configuration DefaultConfiguration()
Definition Andersen.hpp:226
void EnableOfflineVariableSubstitution(bool enable) noexcept
Definition Andersen.hpp:108
void SetWorklistSolverPolicy(PointerObjectConstraintSet::WorklistSolverPolicy policy) noexcept
Definition Andersen.hpp:90
bool IsOfflineConstraintNormalizationEnabled() const noexcept
Definition Andersen.hpp:131
void EnableLazyCycleDetection(bool enable) noexcept
Definition Andersen.hpp:176
Solver GetSolver() const noexcept
Definition Andersen.hpp:80
void AnalyzeIOBarrier(const rvsdg::SimpleNode &node)
const Configuration & GetConfiguration() const
void AnalyzeMemmove(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:993
static void SolveConstraints(PointerObjectConstraintSet &constraints, const Configuration &config, Statistics &statistics)
void AnalyzePoison(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:940
void AnalyzeConstantPointerNull(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:914
void SetConfiguration(Configuration config)
void AnalyzePtrMask(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:855
void AnalyzeValist(const rvsdg::SimpleNode &node)
void AnalyzePointerToFunction(const rvsdg::SimpleNode &node)
void AnalyzeStore(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:797
static const char *const ENV_USE_EXACT_CONFIG
Definition Andersen.hpp:41
Configuration Config_
Definition Andersen.hpp:472
std::unique_ptr< PointerObjectSet > Set_
Definition Andersen.hpp:474
void AnalyzeUndef(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:926
static std::unique_ptr< PointsToGraph > ConstructPointsToGraphFromPointerObjectSet(const PointerObjectSet &set, Statistics &statistics)
static const char *const ENV_DOUBLE_CHECK
Definition Andersen.hpp:48
void AnalyzeRegion(rvsdg::Region &region)
void AnalyzeGep(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:840
~Andersen() noexcept override
void AnalyzeRvsdg(const rvsdg::Graph &graph)
void AnalyzeAlloca(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:750
void AnalyzeModule(const rvsdg::RvsdgModule &module, Statistics &statistics)
void AnalyzePtrToInt(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:902
void AnalyzeMemset(const rvsdg::SimpleNode &node)
std::unique_ptr< PointsToGraph > Analyze(const rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
void AnalyzeExtractValue(const rvsdg::SimpleNode &node)
void AnalyzeConstantArray(const rvsdg::SimpleNode &node)
void AnalyzeInsertValue(const rvsdg::SimpleNode &node)
void AnalyzeConstantAggregateZero(const rvsdg::SimpleNode &node)
void AnalyzeBitcast(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:869
void AnalyzePhi(const rvsdg::PhiNode &node)
static const char *const ENV_DUMP_SUBSET_GRAPH
Definition Andersen.hpp:53
void AnalyzeMemcpy(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:971
void AnalyzeCall(const rvsdg::SimpleNode &callNode)
Definition Andersen.cpp:817
void AnalyzeConstantStruct(const rvsdg::SimpleNode &node)
std::unique_ptr< PointerObjectConstraintSet > Constraints_
Definition Andersen.hpp:475
void AnalyzeTheta(const rvsdg::ThetaNode &node)
void AnalyzeFreeze(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:954
void AnalyzeMalloc(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:763
void AnalyzeLambda(const rvsdg::LambdaNode &node)
void AnalyzeBits2ptr(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:888
void AnalyzeLoad(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:776
void AnalyzeSimpleNode(const rvsdg::SimpleNode &node)
Definition Andersen.cpp:625
void AnalyzeFunctionToPointer(const rvsdg::SimpleNode &node)
void AnalyzeGamma(const rvsdg::GammaNode &node)
void AnalyzeStructuralNode(const rvsdg::StructuralNode &node)
static const char *const ENV_TEST_ALL_CONFIGS
Definition Andersen.hpp:34
void AnalyzeDelta(const rvsdg::DeltaNode &node)
Points-to Analysis Interface.