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. * within a complex loop condition are not matched by this predicate.
*/ */
private predicate bbLoopConditionAlwaysTrueUponEntrySuccessor(BasicBlock pred, BasicBlock succ, boolean skipsLoop) { private predicate bbLoopConditionAlwaysTrueUponEntrySuccessor(BasicBlock pred, BasicBlock succ, boolean skipsLoop) {
exists(ControlFlowNode loop | exists(Expr cond |
loopConditionAlwaysTrueUponEntry(loop, _) and loopConditionAlwaysTrueUponEntry(_, cond) and
cond.getAChild*() = pred.getEnd() and
succ = pred.getASuccessor() and
not cond.getAChild*() = succ.getStart() and
( (
( (
not succ = loop.(Loop).getStmt() and succ = pred.getAFalseSuccessor() and
pred.getAFalseSuccessor() = succ and
skipsLoop = true skipsLoop = true
) or ( ) or (
succ = loop.(Loop).getStmt() and succ = pred.getATrueSuccessor() and
pred.getATrueSuccessor() = succ and
skipsLoop = false skipsLoop = false
) )
) )