Skip to content

Commit 263ef58

Browse files
authored
Small refactoring of LLVMBasedAliasAnalysis + allow disabling the CFL-based alias analyses (#626)
1 parent 2b4ec1c commit 263ef58

File tree

7 files changed

+77
-47
lines changed

7 files changed

+77
-47
lines changed

include/phasar/ControlFlow/CallGraphAnalysisType.def

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,6 @@ CALL_GRAPH_ANALYSIS_TYPE(CHA, "cha", "Class hierarchy analysis")
1616
CALL_GRAPH_ANALYSIS_TYPE(RTA, "rta", "Rapid type analysis")
1717
CALL_GRAPH_ANALYSIS_TYPE(DTA, "dta", "Declared type analysis")
1818
CALL_GRAPH_ANALYSIS_TYPE(VTA, "vta", "Variable type analysis")
19-
CALL_GRAPH_ANALYSIS_TYPE(OTF, "otf", "On-the-fly analysis based on points-to info")
19+
CALL_GRAPH_ANALYSIS_TYPE(OTF, "otf", "On-the-fly analysis based on points-to info (default)")
2020

2121
#undef CALL_GRAPH_ANALYSIS_TYPE

include/phasar/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.h

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@
1313
#include "phasar/Pointer/AliasAnalysisType.h"
1414

1515
#include "llvm/Analysis/AliasAnalysis.h"
16-
#include "llvm/IR/PassManager.h"
17-
#include "llvm/Passes/PassBuilder.h"
1816

1917
namespace llvm {
2018
class Value;
@@ -27,23 +25,19 @@ namespace psr {
2725
class LLVMProjectIRDB;
2826

2927
class LLVMBasedAliasAnalysis {
30-
private:
31-
llvm::PassBuilder PB;
32-
llvm::AAManager AA;
33-
llvm::FunctionAnalysisManager FAM;
34-
llvm::FunctionPassManager FPM;
35-
llvm::DenseMap<const llvm::Function *, llvm::AAResults *> AAInfos;
36-
AliasAnalysisType PATy;
37-
38-
[[nodiscard]] bool hasAliasInfo(const llvm::Function &Fun) const;
39-
40-
void computeAliasInfo(llvm::Function &Fun);
4128

4229
public:
43-
LLVMBasedAliasAnalysis(LLVMProjectIRDB &IRDB, bool UseLazyEvaluation = true,
44-
AliasAnalysisType PATy = AliasAnalysisType::CFLAnders);
30+
explicit LLVMBasedAliasAnalysis(
31+
LLVMProjectIRDB &IRDB, bool UseLazyEvaluation,
32+
AliasAnalysisType PATy = AliasAnalysisType::Basic);
4533

46-
~LLVMBasedAliasAnalysis() = default;
34+
LLVMBasedAliasAnalysis(LLVMBasedAliasAnalysis &&) noexcept = default;
35+
LLVMBasedAliasAnalysis &
36+
operator=(LLVMBasedAliasAnalysis &&) noexcept = default;
37+
38+
LLVMBasedAliasAnalysis(const LLVMBasedAliasAnalysis &) = delete;
39+
LLVMBasedAliasAnalysis &operator=(const LLVMBasedAliasAnalysis &) = delete;
40+
~LLVMBasedAliasAnalysis();
4741

4842
void print(llvm::raw_ostream &OS = llvm::outs()) const;
4943

@@ -54,13 +48,26 @@ class LLVMBasedAliasAnalysis {
5448
return AAInfos.lookup(F);
5549
};
5650

57-
void erase(llvm::Function *F);
51+
void erase(llvm::Function *F) noexcept;
5852

59-
void clear();
53+
void clear() noexcept;
6054

61-
[[nodiscard]] inline AliasAnalysisType getPointerAnalysisType() const {
55+
[[nodiscard]] inline AliasAnalysisType
56+
getPointerAnalysisType() const noexcept {
6257
return PATy;
6358
};
59+
60+
private:
61+
[[nodiscard]] bool hasAliasInfo(const llvm::Function &Fun) const;
62+
63+
void computeAliasInfo(llvm::Function &Fun);
64+
65+
// -- data members
66+
67+
struct Impl;
68+
std::unique_ptr<Impl> PImpl;
69+
AliasAnalysisType PATy;
70+
llvm::DenseMap<const llvm::Function *, llvm::AAResults *> AAInfos;
6471
};
6572

6673
} // namespace psr

include/phasar/PhasarLLVM/Utils/BasicBlockOrdering.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
#include "llvm/ADT/DenseMap.h"
1414
#include "llvm/ADT/FunctionExtras.h"
15+
#include "llvm/IR/Dominators.h"
1516

1617
#include <memory>
1718
#include <type_traits>

include/phasar/Pointer/AliasAnalysisType.def

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@
1111
#define ALIAS_ANALYSIS_TYPE(NAME, CMDFLAG, DESC)
1212
#endif
1313

14+
ALIAS_ANALYSIS_TYPE(Basic, "basic", "Basic LLVM alias resolving based on simple, local properties")
1415
ALIAS_ANALYSIS_TYPE(CFLSteens, "cflsteens", "Steensgaard-style alias analysis (equality-based)")
15-
ALIAS_ANALYSIS_TYPE(CFLAnders, "cflanders", "Andersen-style alias analysis (subset-based)")
16+
ALIAS_ANALYSIS_TYPE(CFLAnders, "cflanders", "Andersen-style alias analysis (subset-based) (default)")
1617
ALIAS_ANALYSIS_TYPE(PointsTo, "points-to", "Alias-information based on (external) points-to information")
1718

1819
#undef ALIAS_ANALYSIS_TYPE

lib/PhasarLLVM/Pointer/LLVMAliasSet.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "phasar/PhasarLLVM/Pointer/LLVMAliasInfo.h"
1414
#include "phasar/PhasarLLVM/Pointer/LLVMPointsToUtils.h"
1515
#include "phasar/PhasarLLVM/Utils/LLVMShorthands.h"
16+
#include "phasar/Pointer/AliasAnalysisType.h"
1617
#include "phasar/Utils/BoxedPointer.h"
1718
#include "phasar/Utils/Logger.h"
1819
#include "phasar/Utils/NlohmannLogging.h"
@@ -96,7 +97,7 @@ LLVMAliasSet::LLVMAliasSet(LLVMProjectIRDB *IRDB, bool UseLazyEvaluation,
9697

9798
LLVMAliasSet::LLVMAliasSet(LLVMProjectIRDB *IRDB,
9899
const nlohmann::json &SerializedPTS)
99-
: PTA(*IRDB) {
100+
: PTA(*IRDB, true) {
100101
assert(IRDB != nullptr);
101102
// Assume, we already have validated the json schema
102103

lib/PhasarLLVM/Pointer/LLVMBasedAliasAnalysis.cpp

Lines changed: 45 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
#include "phasar/PhasarLLVM/DB/LLVMProjectIRDB.h"
1313
#include "phasar/PhasarLLVM/Pointer/LLVMPointsToUtils.h"
14+
#include "phasar/Pointer/AliasAnalysisType.h"
1415

1516
#include "llvm/ADT/SetVector.h"
1617
#include "llvm/ADT/SmallVector.h"
@@ -19,6 +20,7 @@
1920
#include "llvm/Analysis/BasicAliasAnalysis.h"
2021
#include "llvm/Analysis/CFLAndersAliasAnalysis.h"
2122
#include "llvm/Analysis/CFLSteensAliasAnalysis.h"
23+
#include "llvm/Analysis/ScopedNoAliasAA.h"
2224
#include "llvm/Analysis/TypeBasedAliasAnalysis.h"
2325
#include "llvm/IR/Argument.h"
2426
#include "llvm/IR/BasicBlock.h"
@@ -28,11 +30,18 @@
2830
#include "llvm/IR/PassManager.h"
2931
#include "llvm/IR/Value.h"
3032
#include "llvm/IR/Verifier.h"
33+
#include "llvm/Passes/PassBuilder.h"
3134

3235
using namespace psr;
3336

3437
namespace psr {
3538

39+
struct LLVMBasedAliasAnalysis::Impl {
40+
llvm::PassBuilder PB{};
41+
llvm::FunctionAnalysisManager FAM{};
42+
llvm::FunctionPassManager FPM{};
43+
};
44+
3645
static void printResults(llvm::AliasResult AR, bool P, const llvm::Value *V1,
3746
const llvm::Value *V2, const llvm::Module *M) {
3847
if (P) {
@@ -88,44 +97,54 @@ bool LLVMBasedAliasAnalysis::hasAliasInfo(const llvm::Function &Fun) const {
8897
}
8998

9099
void LLVMBasedAliasAnalysis::computeAliasInfo(llvm::Function &Fun) {
91-
llvm::PreservedAnalyses PA = FPM.run(Fun, FAM);
92-
llvm::AAResults &AAR = FAM.getResult<llvm::AAManager>(Fun);
100+
assert(PImpl != nullptr);
101+
llvm::PreservedAnalyses PA = PImpl->FPM.run(Fun, PImpl->FAM);
102+
llvm::AAResults &AAR = PImpl->FAM.getResult<llvm::AAManager>(Fun);
93103
AAInfos.insert(std::make_pair(&Fun, &AAR));
94104
}
95105

96-
void LLVMBasedAliasAnalysis::erase(llvm::Function *F) {
106+
void LLVMBasedAliasAnalysis::erase(llvm::Function *F) noexcept {
97107
// after we clear all stuff, we need to set it up for the next function-wise
98108
// analysis
99109
AAInfos.erase(F);
100-
FAM.clear(*F, F->getName());
110+
PImpl->FAM.clear(*F, F->getName());
101111
}
102112

103-
void LLVMBasedAliasAnalysis::clear() {
113+
void LLVMBasedAliasAnalysis::clear() noexcept {
104114
AAInfos.clear();
105-
FAM.clear();
115+
PImpl->FAM.clear();
106116
}
107117

108118
LLVMBasedAliasAnalysis::LLVMBasedAliasAnalysis(LLVMProjectIRDB &IRDB,
109119
bool UseLazyEvaluation,
110120
AliasAnalysisType PATy)
111-
: PATy(PATy) {
112-
AA.registerFunctionAnalysis<llvm::BasicAA>();
113-
switch (PATy) {
114-
case AliasAnalysisType::CFLAnders:
115-
AA.registerFunctionAnalysis<llvm::CFLAndersAA>();
116-
break;
117-
case AliasAnalysisType::CFLSteens:
118-
AA.registerFunctionAnalysis<llvm::CFLSteensAA>();
119-
break;
120-
default:
121-
break;
122-
}
123-
AA.registerFunctionAnalysis<llvm::TypeBasedAA>();
124-
FAM.registerPass([&] { return std::move(AA); });
125-
PB.registerFunctionAnalyses(FAM);
126-
llvm::FunctionPassManager FPM;
127-
// Always verify the input.
128-
FPM.addPass(llvm::VerifierPass());
121+
: PImpl(new Impl{}), PATy(PATy) {
122+
123+
PImpl->FAM.registerPass([&] {
124+
llvm::AAManager AA;
125+
switch (PATy) {
126+
case AliasAnalysisType::CFLAnders:
127+
AA.registerFunctionAnalysis<llvm::CFLAndersAA>();
128+
break;
129+
case AliasAnalysisType::CFLSteens:
130+
AA.registerFunctionAnalysis<llvm::CFLSteensAA>();
131+
break;
132+
case AliasAnalysisType::Basic:
133+
[[fallthrough]];
134+
default:
135+
break;
136+
}
137+
// Note: The order of the alias analyses is important. See LLVM's source
138+
// code for reference (e.g. registerAAAnalyses() in
139+
// llvm/CodeGen/CodeGenPassBuilder.h)
140+
//
141+
AA.registerFunctionAnalysis<llvm::TypeBasedAA>();
142+
AA.registerFunctionAnalysis<llvm::ScopedNoAliasAA>();
143+
AA.registerFunctionAnalysis<llvm::BasicAA>();
144+
return AA;
145+
});
146+
PImpl->PB.registerFunctionAnalyses(PImpl->FAM);
147+
129148
if (!UseLazyEvaluation) {
130149
for (auto &F : *IRDB.getModule()) {
131150
if (!F.isDeclaration()) {
@@ -135,6 +154,8 @@ LLVMBasedAliasAnalysis::LLVMBasedAliasAnalysis(LLVMProjectIRDB &IRDB,
135154
}
136155
}
137156

157+
LLVMBasedAliasAnalysis::~LLVMBasedAliasAnalysis() = default;
158+
138159
void LLVMBasedAliasAnalysis::print(llvm::raw_ostream &OS) const {
139160
OS << "Points-to Info:\n";
140161
for (const auto &[Fn, AA] : AAInfos) {

lib/PhasarLLVM/Utils/BasicBlockOrdering.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22

33
#include "llvm/ADT/SmallVector.h"
44
#include "llvm/IR/BasicBlock.h"
5-
#include "llvm/IR/Dominators.h"
65
#include "llvm/IR/Function.h"
76
#include "llvm/IR/Instruction.h"
87

0 commit comments

Comments
 (0)