@@ -74,30 +74,51 @@ let rewrite_body unboxed_refs body ref_contents subst =
74
74
in
75
75
ref_contents, subst, List. rev l
76
76
77
- let rewrite_cont relevant_vars vars (pc' , args ) =
77
+ let rewrite_cont relevant_vars ref_contents (pc' , args ) =
78
78
let refs, _ = Int.Hashtbl. find relevant_vars pc' in
79
- let vars = Var.Map. filter (fun x _ -> Var.Set. mem x refs) vars in
79
+ let vars = Var.Map. filter (fun x _ -> Var.Set. mem x refs) ref_contents in
80
80
pc', List. map ~f: snd (Var.Map. bindings vars) @ args
81
81
82
- let rewrite_function p variables pc subst =
83
- let relevant_vars = Int.Hashtbl. create 16 in
82
+ let rewrite_branch relevant_vars ref_contents branch =
83
+ match branch with
84
+ | Return _ | Raise _ | Stop -> branch
85
+ | Branch cont -> Branch (rewrite_cont relevant_vars ref_contents cont)
86
+ | Cond (x , cont , cont' ) ->
87
+ Cond
88
+ ( x
89
+ , rewrite_cont relevant_vars ref_contents cont
90
+ , rewrite_cont relevant_vars ref_contents cont' )
91
+ | Switch (x , a ) ->
92
+ Switch (x, Array. map ~f: (fun cont -> rewrite_cont relevant_vars ref_contents cont) a)
93
+ | Pushtrap (cont , x , cont' ) ->
94
+ Pushtrap
95
+ ( rewrite_cont relevant_vars ref_contents cont
96
+ , x
97
+ , rewrite_cont relevant_vars ref_contents cont' )
98
+ | Poptrap cont -> Poptrap (rewrite_cont relevant_vars ref_contents cont)
99
+
100
+ let rewrite_function p ~unboxed_refs pc subst =
84
101
let g = Structure. (dominator_tree (build_graph p.blocks pc)) in
85
- let rec traverse_tree g pc refs =
86
- let block = Addr.Map. find pc p.blocks in
87
- let refs' =
88
- List. fold_left
89
- ~f: (fun s i ->
90
- match i with
91
- | Let (x, Block (0 , [| _ |], (NotArray | Unknown ), Maybe_mutable ))
92
- when Var.Hashtbl. mem variables x -> Var.Set. add x s
93
- | _ -> s)
94
- ~init: refs
95
- block.body
102
+ let relevant_vars =
103
+ let relevant_vars = Int.Hashtbl. create 16 in
104
+ let rec traverse_tree g pc refs =
105
+ let block = Addr.Map. find pc p.blocks in
106
+ let refs' =
107
+ List. fold_left
108
+ ~f: (fun s i ->
109
+ match i with
110
+ | Let (x, Block (0 , [| _ |], (NotArray | Unknown ), Maybe_mutable ))
111
+ when Var.Hashtbl. mem unboxed_refs x -> Var.Set. add x s
112
+ | _ -> s)
113
+ ~init: refs
114
+ block.body
115
+ in
116
+ Int.Hashtbl. add relevant_vars pc (refs, refs');
117
+ Addr.Set. iter (fun pc' -> traverse_tree g pc' refs') (Structure. get_edges g pc)
96
118
in
97
- Int.Hashtbl. add relevant_vars pc (refs, refs') ;
98
- Addr.Set. iter ( fun pc' -> traverse_tree g pc' refs') ( Structure. get_edges g pc)
119
+ traverse_tree g pc Var.Set. empty ;
120
+ relevant_vars
99
121
in
100
- traverse_tree g pc Var.Set. empty;
101
122
let rec traverse_tree ' g pc blocks subst =
102
123
let block = Addr.Map. find pc p.blocks in
103
124
let refs, refs' = Int.Hashtbl. find relevant_vars pc in
@@ -106,25 +127,7 @@ let rewrite_function p variables pc subst =
106
127
in
107
128
let params = List. map ~f: snd (Var.Map. bindings ref_contents) @ block.params in
108
129
let ref_contents, subst, body = rewrite_body refs' block.body ref_contents subst in
109
- let branch =
110
- match block.branch with
111
- | Return _ | Raise _ | Stop -> block.branch
112
- | Branch cont -> Branch (rewrite_cont relevant_vars ref_contents cont)
113
- | Cond (x , cont , cont' ) ->
114
- Cond
115
- ( x
116
- , rewrite_cont relevant_vars ref_contents cont
117
- , rewrite_cont relevant_vars ref_contents cont' )
118
- | Switch (x , a ) ->
119
- Switch
120
- (x, Array. map ~f: (fun cont -> rewrite_cont relevant_vars ref_contents cont) a)
121
- | Pushtrap (cont , x , cont' ) ->
122
- Pushtrap
123
- ( rewrite_cont relevant_vars ref_contents cont
124
- , x
125
- , rewrite_cont relevant_vars ref_contents cont' )
126
- | Poptrap cont -> Poptrap (rewrite_cont relevant_vars ref_contents cont)
127
- in
130
+ let branch = rewrite_branch relevant_vars ref_contents block.branch in
128
131
let blocks = Addr.Map. add pc { params; body; branch } blocks in
129
132
Addr.Set. fold
130
133
(fun pc' (blocks , subst ) -> traverse_tree' g pc' blocks subst)
@@ -212,7 +215,7 @@ let f p =
212
215
in
213
216
let p, subst =
214
217
Addr.Set. fold
215
- (fun pc (p , subst ) -> rewrite_function p candidates pc subst)
218
+ (fun pc (p , subst ) -> rewrite_function p ~unboxed_refs: candidates pc subst)
216
219
functions
217
220
(p, Var.Map. empty)
218
221
in
0 commit comments