let compute kf stmt lval =
let f = Kernel_function.get_definition kf in
let dpds, _exact, zone =
Datascope.get_lval_zones ~for_writing:false stmt lval in
let zone = Data.merge dpds zone in
debug1 "[zones] build for %a before %d in %a@\n"
Data.pretty zone stmt.sid Kernel_function.pretty kf;
let data_part = Ctx.create 50 in
List.iter (fun s -> Ctx.add data_part s Data.bottom) f.sallstmts;
let _ = Ctx.add data_part stmt zone in
let module DataComputer = Computer (struct let states = data_part end) in
let module DataCompute = Dataflow.Backwards(DataComputer) in
let _ = DataCompute.compute stmt.preds in
let ctrl_part = data_part in
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 -> Stmt.Set.add acc e) Stmt.Set.empty all_used_stmts
in
all_used_stmts, data_part