Skip to content
Snippets Groups Projects
Commit 5e119a17 authored by BRUN Lelio's avatar BRUN Lelio
Browse files

Fix ghost assignments introduction in branches

parent 66ea2ee7
No related branches found
No related tags found
No related merge requests found
...@@ -907,37 +907,56 @@ and instrs_replace_var m fvar instrs = ...@@ -907,37 +907,56 @@ and instrs_replace_var m fvar instrs =
let instrs = List.fold_left (instr_replace_var m fvar) [] instrs in let instrs = List.fold_left (instr_replace_var m fvar) [] instrs in
List.rev instrs List.rev instrs
let add_ghost_assigns fvar instrs = let rec add_ghost_assign fvar instr =
(* let is_reused_def v = Hashtbl.find_opt reuse v.var_id in *) let aux spec i =
let add_reused vars i =
let v = fvar i in let v = fvar i in
if v.var_id = i.var_id then vars else VMap.add i v vars if (fvar i).var_id = i.var_id then spec
else add_ghost_assign_spec i (vdecl_to_val v) spec
in in
let rec is_defining_reused vars instr = match instr.instr_desc with
match instr.instr_desc with | MLocalAssign (i, _) ->
| MLocalAssign (i, _) -> let instr_spec = aux instr.instr_spec i in
add_reused vars i { instr with instr_spec }
| MStep (il, _, _) -> | MStep (il, _, _) ->
List.fold_left add_reused vars il let instr_spec = List.fold_left aux instr.instr_spec il in
| MBranch (_, hl, _) -> { instr with instr_spec }
List.fold_left | MBranch (e, hl, b) ->
(fun vars (_, instrs) -> List.fold_left is_defining_reused vars instrs) let hl = List.map (fun (h, l) -> h, add_ghost_assigns fvar l) hl in
vars { instr with instr_desc = MBranch (e, hl, b) }
hl | _ ->
| _ -> instr
vars
in and add_ghost_assigns fvar = List.map (add_ghost_assign fvar)
List.map (* let is_reused_def v = Hashtbl.find_opt reuse v.var_id in *)
(fun instr -> (* let add_reused vars i = *)
let vars = is_defining_reused VMap.empty instr in (* let v = fvar i in *)
let instr_spec = (* if v.var_id = i.var_id then vars else VMap.add i v vars *)
VMap.fold (* in *)
(fun i v -> add_ghost_assign_spec i (vdecl_to_val v)) (* let rec is_defining_reused vars instr = *)
vars (* match instr.instr_desc with *)
instr.instr_spec (* | MLocalAssign (i, _) -> *)
in (* add_reused vars i *)
{ instr with instr_spec }) (* | MStep (il, _, _) -> *)
instrs (* List.fold_left add_reused vars il *)
(* | MBranch (_, hl, _) -> *)
(* List.fold_left *)
(* (fun vars (_, instrs) -> List.fold_left is_defining_reused vars instrs) *)
(* vars *)
(* hl *)
(* | _ -> *)
(* vars *)
(* in *)
(* List.map *)
(* (fun instr -> *)
(* let vars = is_defining_reused VMap.empty instr in *)
(* let instr_spec = *)
(* VMap.fold *)
(* (fun i v -> add_ghost_assign_spec i (vdecl_to_val v)) *)
(* vars *)
(* instr.instr_spec *)
(* in *)
(* { instr with instr_spec }) *)
(* instrs *)
let ghost_vd v = { v with var_id = "__" ^ v.var_id } let ghost_vd v = { v with var_id = "__" ^ v.var_id }
......
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment