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