1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-23 19:23:23 +01:00

Implement SimplifyCFG/branch-cond-prop.ll

llvm-svn: 13306
This commit is contained in:
Chris Lattner 2004-05-01 22:36:37 +00:00
parent d4abdd9dc3
commit 82278b599b

View File

@ -797,7 +797,35 @@ bool llvm::SimplifyCFG(BasicBlock *BB) {
(&*I == cast<Instruction>(BI->getCondition()) &&
&*++I == BI))
if (FoldValueComparisonIntoPredecessors(BI))
return SimplifyCFG(BB) || 1;
return SimplifyCFG(BB) | true;
}
if (BI->isConditional()) {
// If this block ends with a branch instruction, and if there is one
// predecessor, see if the previous block ended with a branch on the same
// condition, which makes this conditional branch redundant.
pred_iterator PI(pred_begin(BB)), PE(pred_end(BB));
BasicBlock *OnlyPred = *PI++;
for (; PI != PE; ++PI)// Search all predecessors, see if they are all same
if (*PI != OnlyPred) {
OnlyPred = 0; // There are multiple different predecessors...
break;
}
if (OnlyPred)
if (BranchInst *PBI = dyn_cast<BranchInst>(OnlyPred->getTerminator()))
if (PBI->isConditional() &&
PBI->getCondition() == BI->getCondition() &&
PBI->getSuccessor(0) != BB || PBI->getSuccessor(1) != BB) {
// Okay, the outcome of this conditional branch is statically
// knowable. Delete the outgoing CFG edge that is impossible to
// execute.
bool CondIsTrue = PBI->getSuccessor(0) == BB;
BI->getSuccessor(CondIsTrue)->removePredecessor(BB);
new BranchInst(BI->getSuccessor(!CondIsTrue), BB);
BB->getInstList().erase(BI);
return SimplifyCFG(BB) | true;
}
}
}
@ -812,7 +840,7 @@ bool llvm::SimplifyCFG(BasicBlock *BB) {
OnlyPred = 0; // There are multiple different predecessors...
break;
}
BasicBlock *OnlySucc = 0;
if (OnlyPred && OnlyPred != BB && // Don't break self loops
OnlyPred->getTerminator()->getOpcode() != Instruction::Invoke) {