@@ -161,28 +161,43 @@ let anf_free_vars = anf_free_vars_help(Ident.Set.empty);
161161let comp_free_vars = comp_free_vars_help(Ident . Set . empty);
162162let 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
181196let 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
219244and 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
233259module ClearLocationsArg : Anf_mapper . MapArgument = {
0 commit comments