Skip to content

Commit 271998c

Browse files
committed
Cleaner check of variables to remove more unused
1 parent 7188755 commit 271998c

File tree

1 file changed

+182
-152
lines changed

1 file changed

+182
-152
lines changed

src/mlang/backend_compilers/bir_to_dgfip_c.ml

Lines changed: 182 additions & 152 deletions
Original file line numberDiff line numberDiff line change
@@ -816,8 +816,9 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
816816
let print = fresh_c_local "print" in
817817
let print_def = print ^ "_def" in
818818
let print_val = print ^ "_val" in
819-
(* The [print] var only is needed in a few cases. *)
819+
(* The [print]* variables are needed only in a few cases. *)
820820
let print_var_is_needed = ref false in
821+
let print_def_val_are_needed = ref false in
821822
(* Iterating on the arguments and saving the associated printers in a
822823
list to check as we build it if we will need the print_var; in which
823824
case, we set the previous reference to true. *)
@@ -855,6 +856,7 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
855856
pr "@;print_string(%s, %s, %s->%s);" print_std pr_ctx ptr
856857
fld
857858
| TabAccess (m_sp_opt, v, m_idx) ->
859+
print_def_val_are_needed := true;
858860
fun () ->
859861
pr_sp m_sp_opt (Some v);
860862
pr "@;@[<v 2>{";
@@ -884,7 +886,9 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
884886
let ef =
885887
StrMap.find (Pos.unmark f) p.program_event_fields
886888
in
887-
print_var_is_needed := ef.is_var;
889+
if ef.is_var then (
890+
print_var_is_needed := true;
891+
print_def_val_are_needed := true);
888892
fun () ->
889893
pr_sp m_sp_opt None;
890894
if ef.is_var then (
@@ -903,6 +907,7 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
903907
print_std pr_ctx print (Pos.unmark f) fld;
904908
pr "@]@;}"))
905909
| PrintIndent e ->
910+
print_def_val_are_needed := true;
906911
fun () ->
907912
generate_expr_with_res_in p dgfip_flags oc print_def print_val
908913
e;
@@ -911,6 +916,7 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
911916
print_val;
912917
pr "@]@;}"
913918
| PrintExpr (e, min, max) ->
919+
print_def_val_are_needed := true;
914920
fun () ->
915921
generate_expr_with_res_in p dgfip_flags oc print_def print_val
916922
e;
@@ -923,7 +929,8 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
923929
args
924930
in
925931
pr "@;@[<v 2>{";
926-
pr "@;char %s;@;double %s;" print_def print_val;
932+
if !print_def_val_are_needed then
933+
pr "@;char %s;@;double %s;" print_def print_val;
927934
if !print_var_is_needed then pr "@;int %s;" print;
928935
List.iter (fun f -> f ()) printers;
929936
pr "@]@;}"
@@ -1150,156 +1157,179 @@ let rec generate_stmt (dgfip_flags : Dgfip_options.flags) (p : Mir.program)
11501157
let nb_events_sav = fresh_c_local "nb_events_sav" in
11511158
let nb_add = fresh_c_local "nb_add" in
11521159
let cpt_i = fresh_c_local "i" in
1153-
let cpt_j = fresh_c_local "j" in
11541160
let evt = fresh_c_local "evt" in
1155-
pr "@;@[<v 2>{";
1156-
pr "@;T_event **%s = irdata->events;" events_sav;
1157-
pr "@;int %s = irdata->nb_events;" nb_events_sav;
1158-
pr "@;int %s = 0;" nb_add;
1159-
pr "@;T_event **%s = NULL;" events_tmp;
1160-
pr "@;int %s = 0;" cpt_i;
1161-
pr "@;int %s = 0;" cpt_j;
1162-
(match add with
1163-
| Some expr ->
1164-
pr "@;@[<v 2>{";
1165-
let cond = fresh_c_local "cond" in
1166-
let cond_def = cond ^ "_def" in
1167-
let cond_val = cond ^ "_val" in
1168-
pr "@;char %s;@;double %s;" cond_def cond_val;
1169-
generate_expr_with_res_in p dgfip_flags oc cond_def cond_val expr;
1170-
pr "@;%s = (int)%s;" nb_add cond_val;
1171-
pr "@;if (%s < 0) %s = 0;" nb_add nb_add;
1172-
pr "@;@[<v 2>if (%s && 0 < %s) {" cond_def nb_add;
1173-
let cpt_k = fresh_c_local "k" in
1174-
pr "@;int %s = 0;" cpt_k;
1175-
pr "@;%s = (T_event **)malloc((%s + %s) * (sizeof (T_event *)));"
1176-
events_tmp nb_events_sav nb_add;
1177-
pr "@;@[<v 2>for (%s = 0; %s < %s; %s++) {" cpt_k cpt_k nb_add cpt_k;
1178-
pr "@;T_event *%s = (T_event *)malloc(sizeof (T_event));" evt;
1179-
StrMap.iter
1180-
(fun f (ef : Com.event_field) ->
1181-
if ef.is_var then
1182-
let _, var = StrMap.min_binding p.program_vars in
1183-
pr "@;%s->field_%s_var = %s;" evt f (VID.gen_info_ptr var)
1184-
else (
1185-
pr "@;%s->field_%s_def = 0;" evt f;
1186-
pr "@;%s->field_%s_val = 0.0;" evt f))
1187-
p.program_event_fields;
1188-
pr "@;%s[%s] = %s;" events_tmp cpt_k evt;
1189-
pr "@]@;}";
1190-
pr "@]@;@[<v 2>} else {";
1191-
pr "@;%s = 0;" nb_add;
1192-
pr "@;%s = (T_event **)malloc(%s * (sizeof (T_event *)));" events_tmp
1193-
nb_events_sav;
1194-
pr "@]@;}";
1195-
pr "@;%s = %s;" cpt_i nb_add;
1196-
pr "@]@;}"
1197-
| None ->
1198-
pr "@;%s = (T_event **)malloc(%s * (sizeof (T_event *)));" events_tmp
1199-
nb_events_sav);
1200-
(match filter with
1201-
| Some (var, expr) ->
1202-
pr "@;@[<v 2>while(%s < %s) {" cpt_j nb_events_sav;
1203-
let ref_def = VID.gen_def None var in
1204-
(* !!! *)
1205-
let ref_val = VID.gen_val None var in
1206-
(* !!! *)
1207-
let cond = fresh_c_local "cond" in
1208-
let cond_def = cond ^ "_def" in
1209-
let cond_val = cond ^ "_val" in
1210-
pr "@;char %s;@;double %s;" cond_def cond_val;
1211-
pr "@;%s = 1;" ref_def;
1212-
pr "@;%s = (double)%s;" ref_val cpt_j;
1213-
generate_expr_with_res_in p dgfip_flags oc cond_def cond_val expr;
1214-
pr "@;@[<v 2>if (%s && %s != 0.0) {" cond_def cond_val;
1215-
pr "@;%s[%s] = irdata->events[%s];" events_tmp cpt_i cpt_j;
1216-
pr "@;%s++;" cpt_i;
1217-
pr "@]@;}";
1218-
pr "@;%s++;" cpt_j;
1219-
pr "@]@;}";
1220-
pr "@;irdata->events = %s;" events_tmp;
1221-
pr "@;irdata->nb_events = %s;" cpt_i
1222-
| None ->
1223-
pr "@;@[<v 2>while (%s < %s) {" cpt_i nb_events_sav;
1224-
pr "@;%s[%s] = irdata->events[%s];" events_tmp cpt_i cpt_i;
1225-
pr "@;%s++;" cpt_i;
1226-
pr "@]@;}";
1227-
pr "@;irdata->events = %s;" events_tmp;
1228-
pr "@;irdata->nb_events = %s;" cpt_i);
1229-
(match sort with
1230-
| Some (var0, var1, expr) ->
1231-
pr "@;/* merge sort */";
1232-
pr "@;@[<v 2>{";
1233-
pr "@;int aBeg = %s;" nb_add;
1234-
pr "@;int aEnd = irdata->nb_events;";
1235-
pr
1236-
"@;\
1237-
T_event **b = (T_event **)malloc(irdata->nb_events * (sizeof \
1238-
(T_event *)));";
1239-
pr "@;int width;";
1240-
pr "@;int iLeft;";
1241-
pr "@;int i;";
1242-
pr
1243-
"@;\
1244-
@[<v 2>@[<hov 2>for (width = 1;@ width < aEnd;@ width = 2 * \
1245-
width) {@]";
1246-
pr
1247-
"@;\
1248-
@[<v 2>@[<hov 2>for (iLeft = aBeg;@ iLeft < aEnd;@ iLeft = iLeft \
1249-
+ 2 * width) {@]";
1250-
pr "@;int iRight = iLeft + width;";
1251-
pr "@;int iEnd = iLeft + 2 * width;";
1252-
pr "@;if (iRight > aEnd) iRight = aEnd;";
1253-
pr "@;if (iEnd > aEnd) iEnd = aEnd;";
1254-
pr "@;@[<v 2>{";
1255-
pr "@;int i = iLeft;";
1256-
pr "@;int j = iRight;";
1257-
pr "@;int k;";
1258-
pr "@;@[<v 2>@[<hov 2>for (k = iLeft;@ k < iEnd;@ k++) {@]";
1259-
pr "@;int cpt = 0;";
1260-
pr "@;@[<v 2>{";
1261-
(* Comparaison *)
1262-
let ref0_def = VID.gen_def None var0 in
1263-
(* !!! *)
1264-
let ref0_val = VID.gen_val None var0 in
1265-
(* !!! *)
1266-
let ref1_def = VID.gen_def None var1 in
1267-
(* !!! *)
1268-
let ref1_val = VID.gen_val None var1 in
1269-
(* !!! *)
1270-
let cmp_def = fresh_c_local "cmp_def" in
1271-
let cmp_val = fresh_c_local "cmp_val" in
1272-
pr "@;char %s;@;double %s;" cmp_def cmp_val;
1273-
pr "@;%s = 1;" ref0_def;
1274-
pr "@;%s = (double)i;" ref0_val;
1275-
pr "@;%s = 1;" ref1_def;
1276-
pr "@;%s = (double)j;" ref1_val;
1277-
generate_expr_with_res_in p dgfip_flags oc cmp_def cmp_val expr;
1278-
pr "@;cpt = %s && %s != 0.0;" cmp_def cmp_val;
1279-
(* ----------- *)
1280-
pr "@]@;}";
1281-
pr "@;@[<v 2>if (i < iRight && (j >= iEnd || cpt)) {";
1282-
pr "@;b[k] = irdata->events[i];";
1283-
pr "@;i = i + 1;";
1284-
pr "@]@;@;@[<v 2>} else {";
1285-
pr "@;b[k] = irdata->events[j];";
1286-
pr "@;j = j + 1;";
1287-
pr "@]@;}";
1288-
pr "@]@;}";
1289-
pr "@]@;}";
1290-
pr "@]@;}";
1291-
pr "@;@[<v 2>@[<hov 2>for (i = aBeg;@ i < aEnd;@ i++) {@]";
1292-
pr "@;irdata->events[i] = b[i];";
1293-
pr "@]@;}";
1294-
pr "@]@;}";
1295-
pr "@;free(b);";
1296-
pr "@]@;}"
1297-
| None -> ());
1298-
pr "%a" (generate_stmts dgfip_flags p) stmts;
1299-
pr "@;free(irdata->events);";
1300-
pr "@;irdata->events = %s;" events_sav;
1301-
pr "@;irdata->nb_events = %s;" nb_events_sav;
1302-
pr "@]@;}"
1161+
let cpt_j = fresh_c_local "j" in
1162+
let need_j = ref false in
1163+
let init () =
1164+
pr "@;@[<v 2>{";
1165+
pr "@;T_event **%s = irdata->events;" events_sav;
1166+
pr "@;int %s = irdata->nb_events;" nb_events_sav;
1167+
pr "@;int %s = 0;" nb_add;
1168+
pr "@;T_event **%s = NULL;" events_tmp;
1169+
pr "@;int %s = 0;" cpt_i;
1170+
if !need_j then pr "@;int %s = 0;" cpt_j
1171+
in
1172+
let add_printer =
1173+
match add with
1174+
| Some expr ->
1175+
fun () ->
1176+
pr "@;@[<v 2>{";
1177+
let cond = fresh_c_local "cond" in
1178+
let cond_def = cond ^ "_def" in
1179+
let cond_val = cond ^ "_val" in
1180+
pr "@;char %s;@;double %s;" cond_def cond_val;
1181+
generate_expr_with_res_in p dgfip_flags oc cond_def cond_val expr;
1182+
pr "@;%s = (int)%s;" nb_add cond_val;
1183+
pr "@;if (%s < 0) %s = 0;" nb_add nb_add;
1184+
pr "@;@[<v 2>if (%s && 0 < %s) {" cond_def nb_add;
1185+
let cpt_k = fresh_c_local "k" in
1186+
pr "@;int %s = 0;" cpt_k;
1187+
pr "@;%s = (T_event **)malloc((%s + %s) * (sizeof (T_event *)));"
1188+
events_tmp nb_events_sav nb_add;
1189+
pr "@;@[<v 2>for (%s = 0; %s < %s; %s++) {" cpt_k cpt_k nb_add
1190+
cpt_k;
1191+
pr "@;T_event *%s = (T_event *)malloc(sizeof (T_event));" evt;
1192+
StrMap.iter
1193+
(fun f (ef : Com.event_field) ->
1194+
if ef.is_var then
1195+
let _, var = StrMap.min_binding p.program_vars in
1196+
pr "@;%s->field_%s_var = %s;" evt f (VID.gen_info_ptr var)
1197+
else (
1198+
pr "@;%s->field_%s_def = 0;" evt f;
1199+
pr "@;%s->field_%s_val = 0.0;" evt f))
1200+
p.program_event_fields;
1201+
pr "@;%s[%s] = %s;" events_tmp cpt_k evt;
1202+
pr "@]@;}";
1203+
pr "@]@;@[<v 2>} else {";
1204+
pr "@;%s = 0;" nb_add;
1205+
pr "@;%s = (T_event **)malloc(%s * (sizeof (T_event *)));"
1206+
events_tmp nb_events_sav;
1207+
pr "@]@;}";
1208+
pr "@;%s = %s;" cpt_i nb_add;
1209+
pr "@]@;}"
1210+
| None ->
1211+
fun () ->
1212+
pr "@;%s = (T_event **)malloc(%s * (sizeof (T_event *)));"
1213+
events_tmp nb_events_sav
1214+
in
1215+
let filter_printer =
1216+
match filter with
1217+
| Some (var, expr) ->
1218+
need_j := true;
1219+
fun () ->
1220+
pr "@;@[<v 2>while(%s < %s) {" cpt_j nb_events_sav;
1221+
let ref_def = VID.gen_def None var in
1222+
(* !!! *)
1223+
let ref_val = VID.gen_val None var in
1224+
(* !!! *)
1225+
let cond = fresh_c_local "cond" in
1226+
let cond_def = cond ^ "_def" in
1227+
let cond_val = cond ^ "_val" in
1228+
pr "@;char %s;@;double %s;" cond_def cond_val;
1229+
pr "@;%s = 1;" ref_def;
1230+
pr "@;%s = (double)%s;" ref_val cpt_j;
1231+
generate_expr_with_res_in p dgfip_flags oc cond_def cond_val expr;
1232+
pr "@;@[<v 2>if (%s && %s != 0.0) {" cond_def cond_val;
1233+
pr "@;%s[%s] = irdata->events[%s];" events_tmp cpt_i cpt_j;
1234+
pr "@;%s++;" cpt_i;
1235+
pr "@]@;}";
1236+
pr "@;%s++;" cpt_j;
1237+
pr "@]@;}";
1238+
pr "@;irdata->events = %s;" events_tmp;
1239+
pr "@;irdata->nb_events = %s;" cpt_i
1240+
| None ->
1241+
fun () ->
1242+
pr "@;@[<v 2>while (%s < %s) {" cpt_i nb_events_sav;
1243+
pr "@;%s[%s] = irdata->events[%s];" events_tmp cpt_i cpt_i;
1244+
pr "@;%s++;" cpt_i;
1245+
pr "@]@;}";
1246+
pr "@;irdata->events = %s;" events_tmp;
1247+
pr "@;irdata->nb_events = %s;" cpt_i
1248+
in
1249+
let sort_printer =
1250+
match sort with
1251+
| Some (var0, var1, expr) ->
1252+
fun () ->
1253+
pr "@;/* merge sort */";
1254+
pr "@;@[<v 2>{";
1255+
pr "@;int aBeg = %s;" nb_add;
1256+
pr "@;int aEnd = irdata->nb_events;";
1257+
pr
1258+
"@;\
1259+
T_event **b = (T_event **)malloc(irdata->nb_events * (sizeof \
1260+
(T_event *)));";
1261+
pr "@;int width;";
1262+
pr "@;int iLeft;";
1263+
pr "@;int i;";
1264+
pr
1265+
"@;\
1266+
@[<v 2>@[<hov 2>for (width = 1;@ width < aEnd;@ width = 2 * \
1267+
width) {@]";
1268+
pr
1269+
"@;\
1270+
@[<v 2>@[<hov 2>for (iLeft = aBeg;@ iLeft < aEnd;@ iLeft = \
1271+
iLeft + 2 * width) {@]";
1272+
pr "@;int iRight = iLeft + width;";
1273+
pr "@;int iEnd = iLeft + 2 * width;";
1274+
pr "@;if (iRight > aEnd) iRight = aEnd;";
1275+
pr "@;if (iEnd > aEnd) iEnd = aEnd;";
1276+
pr "@;@[<v 2>{";
1277+
pr "@;int i = iLeft;";
1278+
pr "@;int j = iRight;";
1279+
pr "@;int k;";
1280+
pr "@;@[<v 2>@[<hov 2>for (k = iLeft;@ k < iEnd;@ k++) {@]";
1281+
pr "@;int cpt = 0;";
1282+
pr "@;@[<v 2>{";
1283+
(* Comparaison *)
1284+
let ref0_def = VID.gen_def None var0 in
1285+
(* !!! *)
1286+
let ref0_val = VID.gen_val None var0 in
1287+
(* !!! *)
1288+
let ref1_def = VID.gen_def None var1 in
1289+
(* !!! *)
1290+
let ref1_val = VID.gen_val None var1 in
1291+
(* !!! *)
1292+
let cmp_def = fresh_c_local "cmp_def" in
1293+
let cmp_val = fresh_c_local "cmp_val" in
1294+
pr "@;char %s;@;double %s;" cmp_def cmp_val;
1295+
pr "@;%s = 1;" ref0_def;
1296+
pr "@;%s = (double)i;" ref0_val;
1297+
pr "@;%s = 1;" ref1_def;
1298+
pr "@;%s = (double)j;" ref1_val;
1299+
generate_expr_with_res_in p dgfip_flags oc cmp_def cmp_val expr;
1300+
pr "@;cpt = %s && %s != 0.0;" cmp_def cmp_val;
1301+
(* ----------- *)
1302+
pr "@]@;}";
1303+
pr "@;@[<v 2>if (i < iRight && (j >= iEnd || cpt)) {";
1304+
pr "@;b[k] = irdata->events[i];";
1305+
pr "@;i = i + 1;";
1306+
pr "@]@;@;@[<v 2>} else {";
1307+
pr "@;b[k] = irdata->events[j];";
1308+
pr "@;j = j + 1;";
1309+
pr "@]@;}";
1310+
pr "@]@;}";
1311+
pr "@]@;}";
1312+
pr "@]@;}";
1313+
pr "@;@[<v 2>@[<hov 2>for (i = aBeg;@ i < aEnd;@ i++) {@]";
1314+
pr "@;irdata->events[i] = b[i];";
1315+
pr "@]@;}";
1316+
pr "@]@;}";
1317+
pr "@;free(b);";
1318+
pr "@]@;}"
1319+
| None -> ignore
1320+
in
1321+
let finalize () =
1322+
pr "%a" (generate_stmts dgfip_flags p) stmts;
1323+
pr "@;free(irdata->events);";
1324+
pr "@;irdata->events = %s;" events_sav;
1325+
pr "@;irdata->nb_events = %s;" nb_events_sav;
1326+
pr "@]@;}"
1327+
in
1328+
init ();
1329+
add_printer ();
1330+
filter_printer ();
1331+
sort_printer ();
1332+
finalize ()
13031333
| Restore (al, var_params, evts, evtfs, stmts) ->
13041334
pr "@;@[<v 2>{";
13051335
let rest_name = fresh_c_local "restore" in

0 commit comments

Comments
 (0)