CFGBuilder: don't create the empty "loop back" block for DoStmts if the loop edge can never be taken.

llvm-svn: 111282
This commit is contained in:
Ted Kremenek 2010-08-17 20:59:56 +00:00
parent e0db9d01d9
commit 110974dfa4
1 changed files with 15 additions and 11 deletions

View File

@ -1476,18 +1476,22 @@ CFGBlock *CFGBuilder::VisitDoStmt(DoStmt* D) {
return 0;
}
// Add an intermediate block between the BodyBlock and the
// ExitConditionBlock to represent the "loop back" transition. Create an
// empty block to represent the transition block for looping back to the
// head of the loop.
// FIXME: Can we do this more efficiently without adding another block?
Block = NULL;
Succ = BodyBlock;
CFGBlock *LoopBackBlock = createBlock();
LoopBackBlock->setLoopTarget(D);
if (!KnownVal.isFalse()) {
// Add an intermediate block between the BodyBlock and the
// ExitConditionBlock to represent the "loop back" transition. Create an
// empty block to represent the transition block for looping back to the
// head of the loop.
// FIXME: Can we do this more efficiently without adding another block?
Block = NULL;
Succ = BodyBlock;
CFGBlock *LoopBackBlock = createBlock();
LoopBackBlock->setLoopTarget(D);
// Add the loop body entry as a successor to the condition.
AddSuccessor(ExitConditionBlock, KnownVal.isFalse() ? NULL : LoopBackBlock);
// Add the loop body entry as a successor to the condition.
AddSuccessor(ExitConditionBlock, LoopBackBlock);
}
else
AddSuccessor(ExitConditionBlock, NULL);
}
// Link up the condition block with the code that follows the loop.