[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