| //- CFLAndersAliasAnalysis.cpp - Unification-based Alias Analysis ---*- C++-*-// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file implements a CFL-based, summary-based alias analysis algorithm. It |
| // differs from CFLSteensAliasAnalysis in its inclusion-based nature while |
| // CFLSteensAliasAnalysis is unification-based. This pass has worse performance |
| // than CFLSteensAliasAnalysis (the worst case complexity of |
| // CFLAndersAliasAnalysis is cubic, while the worst case complexity of |
| // CFLSteensAliasAnalysis is almost linear), but it is able to yield more |
| // precise analysis result. The precision of this analysis is roughly the same |
| // as that of an one level context-sensitive Andersen's algorithm. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // N.B. AliasAnalysis as a whole is phrased as a FunctionPass at the moment, and |
| // CFLAndersAA is interprocedural. This is *technically* A Bad Thing, because |
| // FunctionPasses are only allowed to inspect the Function that they're being |
| // run on. Realistically, this likely isn't a problem until we allow |
| // FunctionPasses to run concurrently. |
| |
| #include "llvm/Analysis/CFLAndersAliasAnalysis.h" |
| #include "CFLGraph.h" |
| #include "llvm/Pass.h" |
| |
| using namespace llvm; |
| using namespace llvm::cflaa; |
| |
| #define DEBUG_TYPE "cfl-anders-aa" |
| |
| CFLAndersAAResult::CFLAndersAAResult() = default; |
| |
| char CFLAndersAA::PassID; |
| |
| CFLAndersAAResult CFLAndersAA::run(Function &F, AnalysisManager<Function> &AM) { |
| return CFLAndersAAResult(); |
| } |
| |
| char CFLAndersAAWrapperPass::ID = 0; |
| INITIALIZE_PASS(CFLAndersAAWrapperPass, "cfl-anders-aa", |
| "Inclusion-Based CFL Alias Analysis", false, true) |
| |
| ImmutablePass *llvm::createCFLAndersAAWrapperPass() { |
| return new CFLAndersAAWrapperPass(); |
| } |
| |
| CFLAndersAAWrapperPass::CFLAndersAAWrapperPass() : ImmutablePass(ID) { |
| initializeCFLAndersAAWrapperPassPass(*PassRegistry::getPassRegistry()); |
| } |
| |
| void CFLAndersAAWrapperPass::initializePass() {} |
| |
| void CFLAndersAAWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { |
| AU.setPreservesAll(); |
| } |