let get_edge_labels e =
  let v_after = edge_dst e in
  let l = match node_type v_after with
    | Vstart -> assert false
    | VfctIn -> []
    | Vexit | VfctOut -> [Clabels.Post]
    | VblkIn (Bstmt s, _) -> [Clabels.mk_stmt_label s]
    | Vtest (false, _, _) | VblkIn _ | VblkOut _ | Vend -> []
    | Vcall (s,_,_,_) ->
        [Clabels.CallAt s.sid; Clabels.mk_stmt_label s]
    | Vstmt s | Vtest (true, s, _) | Vswitch (s,_) ->
        [Clabels.mk_stmt_label s]
    | Vloop2 _ -> []
    | Vloop (_,s) ->
        if is_back_edge e then []
        else [Clabels.mk_stmt_label s]
  in
  let v_before =  edge_src e in
  match node_type v_before with
    | VfctIn -> Clabels.Pre::l
    | Vloop (_, s) -> (Clabels.mk_loop_label s)::l
    | _ -> l