From d99e1d3afbe664694ee04a5db5e4a7a8104858a1 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 12 May 2004 16:07:41 +0000 Subject: [PATCH] Implement support for code extracting basic blocks that have a return 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 | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/Transforms/Utils/CodeExtractor.cpp b/lib/Transforms/Utils/CodeExtractor.cpp index d4c9faf81d6..e3259217a0d 100644 --- a/lib/Transforms/Utils/CodeExtractor.cpp +++ b/lib/Transforms/Utils/CodeExtractor.cpp @@ -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::iterator I = BlocksToExtract.begin(), + E = BlocksToExtract.end(); I != E; ++I) + if (ReturnInst *RI = dyn_cast((*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 &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