let loop_node_edges cfg vloop = match node_type vloop with
| Vloop (true, _stmt) ->
let rec add_edge_and_preds e ((loops, edges) as acc) =
let e_src = edge_src e in
if CFG.V.compare vloop e_src = 0 then acc
else if Eset.mem e edges then acc
else
let loops = match node_type e_src with
| Vloop _ ->
if (List.exists (CFG.V.equal e_src) loops) then loops
else e_src::loops
| _ -> loops
in let edges = Eset.add e edges in
fold_pred_e add_edge_and_preds cfg e_src (loops, edges)
in
let get_back_edge_body e edges =
if is_back_edge e then add_edge_and_preds e edges
else edges
in fold_pred_e get_back_edge_body cfg vloop ([], Eset.empty)
| Vloop (false, _stmt) ->
Wp_parameters.not_yet_implemented
"[cfg:loop_node_edges] non natural loop..."
| _ -> raise (Invalid_argument "[cfg:loop_node_edges] not a loop")