Jlm
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 
13 #include <jlm/rvsdg/gamma.hpp>
14 #include <jlm/rvsdg/theta.hpp>
15 
16 namespace jlm::llvm::aa
17 {
18 
25 class Andersen final : public PointsToAnalysis
26 {
27  class Statistics;
28 
29 public:
35  static inline const char * const ENV_TEST_ALL_CONFIGS = "JLM_ANDERSEN_TEST_ALL_CONFIGS";
36 
42  static inline const char * const ENV_USE_EXACT_CONFIG = "JLM_ANDERSEN_USE_EXACT_CONFIG";
43 
49  static inline const char * const ENV_DOUBLE_CHECK = "JLM_ANDERSEN_DOUBLE_CHECK";
50 
54  static inline const char * const ENV_DUMP_SUBSET_GRAPH = "JLM_ANDERSEN_DUMP_SUBSET_GRAPH";
55 
60  {
61  Configuration() = default;
62 
63  public:
64  enum class Solver
65  {
66  Naive,
67  Worklist
68  };
69 
74  void
75  SetSolver(Solver solver) noexcept
76  {
77  Solver_ = solver;
78  }
79 
80  [[nodiscard]] Solver
81  GetSolver() const noexcept
82  {
83  return Solver_;
84  }
85 
90  void
92  {
93  WorklistSolverPolicy_ = policy;
94  }
95 
97  GetWorklistSoliverPolicy() const noexcept
98  {
99  return WorklistSolverPolicy_;
100  }
101 
108  void
109  EnableOfflineVariableSubstitution(bool enable) noexcept
110  {
112  }
113 
114  [[nodiscard]] bool
116  {
118  }
119 
125  void
127  {
129  }
130 
131  [[nodiscard]] bool
133  {
135  }
136 
142  void
143  EnableOnlineCycleDetection(bool enable) noexcept
144  {
146  }
147 
148  [[nodiscard]] bool
150  {
152  }
153 
159  void
160  EnableHybridCycleDetection(bool enable) noexcept
161  {
163  }
164 
165  [[nodiscard]] bool
167  {
169  }
170 
176  void
177  EnableLazyCycleDetection(bool enable) noexcept
178  {
179  EnableLazyCycleDetection_ = enable;
180  }
181 
182  [[nodiscard]] bool
184  {
186  }
187 
193  void
194  EnableDifferencePropagation(bool enable) noexcept
195  {
197  }
198 
199  [[nodiscard]] bool
201  {
203  }
204 
208  void
209  EnablePreferImplicitPointees(bool enable) noexcept
210  {
212  }
213 
214  [[nodiscard]] bool
216  {
218  }
219 
220  [[nodiscard]] std::string
221  ToString() const;
222 
226  static Configuration
228  {
229  Configuration config;
231  // Constraints are normalized inside the Worklist's representation either way
233  config.SetSolver(Solver::Worklist);
236  config.EnableOnlineCycleDetection(false);
237  config.EnableHybridCycleDetection(true);
238  config.EnableLazyCycleDetection(true);
239  config.EnableDifferencePropagation(true);
240  config.EnablePreferImplicitPointees(true);
241  return config;
242  }
243 
249  [[nodiscard]] static Configuration
251  {
252  Configuration config;
253  config.EnableOfflineVariableSubstitution(false);
255  config.SetSolver(Solver::Naive);
256  return config;
257  }
258 
263  [[nodiscard]] static std::vector<Configuration>
265 
266  private:
267  // All techniques are turned off by default
278  };
279 
281 
282  ~Andersen() noexcept override;
283 
284  Andersen(const Andersen &) = delete;
285 
286  Andersen(Andersen &&) = delete;
287 
288  Andersen &
289  operator=(const Andersen &) = delete;
290 
291  Andersen &
292  operator=(Andersen &&) = delete;
293 
298  void
300 
304  [[nodiscard]] const Configuration &
305  GetConfiguration() const;
306 
316  std::unique_ptr<PointsToGraph>
317  Analyze(const rvsdg::RvsdgModule & module, util::StatisticsCollector & statisticsCollector)
318  override;
319 
324  std::unique_ptr<PointsToGraph>
325  Analyze(const LlvmRvsdgModule & module);
326 
340  [[nodiscard]] static std::unique_ptr<PointsToGraph>
342 
343  [[nodiscard]] static std::unique_ptr<PointsToGraph>
345 
346 private:
347  void
348  AnalyzeRegion(rvsdg::Region & region);
349 
350  void
351  AnalyzeSimpleNode(const rvsdg::SimpleNode & node);
352 
353  void
354  AnalyzeAlloca(const rvsdg::SimpleNode & node);
355 
356  void
357  AnalyzeMalloc(const rvsdg::SimpleNode & node);
358 
359  void
360  AnalyzeLoad(const rvsdg::SimpleNode & node);
361 
362  void
363  AnalyzeStore(const rvsdg::SimpleNode & node);
364 
365  void
366  AnalyzeCall(const rvsdg::SimpleNode & callNode);
367 
368  void
369  AnalyzeGep(const rvsdg::SimpleNode & node);
370 
371  void
372  AnalyzeBitcast(const rvsdg::SimpleNode & node);
373 
374  void
375  AnalyzeBits2ptr(const rvsdg::SimpleNode & node);
376 
377  void
378  AnalyzePtrToInt(const rvsdg::SimpleNode & node);
379 
380  void
381  AnalyzeConstantPointerNull(const rvsdg::SimpleNode & node);
382 
383  void
384  AnalyzeUndef(const rvsdg::SimpleNode & node);
385 
386  void
387  AnalyzeMemcpy(const rvsdg::SimpleNode & node);
388 
389  void
390  AnalyzeConstantArray(const rvsdg::SimpleNode & node);
391 
392  void
393  AnalyzeConstantStruct(const rvsdg::SimpleNode & node);
394 
395  void
396  AnalyzeConstantAggregateZero(const rvsdg::SimpleNode & node);
397 
398  void
399  AnalyzeExtractValue(const rvsdg::SimpleNode & node);
400 
401  void
402  AnalyzeValist(const rvsdg::SimpleNode & node);
403 
404  void
405  AnalyzePointerToFunction(const rvsdg::SimpleNode & node);
406 
407  void
408  AnalyzeFunctionToPointer(const rvsdg::SimpleNode & node);
409 
410  void
411  AnalyzeIOBarrier(const rvsdg::SimpleNode & node);
412 
413  void
414  AnalyzeStructuralNode(const rvsdg::StructuralNode & node);
415 
416  void
417  AnalyzeLambda(const rvsdg::LambdaNode & node);
418 
419  void
420  AnalyzeDelta(const rvsdg::DeltaNode & node);
421 
422  void
423  AnalyzePhi(const rvsdg::PhiNode & node);
424 
425  void
426  AnalyzeGamma(const rvsdg::GammaNode & node);
427 
428  void
429  AnalyzeTheta(const rvsdg::ThetaNode & node);
430 
431  void
432  AnalyzeRvsdg(const rvsdg::Graph & graph);
433 
440  void
441  AnalyzeModule(const rvsdg::RvsdgModule & module, Statistics & statistics);
442 
449  static void
451  PointerObjectConstraintSet & constraints,
452  const Configuration & config,
453  Statistics & statistics);
454 
455  Configuration Config_ = Configuration::DefaultConfiguration();
456 
457  std::unique_ptr<PointerObjectSet> Set_ = {};
458  std::unique_ptr<PointerObjectConstraintSet> Constraints_ = {};
459 };
460 
461 }
462 
463 #endif
void EnableOnlineCycleDetection(bool enable) noexcept
Definition: Andersen.hpp:143
bool IsOfflineVariableSubstitutionEnabled() const noexcept
Definition: Andersen.hpp:115
bool IsLazyCycleDetectionEnabled() const noexcept
Definition: Andersen.hpp:183
PointerObjectConstraintSet::WorklistSolverPolicy GetWorklistSoliverPolicy() const noexcept
Definition: Andersen.hpp:97
void EnableDifferencePropagation(bool enable) noexcept
Definition: Andersen.hpp:194
bool IsHybridCycleDetectionEnabled() const noexcept
Definition: Andersen.hpp:166
void EnableHybridCycleDetection(bool enable) noexcept
Definition: Andersen.hpp:160
bool IsPreferImplicitPointeesEnabled() const noexcept
Definition: Andersen.hpp:215
bool IsDifferencePropagationEnabled() const noexcept
Definition: Andersen.hpp:200
static Configuration NaiveSolverConfiguration() noexcept
Definition: Andersen.hpp:250
void EnableOfflineConstraintNormalization(bool enable) noexcept
Definition: Andersen.hpp:126
PointerObjectConstraintSet::WorklistSolverPolicy WorklistSolverPolicy_
Definition: Andersen.hpp:271
void SetSolver(Solver solver) noexcept
Definition: Andersen.hpp:75
bool IsOnlineCycleDetectionEnabled() const noexcept
Definition: Andersen.hpp:149
static std::vector< Configuration > GetAllConfigurations()
Definition: Andersen.cpp:68
void EnablePreferImplicitPointees(bool enable) noexcept
Definition: Andersen.hpp:209
static Configuration DefaultConfiguration()
Definition: Andersen.hpp:227
void EnableOfflineVariableSubstitution(bool enable) noexcept
Definition: Andersen.hpp:109
void SetWorklistSolverPolicy(PointerObjectConstraintSet::WorklistSolverPolicy policy) noexcept
Definition: Andersen.hpp:91
bool IsOfflineConstraintNormalizationEnabled() const noexcept
Definition: Andersen.hpp:132
void EnableLazyCycleDetection(bool enable) noexcept
Definition: Andersen.hpp:177
Solver GetSolver() const noexcept
Definition: Andersen.hpp:81
void AnalyzeIOBarrier(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:1041
const Configuration & GetConfiguration() const
Definition: Andersen.cpp:1363
static void SolveConstraints(PointerObjectConstraintSet &constraints, const Configuration &config, Statistics &statistics)
Definition: Andersen.cpp:1380
void AnalyzeConstantPointerNull(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:868
void SetConfiguration(Configuration config)
Definition: Andersen.cpp:1357
void AnalyzeValist(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:990
void AnalyzePointerToFunction(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:1011
void AnalyzeStore(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:765
static const char *const ENV_USE_EXACT_CONFIG
Definition: Andersen.hpp:42
Configuration Config_
Definition: Andersen.hpp:455
std::unique_ptr< PointerObjectSet > Set_
Definition: Andersen.hpp:457
void AnalyzeUndef(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:880
static std::unique_ptr< PointsToGraph > ConstructPointsToGraphFromPointerObjectSet(const PointerObjectSet &set, Statistics &statistics)
Definition: Andersen.cpp:1535
static const char *const ENV_DOUBLE_CHECK
Definition: Andersen.hpp:49
void AnalyzeRegion(rvsdg::Region &region)
Definition: Andersen.cpp:1281
void AnalyzeGep(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:808
~Andersen() noexcept override
void AnalyzeRvsdg(const rvsdg::Graph &graph)
Definition: Andersen.cpp:1315
void AnalyzeAlloca(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:718
void AnalyzeModule(const rvsdg::RvsdgModule &module, Statistics &statistics)
Definition: Andersen.cpp:1369
void AnalyzePtrToInt(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:856
std::unique_ptr< PointsToGraph > Analyze(const rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Definition: Andersen.cpp:1426
void AnalyzeExtractValue(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:975
void AnalyzeConstantArray(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:916
void AnalyzeConstantAggregateZero(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:961
void AnalyzeBitcast(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:823
void AnalyzePhi(const rvsdg::PhiNode &node)
Definition: Andersen.cpp:1155
static const char *const ENV_DUMP_SUBSET_GRAPH
Definition: Andersen.hpp:54
void AnalyzeMemcpy(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:894
void AnalyzeCall(const rvsdg::SimpleNode &callNode)
Definition: Andersen.cpp:785
void AnalyzeConstantStruct(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:938
std::unique_ptr< PointerObjectConstraintSet > Constraints_
Definition: Andersen.hpp:458
void AnalyzeTheta(const rvsdg::ThetaNode &node)
Definition: Andersen.cpp:1238
void AnalyzeMalloc(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:731
void AnalyzeLambda(const rvsdg::LambdaNode &node)
Definition: Andersen.cpp:1083
void AnalyzeBits2ptr(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:842
void AnalyzeLoad(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:744
void AnalyzeSimpleNode(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:617
void AnalyzeFunctionToPointer(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:1026
void AnalyzeGamma(const rvsdg::GammaNode &node)
Definition: Andersen.cpp:1201
void AnalyzeStructuralNode(const rvsdg::StructuralNode &node)
Definition: Andersen.cpp:1056
static const char *const ENV_TEST_ALL_CONFIGS
Definition: Andersen.hpp:35
void AnalyzeDelta(const rvsdg::DeltaNode &node)
Definition: Andersen.cpp:1116
Points-to Analysis Interface.