From b15fb8e8d6e1d5c8bb36556c317ca879f55620ab Mon Sep 17 00:00:00 2001 From: David MICHEL Date: Mon, 27 May 2024 18:39:28 +0200 Subject: [PATCH] =?UTF-8?q?Gestion=20des=20r=C3=A9f=C3=A9rences=20dans=20l?= =?UTF-8?q?e=20backend=20C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mlang/backend_compilers/bir_to_dgfip_c.ml | 158 +++++++++--------- .../backend_compilers/dgfip_gen_files.ml | 24 ++- src/mlang/backend_compilers/dgfip_varid.ml | 40 +++-- src/mlang/m_frontend/check_validity.ml | 64 +++---- 4 files changed, 152 insertions(+), 134 deletions(-) diff --git a/src/mlang/backend_compilers/bir_to_dgfip_c.ml b/src/mlang/backend_compilers/bir_to_dgfip_c.ml index c831500d..3e7b009e 100644 --- a/src/mlang/backend_compilers/bir_to_dgfip_c.ml +++ b/src/mlang/backend_compilers/bir_to_dgfip_c.ml @@ -263,11 +263,7 @@ let rec generate_c_expr (e : Mir.expression Pos.marked) | Var var -> { def_test = D.m_var var None Def; value_comp = D.m_var var None Val } | Attribut (var, a) -> - let ptr = - match Mir.VariableMap.find (Pos.unmark var) var_indexes with - | Dgfip_varid.VarRef (t, _, _) -> t - | _ -> assert false - in + let ptr = Dgfip_varid.gen_ref_info var_indexes (Pos.unmark var) in let def_test = D.dinstr (Format.sprintf "attribut_%s_def((T_varinfo *)%s)" (Pos.unmark a) ptr) @@ -278,11 +274,7 @@ let rec generate_c_expr (e : Mir.expression Pos.marked) in D.build_transitive_composition { def_test; value_comp } | Size var -> - let ptr = - match Mir.VariableMap.find (Pos.unmark var) var_indexes with - | Dgfip_varid.VarRef (t, _, _) -> t - | _ -> assert false - in + let ptr = Dgfip_varid.gen_ref_info var_indexes (Pos.unmark var) in let def_test = D.dinstr "1.0" in let value_comp = D.dinstr (Format.sprintf "(%s->size)" ptr) in D.build_transitive_composition { def_test; value_comp } @@ -428,20 +420,14 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) | PrintString s -> Format.fprintf oc "print_string(%s, %s, \"%s\");@;" print_std pr_ctx (str_escape s) - | PrintName (var, _) -> begin - match Mir.VariableMap.find var var_indexes with - | Dgfip_varid.VarRef (t, _, _) -> - Format.fprintf oc "print_string(%s, %s, %s->name);@;" - print_std pr_ctx t - | _ -> assert false - end - | PrintAlias (var, _) -> begin - match Mir.VariableMap.find var var_indexes with - | Dgfip_varid.VarRef (t, _, _) -> - Format.fprintf oc "print_string(%s, %s, %s->alias);@;" - print_std pr_ctx t - | _ -> assert false - end + | PrintName (var, _) -> + let ptr = Dgfip_varid.gen_ref_info var_indexes var in + Format.fprintf oc "print_string(%s, %s, %s->name);@;" print_std + pr_ctx ptr + | PrintAlias (var, _) -> + let ptr = Dgfip_varid.gen_ref_info var_indexes var in + Format.fprintf oc "print_string(%s, %s, %s->alias);@;" print_std + pr_ctx ptr | PrintIndent e -> let locals, def, value = D.build_expression @@ generate_c_expr e var_indexes @@ -475,50 +461,58 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) args; Format.fprintf oc "@]@;}@;" | Iterate (m_var, vcs, expr, stmts) -> + let pr fmt = Format.fprintf oc fmt in let var = Pos.unmark m_var in let it_name = fresh_c_local "iterate" in Com.CatVar.Map.iter (fun vc _ -> let vcd = Com.CatVar.Map.find vc program.program_var_categories in + let ref_idx = Com.Var.loc_int var in + let ref_tab = Dgfip_varid.gen_tab (Some vcd.loc) in let var_indexes = - Mir.VariableMap.add var - (Dgfip_varid.VarRef - ("tab_" ^ it_name, Some vcd.loc, Com.Var.loc_int var)) - var_indexes + Mir.VariableMap.add var (Dgfip_varid.VarRef ref_idx) var_indexes in - Format.fprintf oc "@[{@;"; - Format.fprintf oc - "T_varinfo_%s *tab_%s = varinfo_%s;@;int nb_%s = 0;@;" vcd.id_str - it_name vcd.id_str it_name; - Format.fprintf oc "@[while (nb_%s < NB_%s) {@;" it_name - vcd.id_str; + let ref_info = Dgfip_varid.gen_ref_info var_indexes var in + let ref_def = Dgfip_varid.gen_ref_def var_indexes var in + let ref_val = Dgfip_varid.gen_ref_val var_indexes var in let cond_val = "cond_" ^ it_name in let cond_def = cond_val ^ "_d" in let locals, def, value = D.build_expression @@ generate_c_expr expr var_indexes in - Format.fprintf oc "char %s;@;double %s;@;@[{@;%a%a@;%a@]@;}@;" - cond_def cond_val D.format_local_declarations locals - (D.format_assign dgfip_flags var_indexes cond_def) - def - (D.format_assign dgfip_flags var_indexes cond_val) - value; - Format.fprintf oc "@[if(%s && %s){@;%a@]@;}@;" cond_def - cond_val - (generate_stmts dgfip_flags program var_indexes) - stmts; - Format.fprintf oc "tab_%s++;@;nb_%s++;@;" it_name it_name; - Format.fprintf oc "@]}@;"; - Format.fprintf oc "@]}@;") + pr "@[{@;"; + pr "T_varinfo_%s *tab_%s = varinfo_%s;@;" vcd.id_str it_name + vcd.id_str; + pr "int nb_%s = 0;@;" it_name; + pr "@[while (nb_%s < NB_%s) {@;" it_name vcd.id_str; + pr "char %s;@;" cond_def; + pr "double %s;@;" cond_val; + pr "%s = (T_varinfo *)tab_%s;@;" ref_info it_name; + pr "%s = &(D%s[%s->idx]);@;" ref_def ref_tab ref_info; + pr "%s = &(%s[%s->idx]);@;" ref_val ref_tab ref_info; + pr "@[{@;"; + pr "%a" D.format_local_declarations locals; + pr "%a@;" (D.format_assign dgfip_flags var_indexes cond_def) def; + pr "%a" (D.format_assign dgfip_flags var_indexes cond_val) value; + pr "@]@;"; + pr "}@;"; + pr "@[if(%s && %s){@;" cond_def cond_val; + pr "%a@]@;" (generate_stmts dgfip_flags program var_indexes) stmts; + pr "}@;"; + pr "tab_%s++;@;" it_name; + pr "nb_%s++;" it_name; + pr "@]@;}"; + pr "@]@;}@;") vcs | Restore (vars, var_params, stmts) -> - Format.fprintf oc "@[{@;"; + let pr fmt = Format.fprintf oc fmt in + pr "@[{@;"; let rest_name = fresh_c_local "restore" in - Format.fprintf oc "T_env_sauvegarde *%s = NULL;@;" rest_name; + pr "T_env_sauvegarde *%s = NULL;@;" rest_name; List.iter (fun m_v -> let v = Pos.unmark m_v in - Format.fprintf oc "env_sauvegarder(&%s, %s, %s, %s);@;" rest_name + pr "env_sauvegarder(&%s, %s, %s, %s);@;" rest_name (Dgfip_varid.gen_access_def_pointer var_indexes v) (Dgfip_varid.gen_access_pointer var_indexes v) (Dgfip_varid.gen_size var_indexes v)) @@ -530,46 +524,51 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) Com.CatVar.Map.iter (fun vc _ -> let vcd = Com.CatVar.Map.find vc program.program_var_categories in + let ref_idx = Com.Var.loc_int var in + let ref_tab = Dgfip_varid.gen_tab (Some vcd.loc) in let var_indexes = - Mir.VariableMap.add var - (Dgfip_varid.VarRef - ("tab_" ^ it_name, Some vcd.loc, Com.Var.loc_int var)) - var_indexes + Mir.VariableMap.add var (Dgfip_varid.VarRef ref_idx) var_indexes in - Format.fprintf oc "@[{@;"; - Format.fprintf oc - "T_varinfo_%s *tab_%s = varinfo_%s;@;int nb_%s = 0;@;" - vcd.id_str it_name vcd.id_str it_name; - Format.fprintf oc "@[while (nb_%s < NB_%s) {@;" it_name - vcd.id_str; + let ref_info = Dgfip_varid.gen_ref_info var_indexes var in + let ref_def = Dgfip_varid.gen_ref_def var_indexes var in + let ref_val = Dgfip_varid.gen_ref_val var_indexes var in let cond_val = "cond_" ^ it_name in let cond_def = cond_val ^ "_d" in let locals, def, value = D.build_expression @@ generate_c_expr expr var_indexes in - Format.fprintf oc - "char %s;@;double %s;@;@[{@;%a%a@;%a@]@;}@;" cond_def - cond_val D.format_local_declarations locals - (D.format_assign dgfip_flags var_indexes cond_def) - def - (D.format_assign dgfip_flags var_indexes cond_val) - value; - Format.fprintf oc "@[if(%s && %s){@;" cond_def cond_val; - Format.fprintf oc "env_sauvegarder(&%s, %s, %s, %s);@;" rest_name + pr "@[{@;"; + pr "T_varinfo_%s *tab_%s = varinfo_%s;@;" vcd.id_str it_name + vcd.id_str; + pr "int nb_%s = 0;@;" it_name; + pr "@[while (nb_%s < NB_%s) {@;" it_name vcd.id_str; + pr "char %s;@;" cond_def; + pr "double %s;@;" cond_val; + pr "%s = (T_varinfo *)tab_%s;@;" ref_info it_name; + pr "%s = &(D%s[%s->idx]);@;" ref_def ref_tab ref_info; + pr "%s = &(%s[%s->idx]);@;" ref_val ref_tab ref_info; + pr "@[{@;"; + pr "%a" D.format_local_declarations locals; + pr "%a@;" (D.format_assign dgfip_flags var_indexes cond_def) def; + pr "%a" (D.format_assign dgfip_flags var_indexes cond_val) value; + pr "@]@;"; + pr "}@;"; + pr "@[if(%s && %s){@;" cond_def cond_val; + pr "env_sauvegarder(&%s, %s, %s, %s);" rest_name (Dgfip_varid.gen_access_def_pointer var_indexes var) (Dgfip_varid.gen_access_pointer var_indexes var) (Dgfip_varid.gen_size var_indexes var); - Format.fprintf oc "@]@;}@;"; - Format.fprintf oc "tab_%s++;@;nb_%s++;@;" it_name it_name; - Format.fprintf oc "@]}@;"; - Format.fprintf oc "@]}@;") + pr "@]@;"; + pr "}@;"; + pr "tab_%s++;@;" it_name; + pr "nb_%s++;" it_name; + pr "@]@;}"; + pr "@]@;}@;") vcs) var_params; - Format.fprintf oc "%a@;" - (generate_stmts dgfip_flags program var_indexes) - stmts; - Format.fprintf oc "env_restaurer(&%s);@;" rest_name; - Format.fprintf oc "@]}@;" + pr "%a@;" (generate_stmts dgfip_flags program var_indexes) stmts; + pr "env_restaurer(&%s);@;" rest_name; + pr "@]}@;" | RaiseError (m_err, var_opt) -> let err = Pos.unmark m_err in let err_name = Pos.unmark err.Com.Error.name in @@ -619,7 +618,8 @@ let generate_var_tmp_decls (oc : Format.formatter) (tf : Mir.target_data) = (match sz_opt with | None -> pr "@;info->size = 1;" | Some i -> pr "@;info->size = %d;" i); - pr "@;info->cat = ID_TMP_VARS;") + pr "@;info->cat = ID_TMP_VARS;"; + pr "@;info->loc_cat = EST_TEMPORAIRE;") tf.target_tmp_vars; pr "@]@;}"); if tf.target_nb_refs > 0 then diff --git a/src/mlang/backend_compilers/dgfip_gen_files.ml b/src/mlang/backend_compilers/dgfip_gen_files.ml index 8207d92e..70835eac 100644 --- a/src/mlang/backend_compilers/dgfip_gen_files.ml +++ b/src/mlang/backend_compilers/dgfip_gen_files.ml @@ -776,9 +776,15 @@ let gen_table_varinfo fmt var_dict cat StrMap.fold (fun _ (var, idx, size) nb -> if Com.CatVar.compare (Com.Var.cat var) cat = 0 then ( - Format.fprintf fmt " { \"%s\", \"%s\", %d, %d, %d" + let loc_cat = + match (Com.Var.loc_tgv var).loc_cat with + | Com.CatVar.LocComputed -> "EST_CALCULEE" + | Com.CatVar.LocBase -> "EST_BASE" + | Com.CatVar.LocInput -> "EST_SAISIE" + in + Format.fprintf fmt " { \"%s\", \"%s\", %d, %d, %d, %s" (Pos.unmark var.Com.Var.name) - (Com.Var.alias_str var) idx size id_int; + (Com.Var.alias_str var) idx size id_int loc_cat; StrMap.iter (fun _ av -> Format.fprintf fmt ", %d" (Pos.unmark av)) (Com.Var.attrs var); @@ -867,6 +873,7 @@ let gen_decl_varinfos fmt (cprog : Mir.program) stats = int idx; int size; int cat; + int loc_cat; } T_varinfo; |}; @@ -879,6 +886,7 @@ let gen_decl_varinfos fmt (cprog : Mir.program) stats = int idx; int size; int cat; + int loc_cat; |} id_str; StrSet.iter (fun an -> Format.fprintf fmt " int attr_%s;\n" an) attr_set; @@ -1460,15 +1468,15 @@ typedef struct S_irdata T_irdata; #define S_ irdata->saisie #define C_ irdata->calculee #define B_ irdata->base -#define T_ irdata->tmps -#define R_ irdata->ref +/*#define T_ irdata->tmps*/ +/*#define R_ irdata->ref*/ #define DS_ irdata->def_saisie #define DC_ irdata->def_calculee #define DB_ irdata->def_base -#define DT_ irdata->def_tmps -#define DR_ irdata->def_ref -#define IT_ irdata->info_tmps -#define IR_ irdata->info_ref +/*#define DT_ irdata->def_tmps*/ +/*#define DR_ irdata->def_ref*/ +/*#define IT_ irdata->info_tmps*/ +/*#define IR_ irdata->info_ref*/ #define EST_SAISIE 0x00000 #define EST_CALCULEE 0x04000 diff --git a/src/mlang/backend_compilers/dgfip_varid.ml b/src/mlang/backend_compilers/dgfip_varid.ml index 4e51b1ef..a7bd9aed 100644 --- a/src/mlang/backend_compilers/dgfip_varid.ml +++ b/src/mlang/backend_compilers/dgfip_varid.ml @@ -19,7 +19,7 @@ type var_id = | VarInput of int | VarBase of int | VarComputed of int - | VarRef of string * Com.CatVar.loc option * int + | VarRef of int (* Map from variables to their TGV ID *) type var_id_map = var_id Mir.VariableMap.t @@ -30,11 +30,22 @@ let gen_tab = function | Some Com.CatVar.LocInput -> "S_" | None -> assert false -let gen_loc_type = function - | Some Com.CatVar.LocComputed -> "EST_CALCULEE" - | Some Com.CatVar.LocBase -> "EST_BASE" - | Some Com.CatVar.LocInput -> "EST_SAISIE" - | None -> assert false +let gen_ref tab i = Printf.sprintf "irdata->%sref[irdata->ref_org + (%d)]" tab i + +let gen_ref_info vm (v : Com.Var.t) = + match Mir.VariableMap.find v vm with + | VarRef i -> gen_ref "info_" i + | _ -> assert false + +let gen_ref_def vm (v : Com.Var.t) = + match Mir.VariableMap.find v vm with + | VarRef i -> gen_ref "def_" i + | _ -> assert false + +let gen_ref_val vm (v : Com.Var.t) = + match Mir.VariableMap.find v vm with + | VarRef i -> gen_ref "" i + | _ -> assert false let gen_access_def vm (v : Com.Var.t) offset = let vn = Pos.unmark v.name in @@ -46,8 +57,7 @@ let gen_access_def vm (v : Com.Var.t) offset = | VarInput i -> Printf.sprintf "DS_[%d/*%s*/%s]" i vn offset | VarBase i -> Printf.sprintf "DB_[%d/*%s*/%s]" i vn offset | VarComputed i -> Printf.sprintf "DC_[%d/*%s*/%s]" i vn offset - | VarRef (t, l, _) -> - Printf.sprintf "D%s[%s->idx/*%s*/%s]" (gen_tab l) t vn offset + | VarRef i -> Printf.sprintf "*(%s/*%s*/%s)" (gen_ref "def_" i) vn offset let gen_access_val vm (v : Com.Var.t) offset = let vn = Pos.unmark v.name in @@ -59,8 +69,7 @@ let gen_access_val vm (v : Com.Var.t) offset = | VarInput i -> Printf.sprintf "S_[%d/*%s*/%s]" i vn offset | VarBase i -> Printf.sprintf "B_[%d/*%s*/%s]" i vn offset | VarComputed i -> Printf.sprintf "C_[%d/*%s*/%s]" i vn offset - | VarRef (t, l, _) -> - Printf.sprintf "%s[%s->idx/*%s*/%s]" (gen_tab l) t vn offset + | VarRef i -> Printf.sprintf "*(%s/*%s*/%s)" (gen_ref "" i) vn offset let gen_access_pointer vm (v : Com.Var.t) = let vn = Pos.unmark v.name in @@ -72,7 +81,7 @@ let gen_access_pointer vm (v : Com.Var.t) = | VarInput i -> Printf.sprintf "(S_ + %d/*%s*/)" i vn | VarBase i -> Printf.sprintf "(B_ + %d/*%s*/)" i vn | VarComputed i -> Printf.sprintf "(C_ + %d/*%s*/)" i vn - | VarRef (t, l, _) -> Printf.sprintf "(%s + %s->idx/*%s*/)" (gen_tab l) t vn + | VarRef i -> Printf.sprintf "(%s/*%s*/)" (gen_ref "" i) vn let gen_access_def_pointer vm (v : Com.Var.t) = let vn = Pos.unmark v.name in @@ -84,8 +93,7 @@ let gen_access_def_pointer vm (v : Com.Var.t) = | VarInput i -> Printf.sprintf "(DS_ + %d/*%s*/)" i vn | VarBase i -> Printf.sprintf "(DB_ + %d/*%s*/)" i vn | VarComputed i -> Printf.sprintf "(DC_ + %d/*%s*/)" i vn - | VarRef (t, l, _) -> - Printf.sprintf "(D%s + %s->idx/*%s*/)" (gen_tab l) t vn + | VarRef i -> Printf.sprintf "(%s/*%s*/)" (gen_ref "def_" i) vn let gen_access_pos_from_start vm (v : Com.Var.t) = if Com.Var.is_temp v then @@ -95,7 +103,9 @@ let gen_access_pos_from_start vm (v : Com.Var.t) = | VarInput i -> Printf.sprintf "EST_SAISIE | %d" i | VarBase i -> Printf.sprintf "EST_BASE | %d" i | VarComputed i -> Printf.sprintf "EST_CALCULEE | %d" i - | VarRef (t, l, _) -> Printf.sprintf "%s | %s->idx" (gen_loc_type l) t + | VarRef i -> + let info = gen_ref "info_" i in + Printf.sprintf "%s->loc_cat | %s->idx" info info let gen_size vm (v : Com.Var.t) = let get_size (v : Com.Var.t) = Format.sprintf "%d" (Com.Var.size v) in @@ -103,4 +113,4 @@ let gen_size vm (v : Com.Var.t) = else match Mir.VariableMap.find v vm with | VarInput _ | VarBase _ | VarComputed _ -> get_size v - | VarRef (t, _, _) -> Format.sprintf "(%s->size)" t + | VarRef i -> Format.sprintf "(%s->size)" (gen_ref "info_" i) diff --git a/src/mlang/m_frontend/check_validity.ml b/src/mlang/m_frontend/check_validity.ml index edf45d45..06c16277 100644 --- a/src/mlang/m_frontend/check_validity.ml +++ b/src/mlang/m_frontend/check_validity.ml @@ -827,19 +827,19 @@ let complete_vars (prog : program) : program = | None -> 0 in let prog_targets = - let rec aux nbIt = function - | [] -> nbIt + let rec aux nbRef = function + | [] -> nbRef | (instr, _) :: il -> ( match instr with | Com.IfThenElse (_, ilt, ile) -> - aux (nbIt + max (aux 0 ilt) (aux 0 ile)) il - | Com.VerifBlock instrs -> aux (nbIt + aux 0 instrs) il - | Com.Iterate (_, _, _, instrs) -> aux (nbIt + 1 + aux 0 instrs) il - | Com.Restore (_, _, instrs) -> aux (nbIt + max 1 (aux 0 instrs)) il + aux (nbRef + max (aux 0 ilt) (aux 0 ile)) il + | Com.VerifBlock instrs -> aux (nbRef + aux 0 instrs) il + | Com.Iterate (_, _, _, instrs) -> aux (nbRef + 1 + aux 0 instrs) il + | Com.Restore (_, _, instrs) -> aux (nbRef + max 1 (aux 0 instrs)) il | Com.ComputeTarget _ | Com.Affectation _ | Com.Print _ | Com.RaiseError _ | Com.CleanErrors | Com.ExportErrors | Com.FinalizeErrors -> - aux nbIt il + aux nbRef il | Com.ComputeDomain _ | Com.ComputeChaining _ | Com.ComputeVerifs _ -> assert false) in @@ -859,56 +859,56 @@ let complete_vars (prog : program) : program = StrMap.map map prog.prog_targets in let nb_all_tmps, sz_all_tmps, nb_all_refs = - let rec aux (nb, sz, nbIt, tdata) = function - | [] -> (nb, sz, nbIt, tdata) + let rec aux (nb, sz, nbRef, tdata) = function + | [] -> (nb, sz, nbRef, tdata) | (instr, _) :: il -> ( match instr with | Com.ComputeTarget tn -> let name = Pos.unmark tn in let target = StrMap.find name prog_targets in let nb1, sz1 = (target.target_nb_tmps, target.target_sz_tmps) in - let nbt, szt, nbItT, tdata = + let nbt, szt, nbRefT, tdata = match StrMap.find_opt name tdata with | None -> - let nbt, szt, nbItT, tdata = + let nbt, szt, nbRefT, tdata = aux (0, 0, 0, tdata) target.target_prog in - let tdata = StrMap.add name (nbt, szt, nbItT) tdata in - (nbt, szt, nbItT, tdata) - | Some (nbt, szt, nbItT) -> (nbt, szt, nbItT, tdata) + let tdata = StrMap.add name (nbt, szt, nbRefT) tdata in + (nbt, szt, nbRefT, tdata) + | Some (nbt, szt, nbRefT) -> (nbt, szt, nbRefT, tdata) in let nb = nb + nb1 + nbt in let sz = sz + sz1 + szt in - let nbIt = nbIt + nbItT in - aux (nb, sz, nbIt, tdata) il + let nbRef = nbRef + nbRefT in + aux (nb, sz, nbRef, tdata) il | Com.IfThenElse (_, ilt, ile) -> - let nb1, sz1, nbIt1, tdata = aux (0, 0, 0, tdata) ilt in - let nb2, sz2, nbIt2, tdata = aux (0, 0, 0, tdata) ile in + let nb1, sz1, nbRef1, tdata = aux (0, 0, 0, tdata) ilt in + let nb2, sz2, nbRef2, tdata = aux (0, 0, 0, tdata) ile in let nb = nb + max nb1 nb2 in let sz = sz + max sz1 sz2 in - let nbIt = nbIt + max nbIt1 nbIt2 in - aux (nb, sz, nbIt, tdata) il + let nbRef = nbRef + max nbRef1 nbRef2 in + aux (nb, sz, nbRef, tdata) il | Com.VerifBlock instrs -> - let nb1, sz1, nbIt1, tdata = aux (0, 0, 0, tdata) instrs in + let nb1, sz1, nbRef1, tdata = aux (0, 0, 0, tdata) instrs in let nb = nb + nb1 in let sz = sz + sz1 in - let nbIt = nbIt + nbIt1 in - aux (nb, sz, nbIt, tdata) il + let nbRef = nbRef + nbRef1 in + aux (nb, sz, nbRef, tdata) il | Com.Iterate (_, _, _, instrs) -> - let nb1, sz1, nbIt1, tdata = aux (0, 0, 0, tdata) instrs in + let nb1, sz1, nbRef1, tdata = aux (0, 0, 0, tdata) instrs in let nb = nb + nb1 in let sz = sz + sz1 in - let nbIt = nbIt + 1 + nbIt1 in - aux (nb, sz, nbIt, tdata) il + let nbRef = nbRef + 1 + nbRef1 in + aux (nb, sz, nbRef, tdata) il | Com.Restore (_, _, instrs) -> - let nb1, sz1, nbIt1, tdata = aux (0, 0, 0, tdata) instrs in + let nb1, sz1, nbRef1, tdata = aux (0, 0, 0, tdata) instrs in let nb = nb + nb1 in let sz = sz + sz1 in - let nbIt = nbIt + max 1 nbIt1 in - aux (nb, sz, nbIt, tdata) il + let nbRef = nbRef + max 1 nbRef1 in + aux (nb, sz, nbRef, tdata) il | Com.Affectation _ | Com.Print _ | Com.RaiseError _ | Com.CleanErrors | Com.ExportErrors | Com.FinalizeErrors -> - aux (nb, sz, nbIt, tdata) il + aux (nb, sz, nbRef, tdata) il | Com.ComputeDomain _ | Com.ComputeChaining _ | Com.ComputeVerifs _ -> assert false) in @@ -916,8 +916,8 @@ let complete_vars (prog : program) : program = | None -> Err.main_target_not_found prog.prog_main_target | Some t -> let init_instrs = [ (Com.ComputeTarget t.target_name, Pos.no_pos) ] in - let nb, sz, nbIt, _ = aux (0, 0, 0, StrMap.empty) init_instrs in - (nb, sz, nbIt) + let nb, sz, nbRef, _ = aux (0, 0, 0, StrMap.empty) init_instrs in + (nb, sz, nbRef) in let prog_stats = Mir.