diff options
| author | Chris Lattner <sabre@nondot.org> | 2004-02-13 16:09:54 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2004-02-13 16:09:54 +0000 |
| commit | 9761271f0f88a3f9509e4e7c607daac70dba1e87 (patch) | |
| tree | 28576fa88b4d892e2d23404cf92e0f1bca155818 /llvm/lib/Analysis/DataStructure | |
| parent | 7eec19cf38df20bb2290c7e89f1a2cb51f6d99f3 (diff) | |
| download | bcm5719-llvm-9761271f0f88a3f9509e4e7c607daac70dba1e87.tar.gz bcm5719-llvm-9761271f0f88a3f9509e4e7c607daac70dba1e87.zip | |
Restructure code to handle memcpy/memmove
llvm-svn: 11374
Diffstat (limited to 'llvm/lib/Analysis/DataStructure')
| -rw-r--r-- | llvm/lib/Analysis/DataStructure/Local.cpp | 61 |
1 files changed, 33 insertions, 28 deletions
diff --git a/llvm/lib/Analysis/DataStructure/Local.cpp b/llvm/lib/Analysis/DataStructure/Local.cpp index 22a60414d3c..2a04d291283 100644 --- a/llvm/lib/Analysis/DataStructure/Local.cpp +++ b/llvm/lib/Analysis/DataStructure/Local.cpp @@ -17,6 +17,7 @@ #include "llvm/Constants.h" #include "llvm/DerivedTypes.h" #include "llvm/Instructions.h" +#include "llvm/Intrinsics.h" #include "llvm/Support/GetElementPtrTypeIterator.h" #include "llvm/Support/InstVisitor.h" #include "llvm/Target/TargetData.h" @@ -456,39 +457,43 @@ void GraphBuilder::visitCallSite(CallSite CS) { // Special case handling of certain libc allocation functions here. if (Function *F = CS.getCalledFunction()) if (F->isExternal()) - if (F->getName() == "calloc") { - setDestTo(*CS.getInstruction(), - createNode()->setHeapNodeMarker()->setModifiedMarker()); - return; - } else if (F->getName() == "realloc") { - DSNodeHandle RetNH = getValueDest(*CS.getInstruction()); - RetNH.mergeWith(getValueDest(**CS.arg_begin())); - if (DSNode *N = RetNH.getNode()) - N->setHeapNodeMarker()->setModifiedMarker()->setReadMarker(); - return; - } else if (F->getName() == "memset") { - // Merge the first argument with the return value, and mark the memory + switch (F->getIntrinsicID()) { + case Intrinsic::memmove: + case Intrinsic::memcpy: { + // Merge the first & second arguments, and mark the memory read and // modified. - DSNodeHandle RetNH = getValueDest(*CS.getInstruction()); - RetNH.mergeWith(getValueDest(**CS.arg_begin())); - if (DSNode *N = RetNH.getNode()) - N->setModifiedMarker(); - return; - } else if (F->getName() == "memmove") { - // Merge the first & second arguments with the result, and mark the - // memory read and modified. - DSNodeHandle RetNH = getValueDest(*CS.getInstruction()); - RetNH.mergeWith(getValueDest(**CS.arg_begin())); + DSNodeHandle RetNH = getValueDest(**CS.arg_begin()); RetNH.mergeWith(getValueDest(**(CS.arg_begin()+1))); if (DSNode *N = RetNH.getNode()) N->setModifiedMarker()->setReadMarker(); return; - } else if (F->getName() == "bzero") { - // Mark the memory modified. - DSNodeHandle H = getValueDest(**CS.arg_begin()); - if (DSNode *N = H.getNode()) - N->setModifiedMarker(); - return; + } + default: + if (F->getName() == "calloc") { + setDestTo(*CS.getInstruction(), + createNode()->setHeapNodeMarker()->setModifiedMarker()); + return; + } else if (F->getName() == "realloc") { + DSNodeHandle RetNH = getValueDest(*CS.getInstruction()); + RetNH.mergeWith(getValueDest(**CS.arg_begin())); + if (DSNode *N = RetNH.getNode()) + N->setHeapNodeMarker()->setModifiedMarker()->setReadMarker(); + return; + } else if (F->getName() == "memset") { + // Merge the first argument with the return value, and mark the memory + // modified. + DSNodeHandle RetNH = getValueDest(*CS.getInstruction()); + RetNH.mergeWith(getValueDest(**CS.arg_begin())); + if (DSNode *N = RetNH.getNode()) + N->setModifiedMarker(); + return; + } else if (F->getName() == "bzero") { + // Mark the memory modified. + DSNodeHandle H = getValueDest(**CS.arg_begin()); + if (DSNode *N = H.getNode()) + N->setModifiedMarker(); + return; + } } |

