1279377Simp//===- NoAliasAnalysis.cpp - Minimal Alias Analysis Impl ------------------===// 2279377Simp// 3279377Simp// The LLVM Compiler Infrastructure 4279377Simp// 5279377Simp// This file is distributed under the University of Illinois Open Source 6279377Simp// License. See LICENSE.TXT for details. 7279377Simp// 8279377Simp//===----------------------------------------------------------------------===// 9279377Simp// 10279377Simp// This file defines the default implementation of the Alias Analysis interface 11279377Simp// that simply returns "I don't know" for all queries. 12279377Simp// 13279377Simp//===----------------------------------------------------------------------===// 14279377Simp 15279377Simp#include "llvm/Analysis/Passes.h" 16279377Simp#include "llvm/Analysis/AliasAnalysis.h" 17279377Simp#include "llvm/IR/DataLayout.h" 18279377Simp#include "llvm/Pass.h" 19279377Simpusing namespace llvm; 20279377Simp 21279377Simpnamespace { 22279377Simp /// NoAA - This class implements the -no-aa pass, which always returns "I 23279377Simp /// don't know" for alias queries. NoAA is unlike other alias analysis 24279377Simp /// implementations, in that it does not chain to a previous analysis. As 25279377Simp /// such it doesn't follow many of the rules that other alias analyses must. 26279377Simp /// 27279377Simp struct NoAA : public ImmutablePass, public AliasAnalysis { 28279377Simp static char ID; // Class identification, replacement for typeinfo 29279377Simp NoAA() : ImmutablePass(ID) { 30279377Simp initializeNoAAPass(*PassRegistry::getPassRegistry()); 31279377Simp } 32279377Simp 33279377Simp virtual void getAnalysisUsage(AnalysisUsage &AU) const { 34279377Simp } 35279377Simp 36279377Simp virtual void initializePass() { 37279377Simp // Note: NoAA does not call InitializeAliasAnalysis because it's 38279377Simp // special and does not support chaining. 39279377Simp TD = getAnalysisIfAvailable<DataLayout>(); 40279377Simp } 41279377Simp 42279377Simp virtual AliasResult alias(const Location &LocA, const Location &LocB) { 43279377Simp return MayAlias; 44279377Simp } 45279377Simp 46279377Simp virtual ModRefBehavior getModRefBehavior(ImmutableCallSite CS) { 47279377Simp return UnknownModRefBehavior; 48279377Simp } 49279377Simp virtual ModRefBehavior getModRefBehavior(const Function *F) { 50279377Simp return UnknownModRefBehavior; 51279377Simp } 52279377Simp 53279377Simp virtual bool pointsToConstantMemory(const Location &Loc, 54279377Simp bool OrLocal) { 55279377Simp return false; 56279377Simp } 57279377Simp virtual ModRefResult getModRefInfo(ImmutableCallSite CS, 58279377Simp const Location &Loc) { 59279377Simp return ModRef; 60279377Simp } 61279377Simp virtual ModRefResult getModRefInfo(ImmutableCallSite CS1, 62279377Simp ImmutableCallSite CS2) { 63279377Simp return ModRef; 64279377Simp } 65279377Simp 66279377Simp virtual void deleteValue(Value *V) {} 67279377Simp virtual void copyValue(Value *From, Value *To) {} 68279377Simp virtual void addEscapingUse(Use &U) {} 69279377Simp 70279377Simp /// getAdjustedAnalysisPointer - This method is used when a pass implements 71279377Simp /// an analysis interface through multiple inheritance. If needed, it 72279377Simp /// should override this to adjust the this pointer as needed for the 73279377Simp /// specified pass info. 74279377Simp virtual void *getAdjustedAnalysisPointer(const void *ID) { 75279377Simp if (ID == &AliasAnalysis::ID) 76279377Simp return (AliasAnalysis*)this; 77279377Simp return this; 78279377Simp } 79279377Simp }; 80279377Simp} // End of anonymous namespace 81279377Simp 82279377Simp// Register this pass... 83279377Simpchar NoAA::ID = 0; 84279377SimpINITIALIZE_AG_PASS(NoAA, AliasAnalysis, "no-aa", 85279377Simp "No Alias Analysis (always returns 'may' alias)", 86279377Simp true, true, true) 87279377Simp 88279377SimpImmutablePass *llvm::createNoAAPass() { return new NoAA(); } 89279377Simp