let doInstr stmt instr state =
    !Db.progress ();
    pdg_debug "doInstr sid:%d : %a" stmt.sid !Ast_printer.d_instr instr;
    let state = match instr with
      | Call _ when not (Db.Value.is_reachable_stmt stmt) ->
          pdg_debug "call sid:%d is unreachable : skip.@." stmt.sid ;
          BuildPdg.process_unreachable_call current_pdg state stmt
      | _ when not (Db.Value.is_reachable_stmt stmt) ->
          pdg_debug "stmt sid:%d is unreachable : skip.@." stmt.sid ;
          BuildPdg.process_unreachable current_pdg state stmt
      | Set (lv, exp, _) -> process_asgn current_pdg state stmt lv exp
      | Call (lvaloption,funcexp,argl,_) ->
          !Db.progress ();
          process_call current_pdg state stmt lvaloption funcexp argl
      | Code_annot _
      | Skip _ -> BuildPdg.process_skip current_pdg state stmt
      | Asm  _ -> Extlib.not_yet_implemented "inline assembly instruction"
    in match state with None -> Dataflow.Default
      | Some state -> Dataflow.Done state