Skip to content

Commit 42bde03

Browse files
committed
fixup! Reference unboxing
1 parent 8a69d95 commit 42bde03

File tree

3 files changed

+123
-113
lines changed

3 files changed

+123
-113
lines changed

compiler/lib/ref_unboxing.ml

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -37,41 +37,42 @@ let times = Debug.find "times"
3737

3838
let stats = Debug.find "stats"
3939

40-
let rewrite refs block m m' =
41-
let m, m', l =
40+
let rewrite_body unboxed_refs body ref_contents subst =
41+
let ref_contents, subst, l =
4242
List.fold_left
43-
~f:(fun (m, m', acc) i ->
43+
~f:(fun (ref_contents, subst, acc) i ->
4444
match i with
4545
| Let (x, Block (0, [| y |], (NotArray | Unknown), Maybe_mutable))
46-
when Var.Set.mem x refs -> Var.Map.add x y m, m', acc
47-
| Let (y, Field (x, 0, Non_float)) when Var.Map.mem x m ->
48-
(* Optimized away by Phisimpl *)
49-
m, Var.Map.add y (Var.Map.find x m) m', acc
50-
| Offset_ref (x, n) when Var.Map.mem x m ->
51-
let y = Var.fresh () in
52-
( Var.Map.add x y m
53-
, m'
46+
when Var.Set.mem x unboxed_refs -> Var.Map.add x y ref_contents, subst, acc
47+
| Let (y, Field (x, 0, Non_float)) when Var.Map.mem x ref_contents ->
48+
ref_contents, Var.Map.add y (Var.Map.find x ref_contents) subst, acc
49+
| Offset_ref (x, n) when Var.Map.mem x ref_contents ->
50+
let y = Var.fork x in
51+
( Var.Map.add x y ref_contents
52+
, subst
5453
, Let
5554
( y
5655
, Prim
5756
( Extern "%int_add"
58-
, [ Pv (Var.Map.find x m); Pc (Int (Targetint.of_int_exn n)) ] ) )
57+
, [ Pv (Var.Map.find x ref_contents)
58+
; Pc (Int (Targetint.of_int_exn n))
59+
] ) )
5960
:: acc )
60-
| Set_field (x, 0, Non_float, y) when Var.Map.mem x m ->
61-
Var.Map.add x y m, m', acc
61+
| Set_field (x, 0, Non_float, y) when Var.Map.mem x ref_contents ->
62+
Var.Map.add x y ref_contents, subst, acc
6263
| Event _ -> (
63-
( m
64-
, m'
64+
( ref_contents
65+
, subst
6566
, match acc with
6667
| Event _ :: prev ->
6768
(* Avoid consecutive events (keep just the last one) *)
6869
i :: prev
6970
| _ -> i :: acc ))
70-
| _ -> m, m', i :: acc)
71-
block.body
72-
~init:(m, m', [])
71+
| _ -> ref_contents, subst, i :: acc)
72+
body
73+
~init:(ref_contents, subst, [])
7374
in
74-
m, m', List.rev l
75+
ref_contents, subst, List.rev l
7576

7677
let rewrite_cont relevant_vars vars (pc', args) =
7778
let refs, _ = Int.Hashtbl.find relevant_vars pc' in
@@ -100,28 +101,29 @@ let rewrite_function p variables pc subst =
100101
let rec traverse_tree' g pc blocks subst =
101102
let block = Addr.Map.find pc p.blocks in
102103
let refs, refs' = Int.Hashtbl.find relevant_vars pc in
103-
let vars =
104+
let ref_contents =
104105
Var.Set.fold (fun x m -> Var.Map.add x (Var.fork x) m) refs Var.Map.empty
105106
in
106-
let params = List.map ~f:snd (Var.Map.bindings vars) @ block.params in
107-
let vars, subst, body = rewrite refs' block vars subst in
107+
let params = List.map ~f:snd (Var.Map.bindings ref_contents) @ block.params in
108+
let ref_contents, subst, body = rewrite_body refs' block.body ref_contents subst in
108109
let branch =
109110
match block.branch with
110111
| Return _ | Raise _ | Stop -> block.branch
111-
| Branch cont -> Branch (rewrite_cont relevant_vars vars cont)
112+
| Branch cont -> Branch (rewrite_cont relevant_vars ref_contents cont)
112113
| Cond (x, cont, cont') ->
113114
Cond
114115
( x
115-
, rewrite_cont relevant_vars vars cont
116-
, rewrite_cont relevant_vars vars cont' )
116+
, rewrite_cont relevant_vars ref_contents cont
117+
, rewrite_cont relevant_vars ref_contents cont' )
117118
| Switch (x, a) ->
118-
Switch (x, Array.map ~f:(fun cont -> rewrite_cont relevant_vars vars cont) a)
119+
Switch
120+
(x, Array.map ~f:(fun cont -> rewrite_cont relevant_vars ref_contents cont) a)
119121
| Pushtrap (cont, x, cont') ->
120122
Pushtrap
121-
( rewrite_cont relevant_vars vars cont
123+
( rewrite_cont relevant_vars ref_contents cont
122124
, x
123-
, rewrite_cont relevant_vars vars cont' )
124-
| Poptrap cont -> Poptrap (rewrite_cont relevant_vars vars cont)
125+
, rewrite_cont relevant_vars ref_contents cont' )
126+
| Poptrap cont -> Poptrap (rewrite_cont relevant_vars ref_contents cont)
125127
in
126128
let blocks = Addr.Map.add pc { params; body; branch } blocks in
127129
Addr.Set.fold

compiler/tests-compiler/loops.ml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -586,11 +586,12 @@ let () = print_endline (trim " ")
586586
for(;;){
587587
if(i >= len) break;
588588
if(! is_space(caml_bytes_unsafe_get(s$0, i))) break;
589-
i = i + 1 | 0;
589+
var i$0 = i + 1 | 0;
590+
i = i$0;
590591
}
591592
var j = len - 1 | 0;
592593
for(;;){
593-
if(i <= j && is_space(caml_bytes_unsafe_get(s$0, j))){j = j - 1 | 0; continue;}
594+
if(i <= j && is_space(caml_bytes_unsafe_get(s$0, j))){var j$0 = j - 1 | 0; j = j$0; continue;}
594595
a:
595596
{
596597
if(i <= j){

0 commit comments

Comments
 (0)