Skip to content

Commit 11e60a4

Browse files
committed
Loop now contains an inline record
It should now be easier to edit the code parts where Loop is transformed in a record.
1 parent ec7ec9c commit 11e60a4

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+667
-575
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,5 @@ observations.org
2828

2929
# Unit tests submodule
3030
unit_tests/
31+
32+
fix_all_params.ml

src/c_gen/nodes_to_c.ml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -177,15 +177,15 @@ let rec deqs_to_c (lift_env : int VarHashtbl.t)
177177
let m = Utils.get_type_m (Utils.get_var_type env_var v) in
178178
Format.sprintf "%s%s = %s;" tabs (var_to_c lift_env env v)
179179
(expr_to_c m lift_env env env_var e)
180-
| Loop (i, ei, ef, l, _) ->
180+
| Loop { id; start; stop; body; _ } ->
181181
Format.sprintf "%sfor (int %s = %s; %s <= %s; %s++) {\n%s\n%s}"
182182
tabs
183-
(rename (Ident.name i))
184-
(aexpr_to_c ei)
185-
(rename (Ident.name i))
186-
(aexpr_to_c ef)
187-
(rename (Ident.name i))
188-
(deqs_to_c lift_env env env_var ~tabs:(tabs ^ " ") l)
183+
(rename (Ident.name id))
184+
(aexpr_to_c start)
185+
(rename (Ident.name id))
186+
(aexpr_to_c stop)
187+
(rename (Ident.name id))
188+
(deqs_to_c lift_env env env_var ~tabs:(tabs ^ " ") body)
189189
tabs
190190
| _ ->
191191
Format.eprintf "%a@." (Usuba_print.pp_deq ()) deq;

src/c_gen/nodes_to_c_fdti.ml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -183,15 +183,15 @@ let rec deqs_to_c (lift_env : int VarHashtbl.t)
183183
Format.sprintf "%s%s;" tabs
184184
(expr_to_c_ret lift_env conf env env_var
185185
(var_to_c lift_env env v) e)
186-
| Loop (i, ei, ef, l, _) ->
186+
| Loop { id; start; stop; body; _ } ->
187187
Format.sprintf "%sfor (int %s = %s; %s <= %s; %s++) {\n%s\n%s}"
188188
tabs
189-
(rename (Ident.name i))
190-
(aexpr_to_c ei)
191-
(rename (Ident.name i))
192-
(aexpr_to_c ef)
193-
(rename (Ident.name i))
194-
(deqs_to_c lift_env env env_var l ~tabs:(tabs ^ " ") conf)
189+
(rename (Ident.name id))
190+
(aexpr_to_c start)
191+
(rename (Ident.name id))
192+
(aexpr_to_c stop)
193+
(rename (Ident.name id))
194+
(deqs_to_c lift_env env env_var body ~tabs:(tabs ^ " ") conf)
195195
tabs
196196
| _ ->
197197
Format.eprintf "%a@." (Usuba_print.pp_deq ()) deq;

src/c_gen/nodes_to_c_masked.ml

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -197,15 +197,16 @@ let rec deqs_to_c (env_const : bool Ident.Hashtbl.t)
197197
| _ ->
198198
Format.sprintf "%s%s;" tabs
199199
(expr_to_c_ret env_const lift_env env env_var v e))
200-
| Loop (i, ei, ef, l, _) ->
200+
| Loop { id; start; stop; body; _ } ->
201201
Format.sprintf "%sfor (int %s = %s; %s <= %s; %s++) {@.%s@.%s}"
202202
tabs
203-
(rename (Ident.name i))
204-
(aexpr_to_c ei)
205-
(rename (Ident.name i))
206-
(aexpr_to_c ef)
207-
(rename (Ident.name i))
208-
(deqs_to_c env_const lift_env env env_var ~tabs:(tabs ^ " ") l)
203+
(rename (Ident.name id))
204+
(aexpr_to_c start)
205+
(rename (Ident.name id))
206+
(aexpr_to_c stop)
207+
(rename (Ident.name id))
208+
(deqs_to_c env_const lift_env env env_var ~tabs:(tabs ^ " ")
209+
body)
209210
tabs
210211
| _ ->
211212
Format.eprintf "%a@." (Usuba_print.pp_deq ()) deq;

