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