Skip to content
Snippets Groups Projects
Commit 84372020 authored by GARION Christophe's avatar GARION Christophe
Browse files

[optimizations] correct rewritting in conditionals for O3 (LB patch)

parent 63da54a2
No related branches found
No related tags found
No related merge requests found
......@@ -1020,10 +1020,12 @@ let add_ghost_assigns_reassigned rasg instrs =
* ns the set of locations where it is written originally in SSA,
* k the equation index where it is originally written,
* b if there is a rewrite *)
let add_assigned n k v =
let add_assigned rasg n k v =
VMap.update v (function
| Some (ns, k', b) ->
if k = k' then Some (IntS.add n ns, k', b)
if rasg then
Some (ns, k', b || k > k' || not (IntS.mem n ns))
else if k = k' then Some (IntS.add n ns, k', b)
else Some (ns, k', b || k > k')
| None ->
Some (IntS.singleton n, k, false))
......@@ -1054,19 +1056,19 @@ let step_replace_var m reuse step =
let step_checks =
List.map (fun (l, v) -> l, value_replace_var fvar v) step.step_checks
in
let rec asg_instr k (n, asg) instr =
let rec asg_instr rasg k (n, asg) instr =
(* k: instruction block index (equation index)
* n: instruction index (absolute) *)
match instr.instr_desc with
| MLocalAssign (i, v) ->
n + 1, if silly_asg i v then asg else add_assigned n k i asg
n + 1, if silly_asg i v then asg else add_assigned rasg n k i asg
| MStep (il, _, _) ->
n + 1, List.fold_right (add_assigned n k) il asg
n + 1, List.fold_right (add_assigned rasg n k) il asg
| MBranch (_, hl, _) ->
let n, asg =
List.fold_left
(fun (n, asg) (_, il) ->
let n, asg = List.fold_left (asg_instr k) (n, asg) il in
let n, asg = List.fold_left (asg_instr rasg k) (n, asg) il in
n, asg)
(n, asg)
hl
......@@ -1075,10 +1077,10 @@ let step_replace_var m reuse step =
| _ ->
n + 1, asg
in
let assigned asg instrs =
let assigned rasg asg instrs =
let _, (_, asg) =
List.fold_left
(fun (k, acc) i -> k + 1, asg_instr k acc i)
(fun (k, acc) i -> k + 1, asg_instr rasg k acc i)
(0, (0, asg))
instrs
in
......@@ -1087,20 +1089,20 @@ let step_replace_var m reuse step =
(* SSA *)
let step_instrs = add_ghost_assigns fvar step.step_instrs in
(* register the locations of assignments *)
let asg = assigned VMap.empty step_instrs in
(* let pp fmt (ns, k, ks) = *)
let asg = assigned false VMap.empty step_instrs in
(* let pp fmt (ns, k, b) = *)
(* Format.( *)
(* fprintf fmt "[%a]%n{@[%a}@]" *)
(* fprintf fmt "[%a]%n:%a" *)
(* (pp_comma_list pp_print_int) (IntS.elements ns) *)
(* k *)
(* (pp_comma_list pp_print_int) (IntS.elements ks)) *)
(* pp_print_bool b) *)
(* in *)
(* Format.printf "AVANT %a@." (VMap.pp pp) asg; *)
(* SSA *)
let step_instrs = instrs_replace_var m fvar step_instrs in
(* update the locations of assignments, consider as reassignments only the
ones appearing *after* the original one *)
let asg = assigned asg step_instrs in
let asg = assigned true asg step_instrs in
let rasg =
VMap.filter_map
(fun _ (ns, _, b) -> if b then Some ns else None)
......
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