Skip to content

Commit c56e156

Browse files
committed
WIP
1 parent 6bf4444 commit c56e156

File tree

8 files changed

+69
-88
lines changed

8 files changed

+69
-88
lines changed

compiler/lib-wasm/closure_conversion.ml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ let collect_free_vars program var_depth depth pc closures =
6060
Code.preorder_traverse
6161
{ fold = Code.fold_children }
6262
(fun pc () ->
63-
let block = Code.Addr.Map.find pc program.blocks in
63+
let block = Code.block pc program in
6464
Freevars.iter_block_free_vars add_if_free_variable block;
6565
List.iter block.body ~f:(fun i ->
6666
match i with
@@ -71,7 +71,7 @@ let collect_free_vars program var_depth depth pc closures =
7171
| Some _ | None -> ())
7272
| _ -> ()))
7373
pc
74-
program.blocks
74+
(Code.blocks program)
7575
();
7676
!vars
7777

@@ -87,7 +87,7 @@ let rec traverse var_depth closures program pc depth =
8787
Code.preorder_traverse
8888
{ fold = Code.fold_children }
8989
(fun pc (program : Code.program) ->
90-
let block = Code.Addr.Map.find pc program.blocks in
90+
let block = Code.block pc program in
9191
mark_bound_variables var_depth block depth;
9292
let program =
9393
List.fold_left
@@ -151,16 +151,16 @@ let rec traverse var_depth closures program pc depth =
151151
in
152152
List.concat (List.rev (Array.to_list l)))
153153
in
154-
{ program with blocks = Code.Addr.Map.add pc { block with body } program.blocks })
154+
Code.add_block pc { block with body } program)
155155
pc
156-
program.blocks
156+
(Code.blocks program)
157157
program
158158

159159
let f p =
160160
let t = Timer.make () in
161161
let nv = Var.count () in
162162
let var_depth = Array.make nv (-1) in
163163
let closures = ref Var.Map.empty in
164-
let p = traverse var_depth closures p p.start 0 in
164+
let p = traverse var_depth closures p (Code.start p) 0 in
165165
if Debug.find "times" () then Format.eprintf " closure conversion: %a@." Timer.print t;
166166
p, !closures

compiler/lib-wasm/generate.ml

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -830,7 +830,7 @@ module Generate (Target : Target_sig.S) = struct
830830
Code.traverse
831831
{ fold = fold_children_skip_try_body }
832832
(fun pc n ->
833-
let block = Addr.Map.find pc p.blocks in
833+
let block = Code.block pc p in
834834
List.fold_left
835835
~f:(fun n i ->
836836
match i with
@@ -863,7 +863,7 @@ module Generate (Target : Target_sig.S) = struct
863863
~init:n
864864
block.body)
865865
pc
866-
p.blocks
866+
(Code.blocks p)
867867
(false, false)
868868

869869
let wrap_with_handler needed pc handler ~result_typ ~fall_through ~context body =
@@ -1193,7 +1193,7 @@ module Generate (Target : Target_sig.S) = struct
11931193
{ live = live_vars
11941194
; in_cps
11951195
; deadcode_sentinal
1196-
; blocks = p.blocks
1196+
; blocks = Code.blocks p
11971197
; closures
11981198
; global_context
11991199
}
@@ -1275,16 +1275,12 @@ let fix_switch_branches p =
12751275
with
12761276
| Some x -> x
12771277
| None ->
1278-
let pc' = !p'.free_pc in
1278+
let pc' = Code.free_pc !p' in
12791279
p' :=
1280-
{ !p' with
1281-
blocks =
1282-
Addr.Map.add
1283-
pc'
1284-
{ params = []; body = []; branch = Branch cont }
1285-
!p'.blocks
1286-
; free_pc = pc' + 1
1287-
};
1280+
Code.add_block
1281+
pc'
1282+
{ params = []; body = []; branch = Branch cont }
1283+
!p';
12881284
updates := Addr.Map.add pc ((args, pc') :: l) !updates;
12891285
pc')
12901286
, [] ))
@@ -1295,7 +1291,7 @@ let fix_switch_branches p =
12951291
match block.branch with
12961292
| Switch (_, l) -> fix_branches l
12971293
| _ -> ())
1298-
p.blocks;
1294+
(Code.blocks p);
12991295
!p'
13001296

