File tree Expand file tree Collapse file tree 2 files changed +18
-4
lines changed Expand file tree Collapse file tree 2 files changed +18
-4
lines changed Original file line number Diff line number Diff 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+
147155let 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 =
245253let 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;
Original file line number Diff line number Diff line change @@ -23,6 +23,12 @@ val iter_block_free_vars : (Code.Var.t -> unit) -> Code.block -> unit
2323
2424val 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+
2632val f_mutable : Code .program -> Code.Var.Set .t Code.Addr.Map .t
2733
2834val f : Code .program -> Code.Var.Set .t Code.Addr.Map .t
You can’t perform that action at this time.
0 commit comments