[NFC] Instruction: introduce replaceSuccessorWith() function, use it
Summary: There is `Instruction::getNumSuccessors()`, `Instruction::getSuccessor()` and `Instruction::setSuccessor()`, but no function to replace every specified `BasicBlock*` successor with some other specified `BasicBlock*`. I've found one place where it should clearly be used. Reviewers: chandlerc, craig.topper, spatel, danielcdh Reviewed By: craig.topper Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D61010 llvm-svn: 359994
This commit is contained in:
parent
e5be660e25
commit
7ad5d14f3a
|
@ -665,6 +665,10 @@ public:
|
|||
/// instruction must be a terminator.
|
||||
void setSuccessor(unsigned Idx, BasicBlock *BB);
|
||||
|
||||
/// Replace specified successor OldBB to point at the provided block.
|
||||
/// This instruction must be a terminator.
|
||||
void replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB);
|
||||
|
||||
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
||||
static bool classof(const Value *V) {
|
||||
return V->getValueID() >= Value::InstructionVal;
|
||||
|
|
|
@ -675,6 +675,13 @@ void Instruction::setSuccessor(unsigned idx, BasicBlock *B) {
|
|||
llvm_unreachable("not a terminator");
|
||||
}
|
||||
|
||||
void Instruction::replaceSuccessorWith(BasicBlock *OldBB, BasicBlock *NewBB) {
|
||||
for (unsigned Idx = 0, NumSuccessors = Instruction::getNumSuccessors();
|
||||
Idx != NumSuccessors; ++Idx)
|
||||
if (getSuccessor(Idx) == OldBB)
|
||||
setSuccessor(Idx, NewBB);
|
||||
}
|
||||
|
||||
Instruction *Instruction::cloneImpl() const {
|
||||
llvm_unreachable("Subclass of Instruction failed to implement cloneImpl");
|
||||
}
|
||||
|
|
|
@ -443,9 +443,7 @@ static BasicBlock *insertUniqueBackedgeBlock(Loop *L, BasicBlock *Preheader,
|
|||
if (!LoopMD)
|
||||
LoopMD = TI->getMetadata(LoopMDKind);
|
||||
TI->setMetadata(LoopMDKind, nullptr);
|
||||
for (unsigned Op = 0, e = TI->getNumSuccessors(); Op != e; ++Op)
|
||||
if (TI->getSuccessor(Op) == Header)
|
||||
TI->setSuccessor(Op, BEBlock);
|
||||
TI->replaceSuccessorWith(Header, BEBlock);
|
||||
}
|
||||
BEBlock->getTerminator()->setMetadata(LoopMDKind, LoopMD);
|
||||
|
||||
|
|
Loading…
Reference in New Issue