let compute kf stmt lval =
  let f = Kernel_function.get_definition kf in 
  let dpds, _exact, zone = Datascope.get_lval_zones stmt lval in
  let zone = Data.merge dpds zone in
    R.debug ~level:1 "[zones] build for %a before %d in %a@\n"
      Data.pretty zone stmt.sid Kernel_function.pretty_name kf;
  let data_part = Ctx.create 50 in
  List.iter (fun s -> Ctx.add data_part s.sid Data.bottom) f.sallstmts;
  let _ = Ctx.add data_part stmt.sid zone in
  let module DataComputer = Computer (struct let states = data_part endin
  let module DataCompute = Dataflow.BackwardsDataFlow(DataComputerin
  let _ = DataCompute.compute stmt.preds in
  let ctrl_part = data_part (* Ctx.create 50 *) in
    (* it is confusing to have 2 part in the provided information,
    * because in fact, it means nothing to separate them.
    * So let's put everything in the same object *)

  let used_stmts = DataComputer.get_and_reset_used_stmts () in
  let all_used_stmts = 
    if used_stmts = [] then []
    else compute_ctrl_info (!Db.Pdg.get kf) ctrl_part used_stmts
  in
  let all_used_stmts = 
    List.fold_left (fun e acc -> StmtSet.add acc e) StmtSet.empty all_used_stmts 
  in 
  all_used_stmts, data_part