13011297
module G = Generate (Gc_target)

compiler/lib-wasm/globalize.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,13 +100,13 @@ let traverse_instruction st i =
100100
| Event _ -> st
101101

102102
let traverse_block p st pc =
103-
let b = Code.Addr.Map.find pc p.Code.blocks in
103+
let b = Code.block pc p in
104104
let st = List.fold_left ~f:(fun st x -> declare x st) ~init:st b.Code.params in
105105
List.fold_left ~f:(fun st i -> traverse_instruction st i) ~init:st b.Code.body
106106

107107
let f p g closures =
108108
let l = Structure.blocks_in_reverse_post_order g in
109-
let in_loop = Freevars.find_loops_in_closure p p.Code.start in
109+
let in_loop = Freevars.find_loops_in_closure p (Code.start p) in
110110
let st =
111111
List.fold_left
112112
~f:(fun st pc ->

compiler/lib/effects.ml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,28 +1082,28 @@ let split_blocks ~cps_needed (p : Code.program) =
10821082
&& Var.Set.mem x cps_needed
10831083
| _ -> false
10841084
in
1085-
let rec split (p : Code.program) pc block accu l branch =
1085+
let rec split (p : Code.program) free_pc pc block accu l branch =
10861086
match l with
10871087
| [] ->
10881088
let block = { block with body = List.rev accu } in
10891089
Code.add_block pc block p
10901090
| (Let (x, e) as i) :: r when is_split_point i r branch ->
1091-
let pc' = Code.free_pc p in
1091+
let pc' = free_pc in
10921092
let block' = { params = []; body = []; branch = block.branch } in
10931093
let block =
10941094
{ block with body = List.rev (Let (x, e) :: accu); branch = Branch (pc', []) }
10951095
in
10961096
let p = Code.add_block pc block p in
1097-
split p pc' block' [] r branch
1098-
| i :: r -> split p pc block (i :: accu) r branch
1097+
split p (free_pc + 1) pc' block' [] r branch
1098+
| i :: r -> split p free_pc pc block (i :: accu) r branch
10991099
in
11001100
let rec should_split l branch =
11011101
match l with
11021102
| [] -> false
11031103
| i :: r -> is_split_point i r branch || should_split r branch
11041104
in
11051105
if should_split block.body block.branch
1106-
then split p pc block [] block.body block.branch
1106+
then split p (Code.free_pc p) pc block [] block.body block.branch
11071107
else p
11081108
in
11091109
Addr.Map.fold split_block (Code.blocks p) p
@@ -1120,6 +1120,7 @@ let f ~flow_info ~live_vars p =
11201120
if double_translate ()
11211121
then (
11221122
let p, liftings = Lambda_lifting_simple.f ~to_lift:cps_needed p in
1123+
Code.invariant p;
11231124
let cps_needed =
11241125
Var.Set.map
11251126
(fun f -> try Subst.from_map liftings f with Not_found -> f)
@@ -1141,6 +1142,7 @@ let f ~flow_info ~live_vars p =
11411142
p, cps_needed
11421143
in
11431144
let p = split_blocks ~cps_needed p in
1145+
Code.invariant p;
11441146
let p, trampolined_calls, in_cps = cps_transform ~live_vars ~flow_info ~cps_needed p in
11451147
if Debug.find "times" () then Format.eprintf " effects: %a@." Timer.print t;
11461148
Code.invariant p;

compiler/lib/generate.ml

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1711,14 +1711,11 @@ and translate_instrs_rev (ctx : Ctx.t) loc expr_queue instrs acc_rev muts_map =
17111711
then ctx
17121712
else
17131713
let subst = Subst.from_map muts_map in
1714-
let p, _visited =
1715-
List.fold_left
1716-
pcs
1717-
~init:(ctx.blocks, Addr.Set.empty)
1718-
~f:(fun (blocks, visited) pc ->
1719-
Subst.Excluding_Binders.cont' subst pc blocks visited)
1714+
let p =
1715+
List.fold_left pcs ~init:(Code.program 0 ctx.blocks) ~f:(fun p pc ->
1716+
Subst.Excluding_Binders.cont subst pc p)
17201717
in
1721-
{ ctx with blocks = p }
1718+
{ ctx with blocks = Code.blocks p }
17221719
in
17231720
let vd kind = function
17241721
| [] -> []

compiler/lib/subst.ml

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,29 +70,29 @@ module Excluding_Binders = struct
7070
let blocks = Addr.Map.map (fun b -> block s b) (Code.blocks p) in
7171
Code.program (Code.start p) blocks
7272

73-
let rec cont' s pc blocks visited =
73+
let rec cont' s pc p visited =
7474
if Addr.Set.mem pc visited
75-
then blocks, visited
75+
then p, visited
7676
else
7777
let visited = Addr.Set.add pc visited in
78-
let b = Addr.Map.find pc blocks in
78+
let b = Code.block pc p in
7979
let b = block s b in
80-
let blocks = Addr.Map.add pc b blocks in
81-
let blocks, visited =
82-
List.fold_left b.body ~init:(blocks, visited) ~f:(fun (blocks, visited) instr ->
80+
let p = Code.add_block pc b p in
81+
let p, visited =
82+
List.fold_left b.body ~init:(p, visited) ~f:(fun (p, visited) instr ->
8383
match instr with
84-
| Let (_, Closure (_, (pc, _), _)) -> cont' s pc blocks visited
85-
| _ -> blocks, visited)
84+
| Let (_, Closure (_, (pc, _), _)) -> cont' s pc p visited
85+
| _ -> p, visited)
8686
in
8787
Code.fold_children
88-
blocks
88+
(Code.blocks p)
8989
pc
90-
(fun pc (blocks, visited) -> cont' s pc blocks visited)
91-
(blocks, visited)
90+
(fun pc (p, visited) -> cont' s pc p visited)
91+
(p, visited)
9292

9393
let cont s addr p =
94-
let blocks, _ = cont' s addr (Code.blocks p) Addr.Set.empty in
95-
Code.program (Code.start p) blocks
94+
let p, _ = cont' s addr p Addr.Set.empty in
95+
p
9696
end
9797

9898
(****)

compiler/lib/subst.mli

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,6 @@ module Excluding_Binders : sig
3737
val last : (Var.t -> Var.t) -> last -> last
3838

3939
val cont : (Var.t -> Var.t) -> int -> program -> program
40-
41-
val cont' :
42-
(Var.t -> Var.t)
43-
-> int
44-
-> block Addr.Map.t
45-
-> Addr.Set.t
46-
-> block Addr.Map.t * Addr.Set.t
4740
end
4841

4942
val from_array : Var.t array -> Var.t -> Var.t

compiler/lib/tailcall.ml

Lines changed: 28 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ let rec tail_call x f l =
4545
-> Some args
4646
| _ :: rem -> tail_call x f rem
4747

48-
let rewrite_block update_count (f, f_params, f_pc, used) pc blocks =
49-
let block = Addr.Map.find pc blocks in
48+
let rewrite_block update_count (f, f_params, f_pc, used) pc p =
49+
let block = Code.block pc p in
5050
match block.branch with
5151
| Return x -> (
5252
match tail_call x f block.body with
@@ -57,98 +57,91 @@ let rewrite_block update_count (f, f_params, f_pc, used) pc blocks =
5757
List.iter2 f_params f_args ~f:(fun p a -> Code.Var.propagate_name p a);
5858
used := true;
5959
Some
60-
(Addr.Map.add
60+
(Code.add_block
6161
pc
6262
{ params = block.params
6363
; body = remove_last block.body
6464
; branch = Branch (f_pc, f_args)
6565
}
66-
blocks))
66+
p))
6767
else None
6868
| None -> None)
6969
| _ -> None
7070

71-
let rec traverse update_count f pc visited blocks =
71+
let rec traverse update_count f pc visited p =
7272
if not (Addr.Set.mem pc visited)
7373
then
7474
let visited = Addr.Set.add pc visited in
75-
match rewrite_block update_count f pc blocks with
76-
| Some blocks ->
75+
match rewrite_block update_count f pc p with
76+
| Some p ->
7777
(* The block was rewritten with a branch to the top of the function.
7878
No need to visit children. *)
79-
visited, blocks
79+
visited, p
8080
| None ->
81-
let visited, blocks =
82-
Code.fold_children_skip_try_body
83-
blocks
84-
pc
85-
(fun pc (visited, blocks) ->
86-
let visited, blocks = traverse update_count f pc visited blocks in
87-
visited, blocks)
88-
(visited, blocks)
89-
in
90-
visited, blocks
91-
else visited, blocks
81+
Code.fold_children_skip_try_body
82+
(Code.blocks p)
83+
pc
84+
(fun pc (visited, p) -> traverse update_count f pc visited p)
85+
(visited, p)
86+
else visited, p
9287

9388
let f p =
9489
let previous_p = p in
9590
Code.invariant p;
96-
let free_pc = ref (Code.free_pc p) in
97-
let blocks = ref (Code.blocks p) in
91+
let p = ref p in
9892
let update_count = ref 0 in
9993
let t = Timer.make () in
10094
Addr.Map.iter
10195
(fun pc _ ->
102-
let block = Addr.Map.find pc !blocks in
96+
let block = Code.block pc !p in
10397
let rewrite_body = ref false in
10498
let body =
10599
List.map block.body ~f:(function
106100
| Let (f, Closure (params, (pc_head, args), cloc)) as i ->
107101
if List.equal ~eq:Code.Var.equal params args
108102
then (
109-
blocks :=
103+
p :=
110104
snd
111105
(traverse
112106
update_count
113107
(f, params, pc_head, ref false)
114108
pc_head
115109
Addr.Set.empty
116-
!blocks);
110+
!p);
117111
i)
118112
else
119-
let intermediate_pc = !free_pc in
113+
let intermediate_pc = Code.free_pc !p in
120114
let need_to_create_intermediate_block = ref false in
121-
blocks :=
115+
p :=
122116
snd
123117
(traverse
124118
update_count
125119
(f, params, intermediate_pc, need_to_create_intermediate_block)
126120
pc_head
127121
Addr.Set.empty
128-
!blocks);
122+
!p);
129123
if !need_to_create_intermediate_block
130124
then (
131-
incr free_pc;
132125
let new_params = List.map params ~f:Code.Var.fork in
133126
let body =
134127
(* duplicate the debug event before the loop header. *)
135-
match (Addr.Map.find pc_head !blocks).body with
128+
match (Code.block pc_head !p).body with
136129
| (Event _ as e) :: _ -> [ e ]
137130
| _ -> []
138131
in
139-
blocks :=
140-
Addr.Map.add
132+
p :=
133+
Code.add_block
141134
intermediate_pc
142135
{ params; body; branch = Branch (pc_head, args) }
143-
!blocks;
136+
!p;
144137
rewrite_body := true;
145138
Let (f, Closure (new_params, (intermediate_pc, new_params), cloc)))
146139
else i
147140
| i -> i)
148141
in
149-
if !rewrite_body then blocks := Addr.Map.add pc { block with body } !blocks)
150-
(Code.blocks p);
151-
let p = Code.program (Code.start p) !blocks in
142+
if !rewrite_body then p := Code.add_block pc { block with body } !p)
143+
(Code.blocks !p);
144+
let p = !p in
152145
if times () then Format.eprintf " tail calls: %a@." Timer.print t;
153146
if stats () then Format.eprintf "Stats - tail calls: %d optimizations@." !update_count;
154147
if debug_stats ()

0 commit comments

Comments
 (0)