let clean_graph cfg =
let graph = cfg_graph cfg in
let rec reach n =
if !n.reachable then ()
else (!n.reachable <- true; iter_succ reach cfg n)
in reach (cfg_start cfg);
let clean n acc =
if !n.reachable then acc
else begin
Wp_parameters.debug ~level:3
"[cfg] remove unreachable node %a@." VL.pretty n;
let v = !n.kind in
CFG.remove_vertex graph n;
Hashtbl.remove cfg.stmt_node (node_type_id v);
v::acc
end
in
let unreach = fold_nodes clean cfg [] in
cfg, unreach