src/c_gen/nodes_to_c_ua_masked.ml

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -184,15 +184,15 @@ let rec deqs_to_c (lift_env : int VarHashtbl.t)
184184
| _ ->
185185
Format.sprintf "%s%s;" tabs
186186
(expr_to_c_ret lift_env env env_var v e))
187-
| Loop (i, ei, ef, l, _) ->
187+
| Loop { id; start; stop; body; _ } ->
188188
Format.sprintf "%sfor (int %s = %s; %s <= %s; %s++) {\n%s\n%s}"
189189
tabs
190-
(rename (Ident.name i))
191-
(aexpr_to_c ei)
192-
(rename (Ident.name i))
193-
(aexpr_to_c ef)
194-
(rename (Ident.name i))
195-
(deqs_to_c lift_env env env_var ~tabs:(tabs ^ " ") l)
190+
(rename (Ident.name id))
191+
(aexpr_to_c start)
192+
(rename (Ident.name id))
193+
(aexpr_to_c stop)
194+
(rename (Ident.name id))
195+
(deqs_to_c lift_env env env_var ~tabs:(tabs ^ " ") body)
196196
tabs
197197
| _ ->
198198
Format.eprintf "%a@." (Usuba_print.pp_deq ()) deq;

src/clear_origins.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ let rec clear_deqs (deqs : deq list) : deq list =
1919
content =
2020
(match d.content with
2121
| Eqn _ -> d.content
22-
| Loop (i, ei, ef, dl, opts) -> Loop (i, ei, ef, clear_deqs dl, opts));
22+
| Loop t -> Loop { t with body = clear_deqs t.body });
2323
})
2424
deqs
2525

src/normalization/clean.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ let clean_in_deqs (vars : p) (deqs : deq list) : p =
3636
| Eqn (l, e, _) ->
3737
List.iter (collect_var env) l;
3838
collect_expr env e
39-
| Loop (_, _, _, d, _) -> List.iter aux d
39+
| Loop { body; _ } -> List.iter aux body
4040
in
4141
List.iter aux deqs;
4242
List.sort_uniq compare_var_d

src/normalization/expand_array.ml

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -213,44 +213,47 @@ and expand_deqs env_var env_keep ?(env = Ident.Hashtbl.create 100)
213213
sync );
214214
};
215215
]
216-
| Loop (x, ei, ef, deqs, opts) ->
217-
Ident.Hashtbl.add env_var x Nat;
218-
Ident.Hashtbl.add env_it x true;
216+
| Loop t ->
217+
Ident.Hashtbl.add env_var t.id Nat;
218+
Ident.Hashtbl.add env_it t.id true;
219219
let res =
220220
(* STDLIB_IMPORT: List.mem of sum type *)
221-
if Stdlib.List.mem Unroll opts || force = Remove || unroll then
222-
do_unroll env_var env_keep env force unroll x ei ef deqs
221+
if Stdlib.List.mem Unroll t.opts || force = Remove || unroll then
222+
do_unroll env_var env_keep env force unroll t.id t.start t.stop
223+
t.body
223224
else
224225
try
225226
[
226227
{
227228
deq with
228229
content =
229230
Loop
230-
( x,
231-
ei,
232-
ef,
233-
expand_deqs env_var env_keep ~env ~env_it force unroll
234-
deqs,
235-
opts );
231+
{
232+
t with
233+
body =
234+
expand_deqs env_var env_keep ~env ~env_it force
235+
unroll t.body;
236+
};
236237
};
237238
]
238-
with Need_unroll id ->
239-
if Ident.equal id x then (
240-
try do_unroll env_var env_keep env force unroll x ei ef deqs
241-
with Need_unroll id2 ->
239+
with Need_unroll nu_id ->
240+
if Ident.equal t.id nu_id then (
241+
try
242+
do_unroll env_var env_keep env force unroll t.id t.start
243+
t.stop t.body
244+
with Need_unroll nu_id2 ->
242245
(* Unrolling failed and needs to unroll one level
243246
higher -> need to clean the environements. *)
244-
Ident.Hashtbl.remove env_var x;
245-
Ident.Hashtbl.remove env x;
246-
raise (Need_unroll id2))
247+
Ident.Hashtbl.remove env_var t.id;
248+
Ident.Hashtbl.remove env t.id;
249+
raise (Need_unroll nu_id2))
247250
else (
248251
(* Gonna update one loop above; need to clean the |env_var|. *)
249-
Ident.Hashtbl.remove env_var x;
252+
Ident.Hashtbl.remove env_var t.id;
250253
(* No need to clean |env| since |x| can's be in |env| here. *)
251-
raise (Need_unroll id))
254+
raise (Need_unroll nu_id))
252255
in
253-
Ident.Hashtbl.remove env_var x;
256+
Ident.Hashtbl.remove env_var t.id;
254257
res)
255258
deqs
256259

