let filterIf ifstmt next = match ifstmt.skind with
| If (e, { bstmts = sthen :: _ }, { bstmts = [] }, _)
when not (Stmt.equal sthen next) ->
(* [next] is the syntactic successor of the 'if', ie the
'else' branch. If the condition is never false, then
[sthen] postdominates [next]. We must not follow the edge
from [ifstmt] to [next] *)
snd (X.eval_cond ifstmt e)
| If (e, { bstmts = [] }, { bstmts = selse :: _ }, _)
when not (Stmt.equal selse next) ->
(* dual case *)
fst (X.eval_cond ifstmt e)
| _ -> true