blob: 2d3b43c6c6210e52ab857b96e9d68f53968463ce [file] [log] [blame]
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01001//==- CFLSteensAliasAnalysis.h - Unification-based Alias Analysis -*- C++-*-==//
2//
Andrew Walbran16937d02019-10-22 13:54:20 +01003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Andrew Scull5e1ddfa2018-08-14 10:06:54 +01006//
7//===----------------------------------------------------------------------===//
8/// \file
9/// This is the interface for LLVM's unification-based alias analysis
10/// implemented with CFL graph reachability.
11///
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_ANALYSIS_CFLSTEENSALIASANALYSIS_H
15#define LLVM_ANALYSIS_CFLSTEENSALIASANALYSIS_H
16
17#include "llvm/ADT/DenseMap.h"
18#include "llvm/ADT/Optional.h"
19#include "llvm/Analysis/AliasAnalysis.h"
20#include "llvm/Analysis/CFLAliasAnalysisUtils.h"
21#include "llvm/Analysis/MemoryLocation.h"
22#include "llvm/IR/PassManager.h"
23#include "llvm/Pass.h"
24#include "llvm/Support/Casting.h"
25#include <forward_list>
26#include <memory>
27
28namespace llvm {
29
30class Function;
31class TargetLibraryInfo;
32
33namespace cflaa {
34
35struct AliasSummary;
36
37} // end namespace cflaa
38
39class CFLSteensAAResult : public AAResultBase<CFLSteensAAResult> {
40 friend AAResultBase<CFLSteensAAResult>;
41
42 class FunctionInfo;
43
44public:
45 explicit CFLSteensAAResult(const TargetLibraryInfo &TLI);
46 CFLSteensAAResult(CFLSteensAAResult &&Arg);
47 ~CFLSteensAAResult();
48
49 /// Handle invalidation events from the new pass manager.
50 ///
51 /// By definition, this result is stateless and so remains valid.
52 bool invalidate(Function &, const PreservedAnalyses &,
53 FunctionAnalysisManager::Invalidator &) {
54 return false;
55 }
56
Andrew Scullcdfcccc2018-10-05 20:58:37 +010057 /// Inserts the given Function into the cache.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010058 void scan(Function *Fn);
59
60 void evict(Function *Fn);
61
Andrew Scullcdfcccc2018-10-05 20:58:37 +010062 /// Ensures that the given function is available in the cache.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010063 /// Returns the appropriate entry from the cache.
64 const Optional<FunctionInfo> &ensureCached(Function *Fn);
65
Andrew Scullcdfcccc2018-10-05 20:58:37 +010066 /// Get the alias summary for the given function
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010067 /// Return nullptr if the summary is not found or not available
68 const cflaa::AliasSummary *getAliasSummary(Function &Fn);
69
70 AliasResult query(const MemoryLocation &LocA, const MemoryLocation &LocB);
71
72 AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB) {
73 if (LocA.Ptr == LocB.Ptr)
74 return MustAlias;
75
76 // Comparisons between global variables and other constants should be
77 // handled by BasicAA.
78 // CFLSteensAA may report NoAlias when comparing a GlobalValue and
79 // ConstantExpr, but every query needs to have at least one Value tied to a
80 // Function, and neither GlobalValues nor ConstantExprs are.
81 if (isa<Constant>(LocA.Ptr) && isa<Constant>(LocB.Ptr))
82 return AAResultBase::alias(LocA, LocB);
83
84 AliasResult QueryResult = query(LocA, LocB);
85 if (QueryResult == MayAlias)
86 return AAResultBase::alias(LocA, LocB);
87
88 return QueryResult;
89 }
90
91private:
92 const TargetLibraryInfo &TLI;
93
Andrew Scullcdfcccc2018-10-05 20:58:37 +010094 /// Cached mapping of Functions to their StratifiedSets.
Andrew Scull5e1ddfa2018-08-14 10:06:54 +010095 /// If a function's sets are currently being built, it is marked
96 /// in the cache as an Optional without a value. This way, if we
97 /// have any kind of recursion, it is discernable from a function
98 /// that simply has empty sets.
99 DenseMap<Function *, Optional<FunctionInfo>> Cache;
100 std::forward_list<cflaa::FunctionHandle<CFLSteensAAResult>> Handles;
101
102 FunctionInfo buildSetsFrom(Function *F);
103};
104
105/// Analysis pass providing a never-invalidated alias analysis result.
106///
107/// FIXME: We really should refactor CFL to use the analysis more heavily, and
108/// in particular to leverage invalidation to trigger re-computation of sets.
109class CFLSteensAA : public AnalysisInfoMixin<CFLSteensAA> {
110 friend AnalysisInfoMixin<CFLSteensAA>;
111
112 static AnalysisKey Key;
113
114public:
115 using Result = CFLSteensAAResult;
116
117 CFLSteensAAResult run(Function &F, FunctionAnalysisManager &AM);
118};
119
120/// Legacy wrapper pass to provide the CFLSteensAAResult object.
121class CFLSteensAAWrapperPass : public ImmutablePass {
122 std::unique_ptr<CFLSteensAAResult> Result;
123
124public:
125 static char ID;
126
127 CFLSteensAAWrapperPass();
128
129 CFLSteensAAResult &getResult() { return *Result; }
130 const CFLSteensAAResult &getResult() const { return *Result; }
131
132 void initializePass() override;
133 void getAnalysisUsage(AnalysisUsage &AU) const override;
134};
135
136// createCFLSteensAAWrapperPass - This pass implements a set-based approach to
137// alias analysis.
138ImmutablePass *createCFLSteensAAWrapperPass();
139
140} // end namespace llvm
141
142#endif // LLVM_ANALYSIS_CFLSTEENSALIASANALYSIS_H