Remove useless DEBUG
[oota-llvm.git] / lib / Transforms / Scalar / MemCpyOptimizer.cpp
index 94725db56b82519daf440fbe7c414a5bd7d9996a..849bd27b442a61ca7909045e1d4536f6e1319bc8 100644 (file)
@@ -519,19 +519,32 @@ bool MemCpyOpt::processStore(StoreInst *SI, BasicBlock::iterator &BBI) {
 
         // We use alias analysis to check if an instruction may store to
         // the memory we load from in between the load and the store. If
-        // such an instruction is found, we store it in AI.
-        Instruction *AI = nullptr;
+        // such an instruction is found, we try to promote there instead
+        // of at the store position.
+        Instruction *P = SI;
         for (BasicBlock::iterator I = ++LI->getIterator(), E = SI->getIterator();
              I != E; ++I) {
-          if (AA.getModRefInfo(&*I, LoadLoc) & MRI_Mod) {
-            AI = &*I;
-            break;
+          if (!(AA.getModRefInfo(&*I, LoadLoc) & MRI_Mod))
+            continue;
+
+          // 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.
+          P = &*I;
+          for (; I != E; ++I) {
+            MemoryLocation StoreLoc = MemoryLocation::get(SI);
+            if (AA.getModRefInfo(&*I, StoreLoc) != MRI_NoModRef) {
+              P = nullptr;
+              break;
+            }
           }
+
+          break;
         }
 
-        // If no aliasing instruction is found, then we can promote the
-        // load/store pair to a memcpy at the store loaction.
-        if (!AI) {
+        // If a valid insertion position is found, then we can promote
+        // the load/store pair to a memcpy.
+        if (P) {
           // If we load from memory that may alias the memory we store to,
           // memmove must be used to preserve semantic. If not, memcpy can
           // be used.
@@ -542,7 +555,7 @@ bool MemCpyOpt::processStore(StoreInst *SI, BasicBlock::iterator &BBI) {
           unsigned Align = findCommonAlignment(DL, SI, LI);
           uint64_t Size = DL.getTypeStoreSize(T);
 
-          IRBuilder<> Builder(SI);
+          IRBuilder<> Builder(P);
           Instruction *M;
           if (UseMemMove)
             M = Builder.CreateMemMove(SI->getPointerOperand(),