@@ -480,6 +480,8 @@ let block pc p = Addr.Map.find pc p.blocks
480480
481481let add_block pc block p = { p with blocks = Addr.Map. add pc block p.blocks }
482482
483+ let remove_block pc p = { p with blocks = Addr.Map. remove pc p.blocks }
484+
483485let free_pc p =
484486 match Addr.Map. max_binding_opt p.blocks with
485487 | None -> p.start + 1
@@ -718,41 +720,41 @@ let is_empty p =
718720 | _ -> false )
719721 | _ -> false
720722
721- let poptraps blocks pc =
722- let rec loop blocks pc visited depth acc =
723+ let poptraps p pc =
724+ let rec loop p pc visited depth acc =
723725 if Addr.Set. mem pc visited
724726 then acc, visited
725727 else
726728 let visited = Addr.Set. add pc visited in
727- let block = Addr.Map. find pc blocks in
729+ let block = block pc p in
728730 match block.branch with
729731 | Return _ | Raise _ | Stop -> acc, visited
730- | Branch (pc' , _ ) -> loop blocks pc' visited depth acc
732+ | Branch (pc' , _ ) -> loop p pc' visited depth acc
731733 | Poptrap (pc' , _ ) ->
732734 if depth = 0
733735 then Addr.Set. add pc' acc, visited
734- else loop blocks pc' visited (depth - 1 ) acc
736+ else loop p pc' visited (depth - 1 ) acc
735737 | Pushtrap ((pc' , _ ), _ , (pc_h , _ )) ->
736- let acc, visited = loop blocks pc' visited (depth + 1 ) acc in
737- let acc, visited = loop blocks pc_h visited depth acc in
738+ let acc, visited = loop p pc' visited (depth + 1 ) acc in
739+ let acc, visited = loop p pc_h visited depth acc in
738740 acc, visited
739741 | Cond (_ , (pc1 , _ ), (pc2 , _ )) ->
740- let acc, visited = loop blocks pc1 visited depth acc in
741- let acc, visited = loop blocks pc2 visited depth acc in
742+ let acc, visited = loop p pc1 visited depth acc in
743+ let acc, visited = loop p pc2 visited depth acc in
742744 acc, visited
743745 | Switch (_ , a ) ->
744746 let acc, visited =
745747 Array. fold_right
746748 ~init: (acc, visited)
747- ~f: (fun (pc , _ ) (acc , visited ) -> loop blocks pc visited depth acc)
749+ ~f: (fun (pc , _ ) (acc , visited ) -> loop p pc visited depth acc)
748750 a
749751 in
750752 acc, visited
751753 in
752- loop blocks pc Addr.Set. empty 0 Addr.Set. empty |> fst
754+ loop p pc Addr.Set. empty 0 Addr.Set. empty |> fst
753755
754- let fold_children blocks pc f accu =
755- let block = Addr.Map. find pc blocks in
756+ let fold_children p pc f accu =
757+ let block = block pc p in
756758 match block.branch with
757759 | Return _ | Raise _ | Stop -> accu
758760 | Branch (pc' , _ ) | Poptrap (pc' , _ ) -> f pc' accu
@@ -768,13 +770,13 @@ let fold_children blocks pc f accu =
768770 let accu = Array. fold_right ~init: accu ~f: (fun (pc , _ ) accu -> f pc accu) a1 in
769771 accu
770772
771- let fold_children_skip_try_body blocks pc f accu =
772- let block = Addr.Map. find pc blocks in
773+ let fold_children_skip_try_body p pc f accu =
774+ let block = block pc p in
773775 match block.branch with
774776 | Return _ | Raise _ | Stop -> accu
775777 | Branch (pc' , _ ) | Poptrap (pc' , _ ) -> f pc' accu
776778 | Pushtrap ((pc' , _ ), _ , (pc_h , _ )) ->
777- let accu = Addr.Set. fold f (poptraps blocks pc') accu in
779+ let accu = Addr.Set. fold f (poptraps p pc') accu in
778780 let accu = f pc_h accu in
779781 accu
780782 | Cond (_ , (pc1 , _ ), (pc2 , _ )) ->
@@ -785,7 +787,7 @@ let fold_children_skip_try_body blocks pc f accu =
785787 let accu = Array. fold_right ~init: accu ~f: (fun (pc , _ ) accu -> f pc accu) a1 in
786788 accu
787789
788- type 'c fold_blocs = block Addr.Map .t -> Addr .t -> (Addr .t -> 'c -> 'c ) -> 'c -> 'c
790+ type 'c fold_blocs = program -> Addr .t -> (Addr .t -> 'c -> 'c ) -> 'c -> 'c
789791
790792type fold_blocs_poly = { fold : 'a . 'a fold_blocs } [@@ unboxed]
791793
@@ -825,43 +827,43 @@ let rec preorder_traverse' { fold } f pc visited blocks acc =
825827let preorder_traverse fold f pc blocks acc =
826828 snd (preorder_traverse' fold f pc Addr.Set. empty blocks acc)
827829
828- let fold_closures_innermost_first { start; blocks; _ } f accu =
829- let rec visit blocks pc f accu =
830+ let fold_closures_innermost_first p f accu =
831+ let rec visit p pc f accu =
830832 traverse
831833 { fold = fold_children }
832834 (fun pc accu ->
833- let block = Addr.Map. find pc blocks in
835+ let block = block pc p in
834836 List. fold_left block.body ~init: accu ~f: (fun accu i ->
835837 match i with
836838 | Let (x , Closure (params , cont , cloc )) ->
837- let accu = visit blocks (fst cont) f accu in
839+ let accu = visit p (fst cont) f accu in
838840 f (Some x) params cont cloc accu
839841 | _ -> accu))
840842 pc
841- blocks
843+ p
842844 accu
843845 in
844- let accu = visit blocks start f accu in
845- f None [] (start, [] ) None accu
846+ let accu = visit p p. start f accu in
847+ f None [] (p. start, [] ) None accu
846848
847- let fold_closures_outermost_first { start; blocks; _ } f accu =
848- let rec visit blocks pc f accu =
849+ let fold_closures_outermost_first p f accu =
850+ let rec visit p pc f accu =
849851 traverse
850852 { fold = fold_children }
851853 (fun pc accu ->
852- let block = Addr.Map. find pc blocks in
854+ let block = block pc p in
853855 List. fold_left block.body ~init: accu ~f: (fun accu i ->
854856 match i with
855857 | Let (x , Closure (params , cont , cloc )) ->
856858 let accu = f (Some x) params cont cloc accu in
857- visit blocks (fst cont) f accu
859+ visit p (fst cont) f accu
858860 | _ -> accu))
859861 pc
860- blocks
862+ p
861863 accu
862864 in
863- let accu = f None [] (start, [] ) None accu in
864- visit blocks start f accu
865+ let accu = f None [] (p. start, [] ) None accu in
866+ visit p p. start f accu
865867
866868let rec last_instr l =
867869 match l with
@@ -986,14 +988,14 @@ let used_blocks p =
986988 if not (BitSet. mem visited pc)
987989 then (
988990 BitSet. set visited pc;
989- let block = Addr.Map. find pc p.blocks in
991+ let block = block pc p in
990992 List. iter
991993 ~f: (fun i ->
992994 match i with
993995 | Let (_ , Closure (_ , (pc' , _ ), _ )) -> mark_used pc'
994996 | _ -> () )
995997 block.body;
996- fold_children p.blocks pc (fun pc' () -> mark_used pc') () )
998+ fold_children p pc (fun pc' () -> mark_used pc') () )
997999 in
9981000 mark_used p.start;
9991001 visited
0 commit comments