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
diff --git a/lib/Transforms/Scalar/MemCpyOptimizer.cpp b/lib/Transforms/Scalar/MemCpyOptimizer.cpp
index 6f93e32..4c487e0 100644
--- a/lib/Transforms/Scalar/MemCpyOptimizer.cpp
+++ b/lib/Transforms/Scalar/MemCpyOptimizer.cpp
@@ -762,6 +762,14 @@
   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 @@
     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;
 }