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"
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"
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
3235using namespace psr ;
3336
3437namespace psr {
3538
39+ struct LLVMBasedAliasAnalysis ::Impl {
40+ llvm::PassBuilder PB{};
41+ llvm::FunctionAnalysisManager FAM{};
42+ llvm::FunctionPassManager FPM{};
43+ };
44+
3645static 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
9099void 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
108118LLVMBasedAliasAnalysis::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+
138159void LLVMBasedAliasAnalysis::print (llvm::raw_ostream &OS) const {
139160 OS << " Points-to Info:\n " ;
140161 for (const auto &[Fn, AA] : AAInfos) {
0 commit comments