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 
12 #include <jlm/rvsdg/gamma.hpp>
13 #include <jlm/rvsdg/theta.hpp>
14 
15 namespace jlm::llvm::aa
16 {
17 
24 class Andersen final : public PointsToAnalysis
25 {
26  class Statistics;
27 
28 public:
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,
66  Worklist
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
91  {
92  WorklistSolverPolicy_ = policy;
93  }
94 
96  GetWorklistSoliverPolicy() const noexcept
97  {
98  return WorklistSolverPolicy_;
99  }
100 
107  void
108  EnableOfflineVariableSubstitution(bool enable) noexcept
109  {
111  }
112 
113  [[nodiscard]] bool
115  {
117  }
118 
124  void
126  {
128  }
129 
130  [[nodiscard]] bool
132  {
134  }
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  {
178  EnableLazyCycleDetection_ = enable;
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
232  config.SetSolver(Solver::Worklist);
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;
252  config.EnableOfflineVariableSubstitution(false);
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 
345 private:
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  AnalyzeBitcast(const rvsdg::SimpleNode & node);
372 
373  void
374  AnalyzeBits2ptr(const rvsdg::SimpleNode & node);
375 
376  void
377  AnalyzePtrToInt(const rvsdg::SimpleNode & node);
378 
379  void
380  AnalyzeConstantPointerNull(const rvsdg::SimpleNode & node);
381 
382  void
383  AnalyzeUndef(const rvsdg::SimpleNode & node);
384 
385  void
386  AnalyzePoison(const rvsdg::SimpleNode & node);
387 
388  void
389  AnalyzeFreeze(const rvsdg::SimpleNode & node);
390 
391  void
392  AnalyzeMemcpy(const rvsdg::SimpleNode & node);
393 
394  void
395  AnalyzeMemset(const rvsdg::SimpleNode & node);
396 
397  void
398  AnalyzeConstantArray(const rvsdg::SimpleNode & node);
399 
400  void
401  AnalyzeConstantStruct(const rvsdg::SimpleNode & node);
402 
403  void
404  AnalyzeConstantAggregateZero(const rvsdg::SimpleNode & node);
405 
406  void
407  AnalyzeInsertValue(const rvsdg::SimpleNode & node);
408 
409  void
410  AnalyzeExtractValue(const rvsdg::SimpleNode & node);
411 
412  void
413  AnalyzeValist(const rvsdg::SimpleNode & node);
414 
415  void
416  AnalyzePointerToFunction(const rvsdg::SimpleNode & node);
417 
418  void
419  AnalyzeFunctionToPointer(const rvsdg::SimpleNode & node);
420 
421  void
422  AnalyzeIOBarrier(const rvsdg::SimpleNode & node);
423 
424  void
425  AnalyzeStructuralNode(const rvsdg::StructuralNode & node);
426 
427  void
428  AnalyzeLambda(const rvsdg::LambdaNode & node);
429 
430  void
431  AnalyzeDelta(const rvsdg::DeltaNode & node);
432 
433  void
434  AnalyzePhi(const rvsdg::PhiNode & node);
435 
436  void
437  AnalyzeGamma(const rvsdg::GammaNode & node);
438 
439  void
440  AnalyzeTheta(const rvsdg::ThetaNode & node);
441 
442  void
443  AnalyzeRvsdg(const rvsdg::Graph & graph);
444 
451  void
452  AnalyzeModule(const rvsdg::RvsdgModule & module, Statistics & statistics);
453 
460  static void
462  PointerObjectConstraintSet & constraints,
463  const Configuration & config,
464  Statistics & statistics);
465 
466  Configuration Config_ = Configuration::DefaultConfiguration();
467 
468  std::unique_ptr<PointerObjectSet> Set_ = {};
469  std::unique_ptr<PointerObjectConstraintSet> Constraints_ = {};
470 };
471 
472 }
473 
474 #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)
Definition: Andersen.cpp:1146
const Configuration & GetConfiguration() const
Definition: Andersen.cpp:1468
static void SolveConstraints(PointerObjectConstraintSet &constraints, const Configuration &config, Statistics &statistics)
Definition: Andersen.cpp:1485
void AnalyzePoison(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:918
void AnalyzeConstantPointerNull(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:892
void SetConfiguration(Configuration config)
Definition: Andersen.cpp:1462
void AnalyzeValist(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:1095
void AnalyzePointerToFunction(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:1116
void AnalyzeStore(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:789
static const char *const ENV_USE_EXACT_CONFIG
Definition: Andersen.hpp:41
Configuration Config_
Definition: Andersen.hpp:466
std::unique_ptr< PointerObjectSet > Set_
Definition: Andersen.hpp:468
void AnalyzeUndef(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:904
static std::unique_ptr< PointsToGraph > ConstructPointsToGraphFromPointerObjectSet(const PointerObjectSet &set, Statistics &statistics)
Definition: Andersen.cpp:1640
static const char *const ENV_DOUBLE_CHECK
Definition: Andersen.hpp:48
void AnalyzeRegion(rvsdg::Region &region)
Definition: Andersen.cpp:1386
void AnalyzeGep(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:832
~Andersen() noexcept override
void AnalyzeRvsdg(const rvsdg::Graph &graph)
Definition: Andersen.cpp:1420
void AnalyzeAlloca(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:742
void AnalyzeModule(const rvsdg::RvsdgModule &module, Statistics &statistics)
Definition: Andersen.cpp:1474
void AnalyzePtrToInt(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:880
void AnalyzeMemset(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:971
std::unique_ptr< PointsToGraph > Analyze(const rvsdg::RvsdgModule &module, util::StatisticsCollector &statisticsCollector) override
Definition: Andersen.cpp:1531
void AnalyzeExtractValue(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:1080
void AnalyzeConstantArray(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:984
void AnalyzeInsertValue(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:1043
void AnalyzeConstantAggregateZero(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:1029
void AnalyzeBitcast(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:847
void AnalyzePhi(const rvsdg::PhiNode &node)
Definition: Andersen.cpp:1260
static const char *const ENV_DUMP_SUBSET_GRAPH
Definition: Andersen.hpp:53
void AnalyzeMemcpy(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:949
void AnalyzeCall(const rvsdg::SimpleNode &callNode)
Definition: Andersen.cpp:809
void AnalyzeConstantStruct(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:1006
std::unique_ptr< PointerObjectConstraintSet > Constraints_
Definition: Andersen.hpp:469
void AnalyzeTheta(const rvsdg::ThetaNode &node)
Definition: Andersen.cpp:1343
void AnalyzeFreeze(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:932
void AnalyzeMalloc(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:755
void AnalyzeLambda(const rvsdg::LambdaNode &node)
Definition: Andersen.cpp:1188
void AnalyzeBits2ptr(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:866
void AnalyzeLoad(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:768
void AnalyzeSimpleNode(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:625
void AnalyzeFunctionToPointer(const rvsdg::SimpleNode &node)
Definition: Andersen.cpp:1131
void AnalyzeGamma(const rvsdg::GammaNode &node)
Definition: Andersen.cpp:1306
void AnalyzeStructuralNode(const rvsdg::StructuralNode &node)
Definition: Andersen.cpp:1161
static const char *const ENV_TEST_ALL_CONFIGS
Definition: Andersen.hpp:34
void AnalyzeDelta(const rvsdg::DeltaNode &node)
Definition: Andersen.cpp:1221
Points-to Analysis Interface.