let loop_stmts cfg vloop =
let loop_nodes vloop = match !vloop.kind with
| Vloop (true, _stmt) ->
let rec add_node_and_preds n acc =
if (List.exists (CFG.V.equal n) acc) then acc
else fold_pred add_node_and_preds cfg n (n::acc)
in
let get_back_edge_body e nodes =
if is_back_edge e then add_node_and_preds (edge_src e) nodes
else nodes
in fold_pred_e get_back_edge_body cfg vloop [vloop]
| Vloop (false, _stmt) ->
Wp_parameters.not_yet_implemented
"[cfg:loop_stmts] non natural loop..."
| _ -> raise (Invalid_argument "[cfg:loop_stmts] not a loop")
in
List.map (fun n -> node_stmt_exn n) (loop_nodes vloop)