diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-03-26 22:43:20 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-03-26 22:43:20 +0000 |
| commit | b3baff18300d7fbbb7244147fad18b09c6ab7985 (patch) | |
| tree | 94188a74d16d1c352220f340ab6950a88d8cb233 | |
| parent | 68ee8f572c1903461b815cc24a9b496045fefec9 (diff) | |
| download | bcm5719-llvm-b3baff18300d7fbbb7244147fad18b09c6ab7985.tar.gz bcm5719-llvm-b3baff18300d7fbbb7244147fad18b09c6ab7985.zip | |
Teach steens-aa two things about mod/ref information:
1. If memory never escapes the program, it cannot be mod/ref'd by external
functions.
2. If memory is global never mod/ref'd in the program, it cannot be mod/ref'd
by any call.
llvm-svn: 20867
| -rw-r--r-- | llvm/lib/Analysis/DataStructure/Steensgaard.cpp | 36 |
1 files changed, 33 insertions, 3 deletions
diff --git a/llvm/lib/Analysis/DataStructure/Steensgaard.cpp b/llvm/lib/Analysis/DataStructure/Steensgaard.cpp index 0a62fdb4865..0d63c645a05 100644 --- a/llvm/lib/Analysis/DataStructure/Steensgaard.cpp +++ b/llvm/lib/Analysis/DataStructure/Steensgaard.cpp @@ -62,10 +62,11 @@ namespace { // Implement the AliasAnalysis API // - // alias - This is the only method here that does anything interesting... AliasResult alias(const Value *V1, unsigned V1Size, const Value *V2, unsigned V2Size); - + + ModRefResult getModRefInfo(CallSite CS, Value *P, unsigned Size); + private: void ResolveFunctionCall(Function *F, const DSCallSite &Call, DSNodeHandle &RetVal); @@ -183,7 +184,6 @@ bool Steens::runOnModule(Module &M) { return false; } -// alias - This is the only method here that does anything interesting... AliasAnalysis::AliasResult Steens::alias(const Value *V1, unsigned V1Size, const Value *V2, unsigned V2Size) { assert(ResultGraph && "Result graph has not been computed yet!"); @@ -224,3 +224,33 @@ AliasAnalysis::AliasResult Steens::alias(const Value *V1, unsigned V1Size, // return AliasAnalysis::alias(V1, V1Size, V2, V2Size); } + +AliasAnalysis::ModRefResult +Steens::getModRefInfo(CallSite CS, Value *P, unsigned Size) { + AliasAnalysis::ModRefResult Result = ModRef; + + // Find the node in question. + DSGraph::ScalarMapTy &GSM = ResultGraph->getScalarMap(); + DSGraph::ScalarMapTy::iterator I = GSM.find(P); + + if (I != GSM.end() && !I->second.isNull()) { + DSNode *N = I->second.getNode(); + if (N->isComplete()) { + // If this is a direct call to an external function, and if the pointer + // points to a complete node, the external function cannot modify or read + // the value (we know it's not passed out of the program!). + if (Function *F = CS.getCalledFunction()) + if (F->isExternal()) + return NoModRef; + + // Otherwise, if the node is complete, but it is only M or R, return this. + // This can be useful for globals that should be marked const but are not. + if (!N->isModified()) + Result = (ModRefResult)(Result & ~Mod); + if (!N->isRead()) + Result = (ModRefResult)(Result & ~Ref); + } + } + + return (ModRefResult)(Result & AliasAnalysis::getModRefInfo(CS, P, Size)); +} |

