diff options
author | Chris Lattner <sabre@nondot.org> | 2004-05-23 21:15:12 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-05-23 21:15:12 +0000 |
commit | 59c8ed8843b87ef9ee893bf6f857474b6ca86465 (patch) | |
tree | ba9c810d597470f0f2b4fe3c19e3fc462acb5ba2 /llvm/lib/Analysis/BasicAliasAnalysis.cpp | |
parent | e345f6b5ab96717b5e253e166e674a4a2ae0ffea (diff) | |
download | bcm5719-llvm-59c8ed8843b87ef9ee893bf6f857474b6ca86465.tar.gz bcm5719-llvm-59c8ed8843b87ef9ee893bf6f857474b6ca86465.zip |
Move the -no-aa AA implementation into this file since both of these
alias analysis implementations are special: they do not autoforward to a
chained implementation of alias analysis
llvm-svn: 13683
Diffstat (limited to 'llvm/lib/Analysis/BasicAliasAnalysis.cpp')
-rw-r--r-- | llvm/lib/Analysis/BasicAliasAnalysis.cpp | 54 |
1 files changed, 46 insertions, 8 deletions
diff --git a/llvm/lib/Analysis/BasicAliasAnalysis.cpp b/llvm/lib/Analysis/BasicAliasAnalysis.cpp index 8fc561ea1d9..5ccaa5c66c6 100644 --- a/llvm/lib/Analysis/BasicAliasAnalysis.cpp +++ b/llvm/lib/Analysis/BasicAliasAnalysis.cpp @@ -36,13 +36,55 @@ using namespace llvm; void llvm::BasicAAStub() {} namespace { - struct BasicAliasAnalysis : public ImmutablePass, public AliasAnalysis { - + /// NoAA - This class implements the -no-aa pass, which always returns "I + /// don't know" for alias queries. NoAA is unlike other alias analysis + /// implementations, in that it does not chain to a previous analysis. As + /// such it doesn't follow many of the rules that other alias analyses must. + /// + struct NoAA : public ImmutablePass, public AliasAnalysis { + virtual AliasResult alias(const Value *V1, unsigned V1Size, + const Value *V2, unsigned V2Size) { + return MayAlias; + } + + virtual void getMustAliases(Value *P, std::vector<Value*> &RetVals) { } + virtual bool pointsToConstantMemory(const Value *P) { return false; } + virtual bool doesNotAccessMemory(Function *F) { return false; } + virtual bool onlyReadsMemory(Function *F) { return false; } + virtual ModRefResult getModRefInfo(CallSite CS, Value *P, unsigned Size) { + return ModRef; + } + virtual ModRefResult getModRefInfo(CallSite CS1, CallSite CS2) { + return ModRef; + } + virtual bool hasNoModRefInfoForCalls() const { return true; } + + virtual void deleteValue(Value *V) {} + virtual void copyValue(Value *From, Value *To) {} + virtual void getAnalysisUsage(AnalysisUsage &AU) const {} + }; + + // Register this pass... + RegisterOpt<NoAA> + U("no-aa", "No Alias Analysis (always returns 'may' alias)"); + + // Declare that we implement the AliasAnalysis interface + RegisterAnalysisGroup<AliasAnalysis, NoAA> V; +} // End of anonymous namespace + + +namespace { + /// BasicAliasAnalysis - This is the default alias analysis implementation. + /// Because it doesn't chain to a previous alias analysis (like -no-aa), it + /// derives from the NoAA class. + struct BasicAliasAnalysis : public NoAA { virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AliasAnalysis::getAnalysisUsage(AU); + AU.addRequired<TargetData>(); } - virtual void initializePass(); + virtual void initializePass() { + TD = &getAnalysis<TargetData>(); + } AliasResult alias(const Value *V1, unsigned V1Size, const Value *V2, unsigned V2Size); @@ -79,10 +121,6 @@ namespace { RegisterAnalysisGroup<AliasAnalysis, BasicAliasAnalysis, true> Y; } // End of anonymous namespace -void BasicAliasAnalysis::initializePass() { - InitializeAliasAnalysis(this); -} - // hasUniqueAddress - Return true if the specified value points to something // with a unique, discernable, address. static inline bool hasUniqueAddress(const Value *V) { |