diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2014-07-15 04:40:27 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2014-07-15 04:40:27 +0000 |
commit | 818f5c483785a7e57b900f2796c16c5596def185 (patch) | |
tree | e622bd4308419f6839fb1fe55f08d362b70d3818 /llvm/lib/Transforms/Utils/BasicBlockUtils.cpp | |
parent | 6d4766535fd5a0eca8cfda055b1feb72e83f231a (diff) | |
download | bcm5719-llvm-818f5c483785a7e57b900f2796c16c5596def185.tar.gz bcm5719-llvm-818f5c483785a7e57b900f2796c16c5596def185.zip |
Give SplitBlockAndInsertIfThen the ability to update a domtree.
llvm-svn: 213045
Diffstat (limited to 'llvm/lib/Transforms/Utils/BasicBlockUtils.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/BasicBlockUtils.cpp | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp index 80b7e22baca..602e8ba5510 100644 --- a/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp +++ b/llvm/lib/Transforms/Utils/BasicBlockUtils.cpp @@ -673,7 +673,8 @@ ReturnInst *llvm::FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB, TerminatorInst *llvm::SplitBlockAndInsertIfThen(Value *Cond, Instruction *SplitBefore, bool Unreachable, - MDNode *BranchWeights) { + MDNode *BranchWeights, + DominatorTree *DT) { BasicBlock *Head = SplitBefore->getParent(); BasicBlock *Tail = Head->splitBasicBlock(SplitBefore); TerminatorInst *HeadOldTerm = Head->getTerminator(); @@ -690,6 +691,20 @@ TerminatorInst *llvm::SplitBlockAndInsertIfThen(Value *Cond, HeadNewTerm->setDebugLoc(SplitBefore->getDebugLoc()); HeadNewTerm->setMetadata(LLVMContext::MD_prof, BranchWeights); ReplaceInstWithInst(HeadOldTerm, HeadNewTerm); + + if (DT) { + if (DomTreeNode *OldNode = DT->getNode(Head)) { + std::vector<DomTreeNode *> Children(OldNode->begin(), OldNode->end()); + + DomTreeNode *NewNode = DT->addNewBlock(Tail, Head); + for (auto Child : Children) + DT->changeImmediateDominator(Child, NewNode); + + // Head dominates ThenBlock. + DT->addNewBlock(ThenBlock, Head); + } + } + return CheckTerm; } |