diff --git a/src/causality.ml b/src/causality.ml index 9caf44bb4e34c46209c2c34c2a8165d9e2c7c452..30116cee2d154ec729435bc4089299611e9bebb9 100644 --- a/src/causality.ml +++ b/src/causality.ml @@ -105,7 +105,10 @@ module ExprDep = struct program/schedule, but used to simplify causality analysis *) let mk_instance_var eq f = incr instance_var_cpt; - Format.sprintf "%s_%d_%d" f (fst eq.eq_loc).Lexing.pos_lnum !instance_var_cpt + let loc = fst eq.eq_loc in + let lin = loc.Lexing.pos_lnum in + let col = loc.Lexing.pos_cnum - loc.Lexing.pos_bol in + Format.sprintf "%s_%d_%d_%d" f lin col !instance_var_cpt let mk_call_instance_var id = Format.sprintf "?%s" id diff --git a/src/checks/liveness.ml b/src/checks/liveness.ml index ab45bf3d4493a30cb28e2721063f489a6e69588f..81203d1ec982fd8b166ce2cd2c4d4fd168258e8f 100644 --- a/src/checks/liveness.ml +++ b/src/checks/liveness.ml @@ -147,6 +147,7 @@ let is_aliasable_input node var = (* replace variable [v] by [v'] in graph [g]. [v'] is a dead variable *) let replace_in_dep_graph v v' g = + assert (IdentDepGraph.mem_vertex g v); IdentDepGraph.add_vertex g v'; IdentDepGraph.iter_succ (fun s -> IdentDepGraph.add_edge g v' s) g v; IdentDepGraph.iter_pred (fun p -> IdentDepGraph.add_edge g p v') g v; diff --git a/src/optimize_machine.ml b/src/optimize_machine.ml index 60e6137299c6cc701283186525d34932be501363..bf8b3be3a577ea94c666382537522ab5f6beb102 100644 --- a/src/optimize_machine.ml +++ b/src/optimize_machine.ml @@ -1457,6 +1457,7 @@ let optimize params prog node_schs machine_code = machine_code) else machine_code in + let consts = Corelang.get_consts prog in (* Optimize machine code *) let prog, machine_code, removed_table = if @@ -1469,7 +1470,7 @@ let optimize params prog node_schs machine_code = "@ @[<v 2>.. machines optimization: const. inlining (partial eval. \ with const)@ "); let machine_code, removed_table = - machines_unfold (Corelang.get_consts prog) node_schs machine_code + machines_unfold consts node_schs machine_code in Log.report ~level:3 (fun fmt -> Format.fprintf @@ -1512,7 +1513,7 @@ let optimize params prog node_schs machine_code = let machine_code = if !Options.optimization >= 3 && not (Backends.is_functional ()) then let node_schs = - Scheduling.remove_prog_inlined_locals removed_table node_schs + Scheduling.remove_prog_inlined_consts_and_locals consts removed_table node_schs in let reuse_tables = Scheduling.compute_prog_reuse_table node_schs in machine_code diff --git a/src/scheduling.ml b/src/scheduling.ml index afc8206b8481f68eae71a096db89f208f5e86883..509524f5ade503c4b90745ca56761c6c5d1193f0 100644 --- a/src/scheduling.ml +++ b/src/scheduling.ml @@ -161,8 +161,8 @@ let compute_prog_reuse_table report = IMap.map compute_node_reuse_table report (* removes inlined local variables from schedule report, which are now useless *) -let remove_node_inlined_locals locals report = - let is_inlined v = IMap.exists (fun l _ -> v = l) locals in +let remove_node_inlined_consts_and_locals consts consts_and_locals report = + let is_inlined v = IMap.mem v consts_and_locals in let schedule' = List.fold_right (fun heads q -> @@ -171,16 +171,22 @@ let remove_node_inlined_locals locals report = report.schedule [] in - IMap.iter (fun v _ -> Hashtbl.remove report.fanin_table v) locals; + IMap.iter (fun v _ -> Hashtbl.remove report.fanin_table v) consts_and_locals; IMap.iter (fun v _ -> - let iv = ExprDep.(mk_call_instance_var (mk_call_instance_var v)) in - Liveness.replace_in_dep_graph v iv report.dep_graph) - locals; + if List.exists (fun decl -> Corelang.(const_of_top decl).const_id = v) + consts + then + let iv = ExprDep.(mk_read_var v) in + IdentDepGraph.remove_vertex report.dep_graph iv + else + let iv = ExprDep.(mk_call_instance_var (mk_call_instance_var v)) in + Liveness.replace_in_dep_graph v iv report.dep_graph) + consts_and_locals; { report with schedule = schedule' } -let remove_prog_inlined_locals removed reuse = - IMap.mapi (fun id -> remove_node_inlined_locals (IMap.find id removed)) reuse +let remove_prog_inlined_consts_and_locals consts removed reuse = + IMap.mapi (fun id -> remove_node_inlined_consts_and_locals consts (IMap.find id removed)) reuse let pp_eq_schedule fmt vl = match vl with diff --git a/src/scheduling.mli b/src/scheduling.mli index 29e66c7690b4ae59614f7edcbba156b20de2ec86..ba3dbef27520969eb82fdb7a2332023af0fa5100 100644 --- a/src/scheduling.mli +++ b/src/scheduling.mli @@ -6,8 +6,8 @@ open Scheduling_type val schedule_node : node_desc -> schedule_report val schedule_prog : program_t -> program_t * schedule_report IMap.t -val remove_prog_inlined_locals : - 'a IMap.t IMap.t -> schedule_report IMap.t -> schedule_report IMap.t +val remove_prog_inlined_consts_and_locals : + top_decl list -> 'a IMap.t IMap.t -> schedule_report IMap.t -> schedule_report IMap.t val compute_prog_reuse_table : schedule_report IMap.t -> (ident, var_decl) Hashtbl.t IMap.t