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