src/normalization/expand_parameters.ml

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -125,25 +125,27 @@ module Unroll = struct
125125
(match deq.content with
126126
| Eqn (lhs, e, sync) ->
127127
Eqn (List.map (unroll_var env_it) lhs, unroll_expr env_it e, sync)
128-
| Loop (i, ei, ef, dl, opts) ->
128+
| Loop t ->
129129
Loop
130-
( i,
131-
simpl_arith env_it ei,
132-
simpl_arith env_it ef,
133-
List.map (unroll_deq env_it) dl,
134-
opts ));
130+
{
131+
t with
132+
start = simpl_arith env_it t.start;
133+
stop = simpl_arith env_it t.stop;
134+
body = List.map (unroll_deq env_it) t.body;
135+
});
135136
}
136137

137-
(* |i|, |ei|, |ef| and |deqs| are from the loop being expanded,
138-
which should be like Loop(i, ei, ef, deqs, _)
138+
(* |id|, |start|, |stop| and |body| are from the loop being expanded,
139+
which should be like Loop {id; start; stop; body; _}
139140
*)
140-
let do_unroll (i : ident) (ei : int) (ef : int) (deqs : deq list) : deq list =
141+
let do_unroll (id : ident) (start : int) (stop : int) (body : deq list) :
142+
deq list =
141143
let env_it = Ident.Hashtbl.create 1 in
142144
flat_map
143145
(fun i_val ->
144-
Ident.Hashtbl.replace env_it i i_val;
145-
List.map (unroll_deq env_it) deqs)
146-
(gen_list_bounds ei ef)
146+
Ident.Hashtbl.replace env_it id i_val;
147+
List.map (unroll_deq env_it) body)
148+
(gen_list_bounds start stop)
147149
end
148150

149151
(* We need two functions to propagate the expansion into variables,
@@ -240,26 +242,27 @@ let rec propagate_deqs (expand_env : var list VarHashtbl.t) (deqs : deq list) :
240242
sync );
241243
};
242244
]
243-
| Loop (i, ei, ef, dl, opts) -> (
245+
| Loop t -> (
244246
try
245247
[
246248
{
247249
d with
248-
content = Loop (i, ei, ef, propagate_deqs expand_env dl, opts);
250+
content =
251+
Loop { t with body = propagate_deqs expand_env t.body };
249252
};
250253
]
251254
with Need_unroll ->
252255
(* raise one more Need_unroll if ei/ef can't be computed
253256
because they are in a nested loop and use surrounding
254257
loop variable *)
255-
let ei =
256-
try eval_arith_ne ei with Not_found -> raise Need_unroll
258+
let start =
259+
try eval_arith_ne t.start with Not_found -> raise Need_unroll
257260
in
258-
let ef =
259-
try eval_arith_ne ef with Not_found -> raise Need_unroll
261+
let stop =
262+
try eval_arith_ne t.stop with Not_found -> raise Need_unroll
260263
in
261264

262-
let new_eqns = Unroll.do_unroll i ei ef dl in
265+
let new_eqns = Unroll.do_unroll t.id start stop t.body in
263266
propagate_deqs expand_env new_eqns))
264267
deqs
265268

