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")