let compute kf stmt lval =
  debug1 "[Defs.compute] for %a at sid:%d in '%a'@."
    !Ast_printer.d_lval lval stmt.sid Kernel_function.pretty kf;
  try
    let pdg = !Db.Pdg.get kf in
    let zone = !Db.Value.lval_to_zone (Kstmt stmt)
                 ~with_alarms:CilE.warn_none_mode lval
    in
    let nodes, undef =
      !Db.Pdg.find_location_nodes_at_stmt pdg stmt ~before:true zone
    in
    let nodes = 
      if Interproc.get () then
        begin
          let caller_nodes =
            add_caller_nodes kf nodes
              ((match undef with None -> Locations.Zone.bottom | Some z -> z), 
               nodes)
          in add_callee_nodes caller_nodes caller_nodes 
        end
      else nodes
    in
    let add_node defs (node,_z) =
      match PdgIndex.Key.stmt (!Db.Pdg.node_key node) with
        | None -> defs
        | Some s -> Stmt.Set.add s defs
    in
    (* select corresponding stmts *)
    let defs = List.fold_left add_node Stmt.Set.empty nodes in
    Some (defs, undef)
  with Db.Pdg.Bottom | Db.Pdg.Top | Not_found ->
    None