Skip to content

Commit 2cbaae8

Browse files
authored
chore(compiler): Port Anf_utils.anf_count_vars to use record (#1365)
1 parent 7c8fa31 commit 2cbaae8

File tree

3 files changed

+69
-35
lines changed

3 files changed

+69
-35
lines changed

compiler/src/codegen/transl_anf.re

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -619,13 +619,13 @@ let compile_lambda =
619619
};
620620
let args = List.map(((_, ty)) => ty, new_args);
621621
let arity = List.length(args);
622-
let (
622+
let {
623623
stack_size_ptr,
624624
stack_size_i32,
625625
stack_size_i64,
626626
stack_size_f32,
627627
stack_size_f64,
628-
) =
628+
}: Anf_utils.stack_size =
629629
Anf_utils.anf_count_vars(body);
630630
let lam_env = {
631631
ce_binds: arg_binds,
@@ -1441,13 +1441,13 @@ let transl_anf_program =
14411441

14421442
set_global_imports(env.ce_binds);
14431443

1444-
let (
1444+
let {
14451445
stack_size_ptr,
14461446
stack_size_i32,
14471447
stack_size_i64,
14481448
stack_size_f32,
14491449
stack_size_f64,
1450-
) =
1450+
}: Anf_utils.stack_size =
14511451
Anf_utils.anf_count_vars(anf_prog.body);
14521452
let main_body_stack_size = {
14531453
stack_size_ptr,

compiler/src/middle_end/anf_utils.re

Lines changed: 55 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -161,28 +161,43 @@ let anf_free_vars = anf_free_vars_help(Ident.Set.empty);
161161
let comp_free_vars = comp_free_vars_help(Ident.Set.empty);
162162
let imm_free_vars = imm_free_vars_help(Ident.Set.empty);
163163

164-
let tuple_max = ((a1, a2, a3, a4, a5), (b1, b2, b3, b4, b5)) => (
165-
max(a1, b1),
166-
max(a2, b2),
167-
max(a3, b3),
168-
max(a4, b4),
169-
max(a5, b5),
170-
);
171-
let tuple_add = ((a1, a2, a3, a4, a5), (b1, b2, b3, b4, b5)) => (
172-
a1 + b1,
173-
a2 + b2,
174-
a3 + b3,
175-
a4 + b4,
176-
a5 + b5,
177-
);
178-
179-
let tuple_zero = (0, 0, 0, 0, 0);
164+
type stack_size = {
165+
stack_size_ptr: int,
166+
stack_size_i32: int,
167+
stack_size_i64: int,
168+
stack_size_f32: int,
169+
stack_size_f64: int,
170+
};
171+
172+
let stack_size_max = (a, b) => {
173+
stack_size_ptr: max(a.stack_size_ptr, b.stack_size_ptr),
174+
stack_size_i32: max(a.stack_size_i32, b.stack_size_i32),
175+
stack_size_i64: max(a.stack_size_i64, b.stack_size_i64),
176+
stack_size_f32: max(a.stack_size_f32, b.stack_size_f32),
177+
stack_size_f64: max(a.stack_size_f64, b.stack_size_f64),
178+
};
179+
180+
let stack_size_add = (a, b) => {
181+
stack_size_ptr: a.stack_size_ptr + b.stack_size_ptr,
182+
stack_size_i32: a.stack_size_i32 + b.stack_size_i32,
183+
stack_size_i64: a.stack_size_i64 + b.stack_size_i64,
184+
stack_size_f32: a.stack_size_f32 + b.stack_size_f32,
185+
stack_size_f64: a.stack_size_f64 + b.stack_size_f64,
186+
};
187+
188+
let initial_stack_size = {
189+
stack_size_ptr: 0,
190+
stack_size_i32: 0,
191+
stack_size_i64: 0,
192+
stack_size_f32: 0,
193+
stack_size_f64: 0,
194+
};
180195

181196
let rec anf_count_vars = a =>
182197
switch (a.anf_desc) {
183198
| AELet(global, recflag, mutflag, binds, body) =>
184199
let max_binds =
185-
List.fold_left(tuple_max, tuple_zero) @@
200+
List.fold_left(stack_size_max, initial_stack_size) @@
186201
List.map(((_, c)) => comp_count_vars(c), binds);
187202
let rec count_binds = (ptr, i32, i64, f32, f64, binds) => {
188203
switch (global, binds) {
@@ -197,37 +212,48 @@ let rec anf_count_vars = a =>
197212
count_binds(ptr, i32, i64, f32 + 1, f64, rest)
198213
| (_, [(_, {comp_allocation_type: Unmanaged(WasmF64)}), ...rest]) =>
199214
count_binds(ptr, i32, i64, f32, f64 + 1, rest)
200-
| (_, []) => (ptr, i32, i64, f32, f64)
215+
| (_, []) => {
216+
stack_size_ptr: ptr,
217+
stack_size_i32: i32,
218+
stack_size_i64: i64,
219+
stack_size_f32: f32,
220+
stack_size_f64: f64,
221+
}
201222
};
202223
};
203224
switch (recflag) {
204225
| Recursive =>
205-
tuple_add(
226+
stack_size_add(
206227
count_binds(0, 0, 0, 0, 0, binds),
207-
tuple_max(max_binds, anf_count_vars(body)),
228+
stack_size_max(max_binds, anf_count_vars(body)),
208229
)
209230
| Nonrecursive =>
210-
tuple_max(
231+
stack_size_max(
211232
max_binds,
212-
tuple_add(count_binds(0, 0, 0, 0, 0, binds), anf_count_vars(body)),
233+
stack_size_add(
234+
count_binds(0, 0, 0, 0, 0, binds),
235+
anf_count_vars(body),
236+
),
213237
)
214238
};
215-
| AESeq(hd, tl) => tuple_max(comp_count_vars(hd), anf_count_vars(tl))
239+
| AESeq(hd, tl) =>
240+
stack_size_max(comp_count_vars(hd), anf_count_vars(tl))
216241
| AEComp(c) => comp_count_vars(c)
217242
}
218243

219244
and comp_count_vars = c =>
220245
switch (c.comp_desc) {
221-
| CIf(_, t, f) => tuple_max(anf_count_vars(t), anf_count_vars(f))
246+
| CIf(_, t, f) => stack_size_max(anf_count_vars(t), anf_count_vars(f))
222247
| CFor(c, inc, b) =>
223-
let c = Option.fold(~none=tuple_zero, ~some=anf_count_vars, c);
224-
let inc = Option.fold(~none=tuple_zero, ~some=anf_count_vars, inc);
248+
let c = Option.fold(~none=initial_stack_size, ~some=anf_count_vars, c);
249+
let inc =
250+
Option.fold(~none=initial_stack_size, ~some=anf_count_vars, inc);
225251
let b = anf_count_vars(b);
226-
tuple_add(c, tuple_add(inc, b));
252+
stack_size_add(c, stack_size_add(inc, b));
227253
| CSwitch(_, bs, _) =>
228-
List.fold_left(tuple_max, tuple_zero) @@
254+
List.fold_left(stack_size_max, initial_stack_size) @@
229255
List.map(((_, b)) => anf_count_vars(b), bs)
230-
| _ => tuple_zero
256+
| _ => initial_stack_size
231257
};
232258

233259
module ClearLocationsArg: Anf_mapper.MapArgument = {

compiler/src/middle_end/anf_utils.rei

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,15 @@ let anf_free_vars: anf_expression => Ident.Set.t;
55
let comp_free_vars: comp_expression => Ident.Set.t;
66
let imm_free_vars: imm_expression => Ident.Set.t;
77

8-
let anf_count_vars: anf_expression => (int, int, int, int, int);
9-
let comp_count_vars: comp_expression => (int, int, int, int, int);
8+
type stack_size = {
9+
stack_size_ptr: int,
10+
stack_size_i32: int,
11+
stack_size_i64: int,
12+
stack_size_f32: int,
13+
stack_size_f64: int,
14+
};
15+
16+
let anf_count_vars: anf_expression => stack_size;
17+
let comp_count_vars: comp_expression => stack_size;
1018

1119
let clear_locations: anf_program => anf_program;

0 commit comments

Comments
 (0)