@@ -438,12 +441,12 @@ let rec expand_deq (env_fun : def Ident.Hashtbl.t)
438441
let args = match_args env_fun env_var f f.p_in args in
439442
let ret = match_ret env_fun env_var f f.p_out lhs in
440443
Eqn (ret, Fun (id, args), sync)
441-
| Loop (i, ei, ef, dl, opts) ->
442-
Ident.Hashtbl.add env_var i Nat;
444+
| Loop t ->
445+
Ident.Hashtbl.add env_var t.id Nat;
443446
let res =
444-
Loop (i, ei, ef, List.map (expand_deq env_fun env_var) dl, opts)
447+
Loop { t with body = List.map (expand_deq env_fun env_var) t.body }
445448
in
446-
Ident.Hashtbl.remove env_var i;
449+
Ident.Hashtbl.remove env_var t.id;
447450
res
448451
| _ -> deq.content);
449452
}

src/normalization/fix_dim.ml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -145,8 +145,8 @@ let rec dim_deq (v_tgt : var) (dim : int) (size : int) (deq : deq) : deq =
145145
( List.map (dim_var v_tgt dim size) vs,
146146
dim_expr v_tgt dim size e,
147147
sync )
148-
| Loop (i, ei, ef, dl, opts) ->
149-
Loop (i, ei, ef, List.map (dim_deq v_tgt dim size) dl, opts));
148+
| Loop t ->
149+
Loop { t with body = List.map (dim_deq v_tgt dim size) t.body });
150150
}
151151

152152
(* Merges the two innermost dimensions of |t|. For instance:
@@ -300,12 +300,12 @@ module Dir_params = struct
300300
(* A simple equation can't contain funcall -> ignore *)
301301
| Eqn (_, _, _) -> deq.content
302302
(* Reccursive call on loops *)
303-
| Loop (i, ei, ef, dl, opts) ->
304-
Ident.Hashtbl.add env_var i Nat;
303+
| Loop t ->
304+
Ident.Hashtbl.add env_var t.id Nat;
305305
let res =
306-
Loop (i, ei, ef, fix_deqs env_fun env_var def dl, opts)
306+
Loop { t with body = fix_deqs env_fun env_var def t.body }
307307
in
308-
Ident.Hashtbl.remove env_var i;
308+
Ident.Hashtbl.remove env_var t.id;
309309
res);
310310
})
311311
deqs
@@ -434,12 +434,12 @@ module Dir_inner = struct
434434
(* A simple equation can't contain funcall -> ignore *)
435435
| Eqn (_, _, _) -> deq.content
436436
(* Reccursive call on loops *)
437-
| Loop (i, ei, ef, dl, opts) ->
438-
Ident.Hashtbl.add env_var i Nat;
437+
| Loop t ->
438+
Ident.Hashtbl.add env_var t.id Nat;
439439
let res =
440-
Loop (i, ei, ef, fix_deqs env_fun env_var def dl, opts)
440+
Loop { t with body = fix_deqs env_fun env_var def t.body }
441441
in
442-
Ident.Hashtbl.remove env_var i;
442+
Ident.Hashtbl.remove env_var t.id;
443443
res);
444444
})
445445
deqs

0 commit comments

Comments
 (0)