Skip to content

Commit 012c5e3

Browse files
committed
WIP
1 parent c56e156 commit 012c5e3

21 files changed

+196
-227
lines changed

compiler/lib-wasm/closure_conversion.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ let collect_free_vars program var_depth depth pc closures =
7171
| Some _ | None -> ())
7272
| _ -> ()))
7373
pc
74-
(Code.blocks program)
74+
program
7575
();
7676
!vars
7777

@@ -153,7 +153,7 @@ let rec traverse var_depth closures program pc depth =
153153
in
154154
Code.add_block pc { block with body } program)
155155
pc
156-
(Code.blocks program)
156+
program
157157
program
158158

159159
let f p =

compiler/lib-wasm/generate.ml

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ module Generate (Target : Target_sig.S) = struct
3636
{ live : int array
3737
; in_cps : Effects.in_cps
3838
; deadcode_sentinal : Var.t
39-
; blocks : block Addr.Map.t
39+
; p : program
4040
; closures : Closure_conversion.closure Var.Map.t
4141
; global_context : Code_generation.context
4242
}
@@ -863,7 +863,7 @@ module Generate (Target : Target_sig.S) = struct
863863
~init:n
864864
block.body)
865865
pc
866-
(Code.blocks p)
866+
p
867867
(false, false)
868868

869869
let wrap_with_handler needed pc handler ~result_typ ~fall_through ~context body =
@@ -914,18 +914,18 @@ module Generate (Target : Target_sig.S) = struct
914914
((pc, _) as cont)
915915
cloc
916916
acc =
917-
let g = Structure.build_graph ctx.blocks pc in
917+
let g = Structure.build_graph ctx.p pc in
918918
let dom = Structure.dominator_tree g in
919919
let rec translate_tree result_typ fall_through pc context =
920-
let block = Addr.Map.find pc ctx.blocks in
920+
let block = Code.block pc ctx.p in
921921
let keep_ouside pc' =
922922
match block.branch with
923923
| Switch _ -> true
924924
| Cond (_, (pc1, _), (pc2, _)) when pc' = pc1 && pc' = pc2 -> true
925925
| _ -> Structure.is_merge_node g pc'
926926
in
927927
let code ~context =
928-
let block = Addr.Map.find pc ctx.blocks in
928+
let block = Code.block pc ctx.p in
929929
let* () = translate_instrs ctx context block.body in
930930
translate_node_within
931931
~result_typ
@@ -960,7 +960,7 @@ module Generate (Target : Target_sig.S) = struct
960960
if
961961
(not (List.is_empty rem))
962962
||
963-
let block = Addr.Map.find pc ctx.blocks in
963+
let block = Code.block pc ctx.p in
964964
match block.branch with
965965
| Cond _ | Pushtrap _ -> false (*ZZZ also some Switch*)
966966
| _ -> true
@@ -970,7 +970,7 @@ module Generate (Target : Target_sig.S) = struct
970970
in
971971
translate_tree result_typ fall_through pc' context
972972
| [] -> (
973-
let block = Addr.Map.find pc ctx.blocks in
973+
let block = Code.block pc ctx.p in
974974
let branch = block.branch in
975975
match branch with
976976
| Branch cont -> translate_branch result_typ fall_through pc cont context
@@ -1028,7 +1028,7 @@ module Generate (Target : Target_sig.S) = struct
10281028
if List.is_empty args
10291029
then return ()
10301030
else
1031-
let block = Addr.Map.find dst ctx.blocks in
1031+
let block = Code.block dst ctx.p in
10321032
parallel_renaming block.params args
10331033
in
10341034
match fall_through with
@@ -1077,7 +1077,7 @@ module Generate (Target : Target_sig.S) = struct
10771077
~param_names
10781078
~body:
10791079
(let* () =
1080-
let block = Addr.Map.find pc ctx.blocks in
1080+
let block = Code.block pc ctx.p in
10811081
match block.body with
10821082
| Event start_loc :: _ -> event start_loc
10831083
| _ -> no_event
@@ -1190,13 +1190,7 @@ module Generate (Target : Target_sig.S) = struct
11901190
Code.Print.program (fun _ _ -> "") p;
11911191
*)
11921192
let ctx =
1193-
{ live = live_vars
1194-
; in_cps
1195-
; deadcode_sentinal
1196-
; blocks = Code.blocks p
1197-
; closures
1198-
; global_context
1199-
}
1193+
{ live = live_vars; in_cps; deadcode_sentinal; p; closures; global_context }
12001194
in
12011195
let toplevel_name = Var.fresh_n "toplevel" in
12021196
let functions =

compiler/lib/code.ml

Lines changed: 35 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,8 @@ let block pc p = Addr.Map.find pc p.blocks
480480

481481
let 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+
483485
let 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

790792
type fold_blocs_poly = { fold : 'a. 'a fold_blocs } [@@unboxed]
791793

@@ -825,43 +827,43 @@ let rec preorder_traverse' { fold } f pc visited blocks acc =
825827
let 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

866868
let 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

compiler/lib/code.mli

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,8 @@ val block : Addr.t -> program -> block
229229

230230
val add_block : Addr.t -> block -> program -> program
231231

232+
val remove_block : Addr.t -> program -> program
233+
232234
val program : Addr.t -> block Addr.Map.t -> program
233235

234236
val map_blocks : f:(block -> block) -> program -> program
@@ -257,7 +259,7 @@ module Print : sig
257259
val cont : Format.formatter -> cont -> unit
258260
end
259261

260-
type 'c fold_blocs = block Addr.Map.t -> Addr.t -> (Addr.t -> 'c -> 'c) -> 'c -> 'c
262+
type 'c fold_blocs = program -> Addr.t -> (Addr.t -> 'c -> 'c) -> 'c -> 'c
261263

262264
type fold_blocs_poly = { fold : 'a. 'a fold_blocs } [@@unboxed]
263265

@@ -298,13 +300,12 @@ val fold_children : 'c fold_blocs
298300

299301
val fold_children_skip_try_body : 'c fold_blocs
300302

301-
val poptraps : block Addr.Map.t -> Addr.t -> Addr.Set.t
303+
val poptraps : program -> Addr.t -> Addr.Set.t
302304

303-
val traverse :
304-
fold_blocs_poly -> (Addr.t -> 'c -> 'c) -> Addr.t -> block Addr.Map.t -> 'c -> 'c
305+
val traverse : fold_blocs_poly -> (Addr.t -> 'c -> 'c) -> Addr.t -> program -> 'c -> 'c
305306

306307
val preorder_traverse :
307-
fold_blocs_poly -> (Addr.t -> 'c -> 'c) -> Addr.t -> block Addr.Map.t -> 'c -> 'c
308+
fold_blocs_poly -> (Addr.t -> 'c -> 'c) -> Addr.t -> program -> 'c -> 'c
308309

309310
val last_instr : instr list -> instr option
310311
(** Last instruction of a block body, ignoring events *)

0 commit comments

Comments
 (0)