let check_and_add first elt kind pdg len already =
    try
      (*        Format.printf "[security] check node %a (in %s, kind %a)@."
                (!Pdg.pretty_node true) (fst elt)
                (Kernel_function.get_name (snd elt))
                pretty_kind kind;*)

      let v = M.find elt already in
      let found, dir, up, down = match kind with
        | Direct -> truetruefalsefalse
        | Indirect_Backward -> v.indirect_backward, v.direct, truefalse
        | Forward _ -> v.forward, v.direct, v.indirect_backward, true
      in
      v.callstack_length <- min v.callstack_length len;
      v.direct <- dir;
      v.indirect_backward <- up;
      v.forward <- down;
      found, already
    with Not_found ->
      let dir, up, down = match kind with
        | Direct -> truefalsefalse
        | Indirect_Backward -> falsetruefalse
        | Forward _ -> falsefalsetrue
      in
      let v =
        { pdg = pdg; callstack_length = len;
          direct = dir; indirect_backward = up; forward = down }
      in
      false,
      if first && kind = Forward Impact then
        (* do not add the initial selected stmt for an impact analysis.
           fixed FS#411 *)

        already
      else
        M.add elt v already