diff options
-rw-r--r-- | include/llvm/Analysis/AliasAnalysis.h | 54 |
1 files changed, 43 insertions, 11 deletions
diff --git a/include/llvm/Analysis/AliasAnalysis.h b/include/llvm/Analysis/AliasAnalysis.h index 54ea494869..f1ab7031d0 100644 --- a/include/llvm/Analysis/AliasAnalysis.h +++ b/include/llvm/Analysis/AliasAnalysis.h @@ -40,8 +40,10 @@ class StoreInst; class TargetData; class AliasAnalysis { - const TargetData *TD; protected: + const TargetData *TD; + AliasAnalysis *AA; // Previous Alias Analysis to chain to. + /// InitializeAliasAnalysis - Subclasses must call this method to initialize /// the AliasAnalysis interface before any other methods are called. This is /// typically called by the run* methods of these subclasses. This may be @@ -55,7 +57,7 @@ protected: virtual void getAnalysisUsage(AnalysisUsage &AU) const; public: - AliasAnalysis() : TD(0) {} + AliasAnalysis() : TD(0), AA(0) {} virtual ~AliasAnalysis(); // We want to be subclassed /// getTargetData - Every alias analysis implementation depends on the size of @@ -82,9 +84,7 @@ public: /// analysis implementations. /// virtual AliasResult alias(const Value *V1, unsigned V1Size, - const Value *V2, unsigned V2Size) { - return MayAlias; - } + const Value *V2, unsigned V2Size); /// getMustAliases - If there are any pointers known that must alias this /// pointer, return them now. This allows alias-set based alias analyses to @@ -92,13 +92,13 @@ public: /// alias analysis supports this, it should ADD any must aliased pointers to /// the specified vector. /// - virtual void getMustAliases(Value *P, std::vector<Value*> &RetVals) {} + virtual void getMustAliases(Value *P, std::vector<Value*> &RetVals); /// pointsToConstantMemory - If the specified pointer is known to point into /// constant global memory, return true. This allows disambiguation of store /// instructions from constant pointers. /// - virtual bool pointsToConstantMemory(const Value *P) { return false; } + virtual bool pointsToConstantMemory(const Value *P); /// doesNotAccessMemory - If the specified function is known to never read or /// write memory, return true. If the function only reads from known-constant @@ -111,7 +111,7 @@ public: /// /// This property corresponds to the GCC 'const' attribute. /// - virtual bool doesNotAccessMemory(Function *F) { return false; } + virtual bool doesNotAccessMemory(Function *F); /// onlyReadsMemory - If the specified function is known to only read from /// non-volatile memory (or not access memory at all), return true. Functions @@ -122,7 +122,7 @@ public: /// /// This property corresponds to the GCC 'pure' attribute. /// - virtual bool onlyReadsMemory(Function *F) { return doesNotAccessMemory(F); } + virtual bool onlyReadsMemory(Function *F); //===--------------------------------------------------------------------===// @@ -158,8 +158,7 @@ public: /// Remember that if you override this and chain to another analysis, you must /// make sure that it doesn't have mod/ref info either. /// - virtual bool hasNoModRefInfoForCalls() const { return false; } - + virtual bool hasNoModRefInfoForCalls() const; /// Convenience functions... ModRefResult getModRefInfo(LoadInst *L, Value *P, unsigned Size); @@ -180,6 +179,10 @@ public: } } + //===--------------------------------------------------------------------===// + /// Higher level methods for querying mod/ref information. + /// + /// canBasicBlockModify - Return true if it is possible for execution of the /// specified basic block to modify the value pointed to by Ptr. /// @@ -192,6 +195,35 @@ public: /// bool canInstructionRangeModify(const Instruction &I1, const Instruction &I2, const Value *Ptr, unsigned Size); + + //===--------------------------------------------------------------------===// + /// Methods that clients should call when they transform the program to allow + /// alias analyses to update their internal data structures. Note that these + /// methods may be called on any instruction, regardless of whether or not + /// they have pointer-analysis implications. + /// + + /// deleteValue - This method should be called whenever an LLVM Value is + /// deleted from the program, for example when an instruction is found to be + /// redundant and is eliminated. + /// + virtual void deleteValue(Value *V); + + /// copyValue - This method should be used whenever a preexisting value in the + /// program is copied or cloned, introducing a new value. Note that analysis + /// implementations should tolerate clients that use this method to introduce + /// the same value multiple times: if the analysis already knows about a + /// value, it should ignore the request. + /// + virtual void copyValue(Value *From, Value *To); + + /// replaceWithNewValue - This method is the obvious combination of the two + /// above, and it provided as a helper to simplify client code. + /// + void replaceWithNewValue(Value *Old, Value *New) { + copyValue(Old, New); + deleteValue(Old); + } }; // Because of the way .a files work, we must force the BasicAA implementation to |