mirror of
https://github.com/RPCSX/llvm.git
synced 2025-02-12 07:40:58 +00:00
Refactor to share code to find the position of a basic block successor in the
terminator's list of successors. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@96377 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7fca2294da
commit
adb6f22671
@ -102,6 +102,11 @@ void FindFunctionBackedges(const Function &F,
|
||||
//
|
||||
void RemoveSuccessor(TerminatorInst *TI, unsigned SuccNum);
|
||||
|
||||
/// SuccessorNumber - Search for the specified successor of basic block BB and
|
||||
/// return its position in the terminator instruction's list of successors.
|
||||
/// It is an error to call this with a block that is not a successor.
|
||||
unsigned SuccessorNumber(BasicBlock *BB, BasicBlock *Succ);
|
||||
|
||||
/// isCriticalEdge - Return true if the specified edge is a critical edge.
|
||||
/// Critical edges are edges from a block with multiple successors to a block
|
||||
/// with multiple predecessors.
|
||||
|
@ -2141,14 +2141,7 @@ bool GVN::performPRE(Function &F) {
|
||||
// We can't do PRE safely on a critical edge, so instead we schedule
|
||||
// the edge to be split and perform the PRE the next time we iterate
|
||||
// on the function.
|
||||
unsigned SuccNum = 0;
|
||||
for (unsigned i = 0, e = PREPred->getTerminator()->getNumSuccessors();
|
||||
i != e; ++i)
|
||||
if (PREPred->getTerminator()->getSuccessor(i) == CurrentBlock) {
|
||||
SuccNum = i;
|
||||
break;
|
||||
}
|
||||
|
||||
unsigned SuccNum = SuccessorNumber(PREPred, CurrentBlock);
|
||||
if (isCriticalEdge(PREPred->getTerminator(), SuccNum)) {
|
||||
toSplit.push_back(std::make_pair(PREPred->getTerminator(), SuccNum));
|
||||
continue;
|
||||
|
@ -274,24 +274,30 @@ void llvm::RemoveSuccessor(TerminatorInst *TI, unsigned SuccNum) {
|
||||
ReplaceInstWithInst(TI, NewTI);
|
||||
}
|
||||
|
||||
/// SplitEdge - Split the edge connecting specified block. Pass P must
|
||||
/// not be NULL.
|
||||
BasicBlock *llvm::SplitEdge(BasicBlock *BB, BasicBlock *Succ, Pass *P) {
|
||||
TerminatorInst *LatchTerm = BB->getTerminator();
|
||||
unsigned SuccNum = 0;
|
||||
/// SuccessorNumber - Search for the specified successor of basic block BB and
|
||||
/// return its position in the terminator instruction's list of successors.
|
||||
/// It is an error to call this with a block that is not a successor.
|
||||
unsigned llvm::SuccessorNumber(BasicBlock *BB, BasicBlock *Succ) {
|
||||
TerminatorInst *Term = BB->getTerminator();
|
||||
#ifndef NDEBUG
|
||||
unsigned e = LatchTerm->getNumSuccessors();
|
||||
unsigned e = Term->getNumSuccessors();
|
||||
#endif
|
||||
for (unsigned i = 0; ; ++i) {
|
||||
assert(i != e && "Didn't find edge?");
|
||||
if (LatchTerm->getSuccessor(i) == Succ) {
|
||||
SuccNum = i;
|
||||
break;
|
||||
}
|
||||
if (Term->getSuccessor(i) == Succ)
|
||||
return i;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// SplitEdge - Split the edge connecting specified block. Pass P must
|
||||
/// not be NULL.
|
||||
BasicBlock *llvm::SplitEdge(BasicBlock *BB, BasicBlock *Succ, Pass *P) {
|
||||
unsigned SuccNum = SuccessorNumber(BB, Succ);
|
||||
|
||||
// If this is a critical edge, let SplitCriticalEdge do it.
|
||||
if (SplitCriticalEdge(BB->getTerminator(), SuccNum, P))
|
||||
TerminatorInst *LatchTerm = BB->getTerminator();
|
||||
if (SplitCriticalEdge(LatchTerm, SuccNum, P))
|
||||
return LatchTerm->getSuccessor(SuccNum);
|
||||
|
||||
// If the edge isn't critical, then BB has a single successor or Succ has a
|
||||
|
Loading…
x
Reference in New Issue
Block a user