Revision 17d63fff
Added by Lélio Brun 10 months ago
src/optimize_machine.ml | ||
---|---|---|
900 | 900 |
|
901 | 901 |
let rec instr_reduce branches instr1 cont = |
902 | 902 |
match get_instr_desc instr1 with |
903 |
| MLocalAssign (_, { value_desc = Cst (Const_tag c); _ }) -> |
|
904 |
instr1 :: (List.assoc c branches @ cont) |
|
903 |
| MLocalAssign (_, { value_desc = Cst (Const_tag c); _ }) |
|
905 | 904 |
| MStateAssign (_, { value_desc = Cst (Const_tag c); _ }) -> |
906 | 905 |
instr1 :: (List.assoc c branches @ cont) |
907 | 906 |
| MBranch (g, hl) -> |
... | ... | |
938 | 937 |
let step_fusion step = |
939 | 938 |
{ step with step_instrs = instrs_fusion step.step_instrs } |
940 | 939 |
|
941 |
let machine_fusion m = { m with mstep = step_fusion m.mstep } |
|
940 |
let machine_fusion m = |
|
941 |
let m = { m with mstep = step_fusion m.mstep } in |
|
942 |
let unused = Machine_code_dep.compute_unused_variables m in |
|
943 |
let is_used v = not (ISet.mem v.var_id unused) in |
|
944 |
let step_locals = List.filter is_used m.mstep.step_locals in |
|
945 |
let rec filter_instrs instrs = |
|
946 |
List.filter_map (fun instr -> match get_instr_desc instr with |
|
947 |
| MLocalAssign (v, _) -> |
|
948 |
if is_used v then Some instr else None |
|
949 |
| MBranch (e, hl) -> |
|
950 |
Some (update_instr_desc instr |
|
951 |
(MBranch (e, List.map (fun (h, l) -> h, filter_instrs l) hl))) |
|
952 |
| _ -> Some instr) instrs |
|
953 |
in |
|
954 |
let step_instrs = filter_instrs m.mstep.step_instrs in |
|
955 |
{ m with mstep = { m.mstep with step_locals; step_instrs }} |
|
956 |
(* List.iter (fun (g, u) -> Format.printf "%a@;%a@." pp_dep_graph g ISet.pp u) gs; *) |
|
942 | 957 |
|
943 | 958 |
let machines_fusion prog = List.map machine_fusion prog |
944 | 959 |
|
... | ... | |
1100 | 1115 |
Scheduling.remove_prog_inlined_locals removed_table node_schs |
1101 | 1116 |
in |
1102 | 1117 |
let reuse_tables = Scheduling.compute_prog_reuse_table node_schs in |
1103 |
machines_fusion (machines_reuse_variables reuse_tables machine_code)) |
|
1118 |
let machine_code = machines_fusion (machines_reuse_variables reuse_tables machine_code) in |
|
1119 |
machine_code) |
|
1104 | 1120 |
else machine_code |
1105 | 1121 |
in |
1106 | 1122 |
|
Also available in: Unified diff
remove unused variables after tag elimination in machine code (-O >= 3)