mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-11 00:39:36 +00:00
Give SplitBlockAndInsertIfThen the ability to update a domtree.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@213045 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0ff9c3a3ae
commit
ca3c5b8722
@ -23,6 +23,7 @@
|
||||
namespace llvm {
|
||||
|
||||
class AliasAnalysis;
|
||||
class DominatorTree;
|
||||
class Instruction;
|
||||
class MDNode;
|
||||
class Pass;
|
||||
@ -202,9 +203,12 @@ ReturnInst *FoldReturnIntoUncondBranch(ReturnInst *RI, BasicBlock *BB,
|
||||
/// If Unreachable is true, then ThenBlock ends with
|
||||
/// UnreachableInst, otherwise it branches to Tail.
|
||||
/// Returns the NewBasicBlock's terminator.
|
||||
///
|
||||
/// Updates DT if given.
|
||||
TerminatorInst *SplitBlockAndInsertIfThen(Value *Cond, Instruction *SplitBefore,
|
||||
bool Unreachable,
|
||||
MDNode *BranchWeights = nullptr);
|
||||
MDNode *BranchWeights = nullptr,
|
||||
DominatorTree *DT = nullptr);
|
||||
|
||||
/// SplitBlockAndInsertIfThenElse is similar to SplitBlockAndInsertIfThen,
|
||||
/// but also creates the ElseBlock.
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user