Fix PR26051: Memcpy optimization should introduce a call to memcpy before the store...
authorMehdi Amini <mehdi.amini@apple.com>
Wed, 6 Jan 2016 23:50:22 +0000 (23:50 +0000)
committerMehdi Amini <mehdi.amini@apple.com>
Wed, 6 Jan 2016 23:50:22 +0000 (23:50 +0000)
This is a conservative fix, I expect Amaury to relax this.
Follow-up for r256923

From: Mehdi Amini <mehdi.amini@apple.com>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256999 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/MemCpyOptimizer.cpp
test/Transforms/MemCpyOpt/fca2memcpy.ll

index 5711a775df8d04bd5c6fb169c1d24e803716b1d2..6b43b0f7a2ad8641a6654e97b891bab6f1ef5b94 100644 (file)
@@ -529,11 +529,13 @@ bool MemCpyOpt::processStore(StoreInst *SI, BasicBlock::iterator &BBI) {
 
           // We found an instruction that may write to the loaded memory.
           // We can try to promote at this position instead of the store
-          // position if nothing alias the store memory after this.
+          // position if nothing alias the store memory after this and the store
+          // destination is not in the range.
           P = &*I;
           for (; I != E; ++I) {
             MemoryLocation StoreLoc = MemoryLocation::get(SI);
-            if (AA.getModRefInfo(&*I, StoreLoc) != MRI_NoModRef) {
+            if (&*I == SI->getOperand(1) ||
+                AA.getModRefInfo(&*I, StoreLoc) != MRI_NoModRef) {
               P = nullptr;
               break;
             }
index 3c3b22bb33578894da424545c812f38e275ff854..c8a126848b0687e11e8aa6933481d1388333be39 100644 (file)
@@ -72,3 +72,17 @@ define void @copyalias(%S* %src, %S* %dst) {
   store %S %2, %S* %dst
   ret void
 }
+
+
+; The GEP is present after the aliasing store, preventing to move the memcpy before
+; (without further analysis/transformation)
+define void @copyaliaswithproducerinbetween(%S* %src, %S* %dst) {
+; CHECK-LABEL: copyalias
+; CHECK-NEXT: [[LOAD:%[a-z0-9\.]+]] = load %S, %S* %src
+; CHECK-NOT: call
+  %1 = load %S, %S* %src
+  store %S undef, %S* %dst
+  %dst2 = getelementptr %S , %S* %dst, i64 1
+  store %S %1, %S* %dst2
+  ret void
+}