Implement support for code extracting basic blocks that have a return
authorChris Lattner <sabre@nondot.org>
Wed, 12 May 2004 16:07:41 +0000 (16:07 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 12 May 2004 16:07:41 +0000 (16:07 +0000)
instruction in them.

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

lib/Transforms/Utils/CodeExtractor.cpp

index d4c9faf81d6a5fc9d833964a2ecc08b7f5911666..e3259217a0d544dd86c8c65693cbdb9e3add32d6 100644 (file)
@@ -77,6 +77,7 @@ namespace {
     }
 
     void severSplitPHINodes(BasicBlock *&Header);
+    void splitReturnBlocks();
     void findInputsOutputs(Values &inputs, Values &outputs);
 
     Function *constructFunction(const Values &inputs,
@@ -184,8 +185,13 @@ void CodeExtractor::severSplitPHINodes(BasicBlock *&Header) {
       }
     }
   }
+}
 
-  verifyFunction(*NewBB->getParent());
+void CodeExtractor::splitReturnBlocks() {
+  for (std::set<BasicBlock*>::iterator I = BlocksToExtract.begin(),
+         E = BlocksToExtract.end(); I != E; ++I)
+    if (ReturnInst *RI = dyn_cast<ReturnInst>((*I)->getTerminator()))
+      (*I)->splitBasicBlock(RI, (*I)->getName()+".ret");
 }
 
 // findInputsOutputs - Find inputs to, outputs from the code region.
@@ -596,9 +602,13 @@ Function *CodeExtractor::ExtractCodeRegion(const std::vector<BasicBlock*> &code)
              "No blocks in this region may have entries from outside the region"
              " except for the first block!");
   
-  // If we have to split PHI nodes, do so now.
+  // If we have to split PHI nodes or the entry block, do so now.
   severSplitPHINodes(header);
 
+  // If we have any return instructions in the region, split those blocks so
+  // that the return is not in the region.
+  splitReturnBlocks();
+
   Function *oldFunction = header->getParent();
 
   // This takes place of the original loop