Skip to content

Commit 99e82e0

Browse files
vouillonOlivierNicole
authored andcommitted
Expose some functions from Freevars
1 parent b23b062 commit 99e82e0

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

compiler/lib/freevars.ml

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ type st =
100100
; mutable revisited : bool
101101
}
102102

103-
let find_loops p =
104-
let in_loop = ref Addr.Map.empty in
103+
let find_loops p in_loop pc =
104+
let in_loop = ref in_loop in
105105
let index = ref 0 in
106106
let state = ref Addr.Map.empty in
107107
let stack = Stack.create () in
@@ -141,9 +141,17 @@ let find_loops p =
141141
if st.revisited
142142
then List.iter !l ~f:(fun pc' -> in_loop := Addr.Map.add pc' pc !in_loop))
143143
in
144-
Code.fold_closures p (fun _ _ (pc, _) () -> traverse pc) ();
144+
traverse pc;
145145
!in_loop
146146

147+
let find_loops_in_closure p pc = find_loops p Addr.Map.empty pc
148+
149+
let find_all_loops p =
150+
Code.fold_closures
151+
p
152+
(fun _ _ (pc, _) (in_loop : _ Addr.Map.t) -> find_loops p in_loop pc)
153+
Addr.Map.empty
154+
147155
let mark_variables in_loop p =
148156
let vars = Var.Tbl.make () (-1) in
149157
let visited = BitSet.create' p.free_pc in
@@ -245,7 +253,7 @@ let f p =
245253
let f_mutable p =
246254
Code.invariant p;
247255
let t = Timer.make () in
248-
let in_loop = find_loops p in
256+
let in_loop = find_all_loops p in
249257
let vars = mark_variables in_loop p in
250258
let free_vars = free_variables vars in_loop p in
251259
if times () then Format.eprintf " free vars 1: %a@." Timer.print t;

compiler/lib/freevars.mli

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ val iter_block_free_vars : (Code.Var.t -> unit) -> Code.block -> unit
2323

2424
val iter_block_bound_vars : (Code.Var.t -> unit) -> Code.block -> unit
2525

26+
val iter_instr_free_vars : (Code.Var.t -> unit) -> Code.instr -> unit
27+
28+
val iter_last_free_var : (Code.Var.t -> unit) -> Code.last -> unit
29+
30+
val find_loops_in_closure : Code.program -> Code.Addr.t -> Code.Addr.t Code.Addr.Map.t
31+
2632
val f_mutable : Code.program -> Code.Var.Set.t Code.Addr.Map.t
2733

2834
val f : Code.program -> Code.Var.Set.t Code.Addr.Map.t

0 commit comments

Comments
 (0)