CPP: Improved solution (mostly performance).

This commit is contained in:
Geoffrey White
2019-06-04 13:24:20 +01:00
parent 47ff38ef22
commit 98d80deefb

View File

@@ -139,16 +139,17 @@ private predicate bbLoopEntryConditionAlwaysTrueAt(BasicBlock bb, int i, Control
* within a complex loop condition are not matched by this predicate.
*/
private predicate bbLoopConditionAlwaysTrueUponEntrySuccessor(BasicBlock pred, BasicBlock succ, boolean skipsLoop) {
exists(ControlFlowNode loop |
loopConditionAlwaysTrueUponEntry(loop, _) and
exists(Expr cond |
loopConditionAlwaysTrueUponEntry(_, cond) and
cond.getAChild*() = pred.getEnd() and
succ = pred.getASuccessor() and
not cond.getAChild*() = succ.getStart() and
(
(
not succ = loop.(Loop).getStmt() and
pred.getAFalseSuccessor() = succ and
succ = pred.getAFalseSuccessor() and
skipsLoop = true
) or (
succ = loop.(Loop).getStmt() and
pred.getATrueSuccessor() = succ and
succ = pred.getATrueSuccessor() and
skipsLoop = false
)
)