summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/CodeExtractor.cpp
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2009-08-24 23:32:14 +0000
committerOwen Anderson <resistor@mac.com>2009-08-24 23:32:14 +0000
commitb4aa5b151100f2c049fdeb99fde4ab7ad61a34c6 (patch)
tree423261a7842fd2d670d95db35eed2f066eaf6e65 /llvm/lib/Transforms/Utils/CodeExtractor.cpp
parenta6a3494c1d2e4588e130b00b5c6c3b7f785c3020 (diff)
downloadbcm5719-llvm-b4aa5b151100f2c049fdeb99fde4ab7ad61a34c6.tar.gz
bcm5719-llvm-b4aa5b151100f2c049fdeb99fde4ab7ad61a34c6.zip
When extracting SEME regions of code, the extractor needs to update the dominator tree for split return blocks.
llvm-svn: 79957
Diffstat (limited to 'llvm/lib/Transforms/Utils/CodeExtractor.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/CodeExtractor.cpp20
1 files changed, 18 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/CodeExtractor.cpp b/llvm/lib/Transforms/Utils/CodeExtractor.cpp
index 0558bf09ca9..73458ee16e7 100644
--- a/llvm/lib/Transforms/Utils/CodeExtractor.cpp
+++ b/llvm/lib/Transforms/Utils/CodeExtractor.cpp
@@ -183,8 +183,24 @@ void CodeExtractor::severSplitPHINodes(BasicBlock *&Header) {
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");
+ if (ReturnInst *RI = dyn_cast<ReturnInst>((*I)->getTerminator())) {
+ BasicBlock *New = (*I)->splitBasicBlock(RI, (*I)->getName()+".ret");
+ if (DT) {
+ // Old dominates New. New node domiantes all other nodes dominated
+ //by Old.
+ DomTreeNode *OldNode = DT->getNode(*I);
+ std::vector<DomTreeNode *> Children;
+ for (DomTreeNode::iterator DI = OldNode->begin(), DE = OldNode->end();
+ DI != DE; ++DI)
+ Children.push_back(*DI);
+
+ DomTreeNode *NewNode = DT->addNewBlock(New, *I);
+
+ for (std::vector<DomTreeNode *>::iterator I = Children.begin(),
+ E = Children.end(); I != E; ++I)
+ DT->changeImmediateDominator(*I, NewNode);
+ }
+ }
}
// findInputsOutputs - Find inputs to, outputs from the code region.
OpenPOWER on IntegriCloud