1218885Sdim//===- NoAliasAnalysis.cpp - Minimal Alias Analysis Impl ------------------===// 2218885Sdim// 3218885Sdim// The LLVM Compiler Infrastructure 4218885Sdim// 5218885Sdim// This file is distributed under the University of Illinois Open Source 6218885Sdim// License. See LICENSE.TXT for details. 7218885Sdim// 8218885Sdim//===----------------------------------------------------------------------===// 9218885Sdim// 10218885Sdim// This file defines the default implementation of the Alias Analysis interface 11218885Sdim// that simply returns "I don't know" for all queries. 12218885Sdim// 13218885Sdim//===----------------------------------------------------------------------===// 14218885Sdim 15249423Sdim#include "llvm/Analysis/Passes.h" 16218885Sdim#include "llvm/Analysis/AliasAnalysis.h" 17249423Sdim#include "llvm/IR/DataLayout.h" 18218885Sdim#include "llvm/Pass.h" 19218885Sdimusing namespace llvm; 20218885Sdim 21218885Sdimnamespace { 22218885Sdim /// NoAA - This class implements the -no-aa pass, which always returns "I 23218885Sdim /// don't know" for alias queries. NoAA is unlike other alias analysis 24218885Sdim /// implementations, in that it does not chain to a previous analysis. As 25218885Sdim /// such it doesn't follow many of the rules that other alias analyses must. 26218885Sdim /// 27218885Sdim struct NoAA : public ImmutablePass, public AliasAnalysis { 28218885Sdim static char ID; // Class identification, replacement for typeinfo 29218885Sdim NoAA() : ImmutablePass(ID) { 30218885Sdim initializeNoAAPass(*PassRegistry::getPassRegistry()); 31218885Sdim } 32218885Sdim 33218885Sdim virtual void getAnalysisUsage(AnalysisUsage &AU) const { 34218885Sdim } 35218885Sdim 36218885Sdim virtual void initializePass() { 37218885Sdim // Note: NoAA does not call InitializeAliasAnalysis because it's 38218885Sdim // special and does not support chaining. 39243830Sdim TD = getAnalysisIfAvailable<DataLayout>(); 40218885Sdim } 41218885Sdim 42218885Sdim virtual AliasResult alias(const Location &LocA, const Location &LocB) { 43218885Sdim return MayAlias; 44218885Sdim } 45218885Sdim 46218885Sdim virtual ModRefBehavior getModRefBehavior(ImmutableCallSite CS) { 47218885Sdim return UnknownModRefBehavior; 48218885Sdim } 49218885Sdim virtual ModRefBehavior getModRefBehavior(const Function *F) { 50218885Sdim return UnknownModRefBehavior; 51218885Sdim } 52218885Sdim 53218885Sdim virtual bool pointsToConstantMemory(const Location &Loc, 54218885Sdim bool OrLocal) { 55218885Sdim return false; 56218885Sdim } 57218885Sdim virtual ModRefResult getModRefInfo(ImmutableCallSite CS, 58218885Sdim const Location &Loc) { 59218885Sdim return ModRef; 60218885Sdim } 61218885Sdim virtual ModRefResult getModRefInfo(ImmutableCallSite CS1, 62218885Sdim ImmutableCallSite CS2) { 63218885Sdim return ModRef; 64218885Sdim } 65218885Sdim 66218885Sdim virtual void deleteValue(Value *V) {} 67218885Sdim virtual void copyValue(Value *From, Value *To) {} 68218885Sdim virtual void addEscapingUse(Use &U) {} 69218885Sdim 70218885Sdim /// getAdjustedAnalysisPointer - This method is used when a pass implements 71218885Sdim /// an analysis interface through multiple inheritance. If needed, it 72218885Sdim /// should override this to adjust the this pointer as needed for the 73218885Sdim /// specified pass info. 74218885Sdim virtual void *getAdjustedAnalysisPointer(const void *ID) { 75218885Sdim if (ID == &AliasAnalysis::ID) 76218885Sdim return (AliasAnalysis*)this; 77218885Sdim return this; 78218885Sdim } 79218885Sdim }; 80218885Sdim} // End of anonymous namespace 81218885Sdim 82218885Sdim// Register this pass... 83218885Sdimchar NoAA::ID = 0; 84218885SdimINITIALIZE_AG_PASS(NoAA, AliasAnalysis, "no-aa", 85218885Sdim "No Alias Analysis (always returns 'may' alias)", 86218885Sdim true, true, true) 87218885Sdim 88218885SdimImmutablePass *llvm::createNoAAPass() { return new NoAA(); } 89