[BranchFolding] Set correct mem refs
[oota-llvm.git] / lib / CodeGen / BranchFolding.cpp
index 3878281a4fe9585faf33294ab3d6e0346e7adf2e..df5cac5a9f7abb17a7fddd93cb64b39daf9145b4 100644 (file)
@@ -744,35 +744,12 @@ bool BranchFolder::CreateCommonTailOnlyBlock(MachineBasicBlock *&PredBB,
   return true;
 }
 
-// Add MI1's MMOs to MI2's MMOs while excluding any duplicates. The MI scheduler
-// currently doesn't handle multiple MMOs, so duplicates would likely pessimize
-// the scheduler.
-static void mergeMMOs(MachineInstr *MI1, MachineInstr *MI2) {
-  auto I1 = MI1->memoperands_begin(), E1 = MI1->memoperands_end();
-  auto I2 = MI2->memoperands_begin(), E2 = MI2->memoperands_end();
-  MachineFunction *MF = MI1->getParent()->getParent();
-
-  // Mostly, MI1's MMO count is 1 or zero. So we don't have to use
-  // SmallSet.
-  for (; I1 != E1; ++I1) {
-    bool IsDupMMO = false;
-    for (I2 = MI2->memoperands_begin(); I2 != E2; ++I2) {
-      if (**I1 == **I2) {
-        IsDupMMO = true;
-        break;
-      }
-    }
-    if (IsDupMMO == false) {
-      MI2->addMemOperand(*MF, *I1);
-      E2 = MI2->memoperands_end();
-    }
-  }
-}
-
 static void
-mergeMMOsFromMemoryOperations(MachineBasicBlock::iterator MBBIStartPos,
-                              MachineBasicBlock &MBBCommon) {
-  // Merge MMOs from memory operations in the common block
+removeMMOsFromMemoryOperations(MachineBasicBlock::iterator MBBIStartPos,
+                               MachineBasicBlock &MBBCommon) {
+  // Remove MMOs from memory operations in the common block
+  // when they do not match the ones from the block being tail-merged.
+  // This ensures later passes conservatively compute dependencies.
   MachineBasicBlock *MBB = MBBIStartPos->getParent();
   // Note CommonTailLen does not necessarily matches the size of
   // the common BB nor all its instructions because of debug
@@ -803,7 +780,7 @@ mergeMMOsFromMemoryOperations(MachineBasicBlock::iterator MBBIStartPos,
     assert(MBBICommon->isIdenticalTo(&*MBBI) && "Expected matching MIIs!");
 
     if (MBBICommon->mayLoad() || MBBICommon->mayStore())
-      mergeMMOs(&*MBBI, &*MBBICommon);
+      MBBICommon->setMemRefs(MBBICommon->mergeMemRefsWith(*MBBI));
 
     ++MBBI;
     ++MBBICommon;
@@ -923,8 +900,8 @@ bool BranchFolder::TryTailMergeBlocks(MachineBasicBlock *SuccBB,
         continue;
       DEBUG(dbgs() << "BB#" << SameTails[i].getBlock()->getNumber()
                    << (i == e-1 ? "" : ", "));
-      // Merge MMOs from memory operations as needed.
-      mergeMMOsFromMemoryOperations(SameTails[i].getTailStartPos(), *MBB);
+      // Remove MMOs from memory operations as needed.
+      removeMMOsFromMemoryOperations(SameTails[i].getTailStartPos(), *MBB);
       // Hack the end off BB i, making it jump to BB commonTailIndex instead.
       ReplaceTailWithBranchTo(SameTails[i].getTailStartPos(), MBB);
       // BB i is no longer a predecessor of SuccBB; remove it from the worklist.