In BasicBlock::splitBasicBlock, just use islist::splice to move the instructions,
authorChris Lattner <sabre@nondot.org>
Tue, 3 Feb 2004 23:11:21 +0000 (23:11 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 3 Feb 2004 23:11:21 +0000 (23:11 +0000)
instead of a loop that is really inefficient with large basic blocks.

This speeds up the inliner pass on the testcase in PR209 from 13.8s to 2.24s
which still isn't exactly speedy, but is a lot better.  :)

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

lib/VMCore/BasicBlock.cpp

index f2b551bbd90ca1f3dabe471b72bf0a820306bbd8..c83b316672cd8f7608071b3c8ac3dd0bed33ff97 100644 (file)
@@ -233,14 +233,9 @@ BasicBlock *BasicBlock::splitBasicBlock(iterator I, const std::string &BBName) {
 
   BasicBlock *New = new BasicBlock(BBName, getParent());
 
-  // Go from the end of the basic block through to the iterator pointer, moving
-  // to the new basic block...
-  Instruction *Inst = 0;
-  do {
-    iterator EndIt = end();
-    Inst = InstList.remove(--EndIt);                  // Remove from end
-    New->InstList.push_front(Inst);                   // Add to front
-  } while (Inst != &*I);   // Loop until we move the specified instruction.
+  // Move all of the specified instructions from the original basic block into
+  // the new basic block.
+  New->getInstList().splice(New->end(), this->getInstList(), I, end());
 
   // Add a branch instruction to the newly formed basic block.
   new BranchInst(New, this);