From 0f7b31bdb9766e90b9c0bf79a20fa5656940e115 Mon Sep 17 00:00:00 2001 From: xavier thirioux <xavier.thirioux@isae-supaero.fr> Date: Tue, 21 Mar 2023 13:10:58 +0100 Subject: [PATCH] restored correct inlining for constants and locals --- src/causality.ml | 5 ++++- src/checks/liveness.ml | 1 + src/optimize_machine.ml | 5 +++-- src/scheduling.ml | 22 ++++++++++++++-------- src/scheduling.mli | 4 ++-- 5 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/causality.ml b/src/causality.ml index 9caf44bb..30116cee 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 ab45bf3d..81203d1e 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 60e61372..bf8b3be3 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 afc8206b..509524f5 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 29e66c76..ba3dbef2 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 -- GitLab