[llvm-commits] [llvm] r121362 - in /llvm/trunk: lib/Transforms/Scalar/MemCpyOptimizer.cpp test/Transforms/MemCpyOpt/memcpy.ll

Chris Lattner sabre at nondot.org
Wed Dec 8 23:45:45 PST 2010


Author: lattner
Date: Thu Dec  9 01:45:45 2010
New Revision: 121362

URL: http://llvm.org/viewvc/llvm-project?rev=121362&view=rev
Log:
enhance memcpyopt to zap memcpy's that have the same src/dst.

Modified:
    llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp
    llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll

Modified: llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp?rev=121362&r1=121361&r2=121362&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp Thu Dec  9 01:45:45 2010
@@ -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;
 }

Modified: llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll?rev=121362&r1=121361&r2=121362&view=diff
==============================================================================
--- llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll (original)
+++ llvm/trunk/test/Transforms/MemCpyOpt/memcpy.ll Thu Dec  9 01:45:45 2010
@@ -100,3 +100,12 @@
   ; CHECK: store i8 4
   ; CHECK: call void @test5a(%struct.S* byval align 16 %y)
 }
+
+;; Noop memcpy should be zapped.
+define void @test6(i8 *%P) {
+  call void @llvm.memcpy.p0i8.p0i8.i64(i8* %P, i8* %P, i64 8, i32 4, i1 false)
+  ret void
+; CHECK: @test6
+; CHECK-NEXT: ret void
+}
+





More information about the llvm-commits mailing list