Fix some problems with the updating of SlotIndexes after adding a new MBB. In
authorCameron Zwarich <zwarich@apple.com>
Mon, 11 Feb 2013 09:24:42 +0000 (09:24 +0000)
committerCameron Zwarich <zwarich@apple.com>
Mon, 11 Feb 2013 09:24:42 +0000 (09:24 +0000)
particular, holes were being left between two blocks after splitting an edge.

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

include/llvm/CodeGen/SlotIndexes.h

index 690bee66c0f94a1b257518e3f4cf423cd39d047f..d4e8c20a318676b9ac65cb367765b356fd0d8534 100644 (file)
@@ -603,25 +603,30 @@ namespace llvm {
       MachineFunction::iterator nextMBB =
         llvm::next(MachineFunction::iterator(mbb));
 
-      IndexListEntry *nextEntry = 0;
-      if (nextMBB == mbb->getParent()->end())
-        nextEntry = &indexList.back();
-      else
-        nextEntry = getMBBStartIdx(nextMBB).listEntry();
-
-      IndexListEntry *startEntry = createEntry(0, 0);
-      IndexListEntry *stopEntry = createEntry(0, 0);
-
-      indexList.insertAfter(nextEntry, startEntry);
-      indexList.insertAfter(startEntry, stopEntry);
+      IndexListEntry *startEntry = 0;
+      IndexListEntry *endEntry = 0;
+      if (nextMBB == mbb->getParent()->end()) {
+        startEntry = &indexList.back();
+        endEntry = createEntry(0, 0);
+        indexList.insertAfter(startEntry, endEntry);
+      } else {
+        startEntry = createEntry(0, 0);
+        endEntry = getMBBStartIdx(nextMBB).listEntry();
+        indexList.insert(endEntry, startEntry);
+      }
 
       SlotIndex startIdx(startEntry, SlotIndex::Slot_Block);
-      SlotIndex endIdx(stopEntry, SlotIndex::Slot_Block);
+      SlotIndex endIdx(endEntry, SlotIndex::Slot_Block);
+
+      MachineFunction::iterator prevMBB(mbb);
+      assert(prevMBB != mbb->getParent()->end() &&
+             "Can't insert a new block at the beginning of a function.");
+      --prevMBB;
+      MBBRanges[prevMBB->getNumber()].second = startIdx;
 
       assert(unsigned(mbb->getNumber()) == MBBRanges.size() &&
              "Blocks must be added in order");
       MBBRanges.push_back(std::make_pair(startIdx, endIdx));
-
       idx2MBBMap.push_back(IdxMBBPair(startIdx, mbb));
 
       // FIXME: Renumber locally instead of renumbering the whole function every