summaryrefslogtreecommitdiff
path: root/lib/Transforms
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-12-09 07:45:45 +0000
committerChris Lattner <sabre@nondot.org>2010-12-09 07:45:45 +0000
commit8fdca6a8738c1ad7091137688ee48c9e623b75bb (patch)
treedd602005f72a1c2d1c9011431295da866fe3d7cc /lib/Transforms
parentf7f35467a9aac818bd5813c17e80d7efb66dadd7 (diff)
downloadllvm-8fdca6a8738c1ad7091137688ee48c9e623b75bb.tar.gz
llvm-8fdca6a8738c1ad7091137688ee48c9e623b75bb.tar.bz2
llvm-8fdca6a8738c1ad7091137688ee48c9e623b75bb.tar.xz
enhance memcpyopt to zap memcpy's that have the same src/dst.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@121362 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r--lib/Transforms/Scalar/MemCpyOptimizer.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/lib/Transforms/Scalar/MemCpyOptimizer.cpp
index 6f93e326ba..4c487e0a34 100644
--- a/lib/Transforms/Scalar/MemCpyOptimizer.cpp
+++ b/lib/Transforms/Scalar/MemCpyOptimizer.cpp
@@ -762,6 +762,14 @@ bool MemCpyOpt::processMemCpy(MemCpyInst *M) {
ConstantInt *CopySize = dyn_cast<ConstantInt>(M->getLength());
if (CopySize == 0 || M->isVolatile()) return false;
+ // If the source and destination of the memcpy are the same, then zap it.
+ if (M->getSource() == M->getDest()) {
+ MD->removeInstruction(M);
+ M->eraseFromParent();
+ return false;
+ }
+
+
// The are two possible optimizations we can do for memcpy:
// a) memcpy-memcpy xform which exposes redundance for DSE.
// b) call-memcpy xform for return slot optimization.
@@ -773,10 +781,11 @@ bool MemCpyOpt::processMemCpy(MemCpyInst *M) {
return processMemCpyMemCpyDependence(M, MDep, CopySize->getZExtValue());
if (CallInst *C = dyn_cast<CallInst>(DepInfo.getInst())) {
- bool changed = performCallSlotOptzn(M, M->getDest(), M->getSource(),
- CopySize->getZExtValue(), C);
- if (changed) M->eraseFromParent();
- return changed;
+ if (performCallSlotOptzn(M, M->getDest(), M->getSource(),
+ CopySize->getZExtValue(), C)) {
+ M->eraseFromParent();
+ return true;
+ }
}
return false;
}