let find_scope allstmts modif_stmts s =
let add fw sid x acc =
match x with
| State.Start ->
if fw then add_s sid acc
else
let x =
List.fold_left (fun x s -> State.merge x (States.find s.sid))
State.NotSeen s.succs
in let x = State.transfer (SidSet.mem sid modif_stmts) x in
if x = State.SameVal then add_s sid acc else acc
| State.SameVal -> add_s sid acc
| _ -> acc
in
let _ = backward_data_scope allstmts modif_stmts s in
let bw = States.fold (add false) Cilutil.StmtSet.empty in
let _ = forward_data_scope modif_stmts s in
let fw = States.fold (add true) Cilutil.StmtSet.empty in
let fb = Cilutil.StmtSet.inter bw fw in
let fw = Cilutil.StmtSet.diff fw fb in
let bw = Cilutil.StmtSet.diff bw fb in
fw, fb, bw