@@ -94,41 +94,44 @@ module Var_SCC = Strongly_connected_components.Make (Var)
94
94
let visit_closures p ~live_vars f acc =
95
95
let closures = collect_closures p in
96
96
let deps = collect_deps p closures in
97
- let scc = Var_SCC. connected_components_sorted_from_roots_to_leaf deps in
98
- let f' recursive acc g =
97
+ let f' ~recursive acc g =
99
98
let params, cont, enclosing_function = Var.Hashtbl. find closures g in
100
99
f ~recursive ~enclosing_function ~current_function: (Some g) ~params ~cont acc
101
100
in
102
- let acc =
101
+ let rec visit ~recursive deps acc =
102
+ let scc = Var_SCC. connected_components_sorted_from_roots_to_leaf deps in
103
103
Array. fold_left
104
104
scc
105
105
~f: (fun acc group ->
106
106
match group with
107
- | Var_SCC. No_loop g -> f' false acc g
107
+ | Var_SCC. No_loop g -> f' ~recursive acc g
108
108
| Has_loop l ->
109
109
let set = Var.Set. of_list l in
110
110
let deps' =
111
111
List. fold_left
112
112
~f: (fun deps' g ->
113
113
Var.Map. add
114
114
g
115
- (if live_vars.(Var. idx g) > 1
116
- then Var.Set. empty
117
- else Var.Set. inter (Var.Map. find g deps) set)
115
+ (Var.Set. inter
116
+ (if recursive || live_vars.(Var. idx g) > 1
117
+ then
118
+ (* Make sure that inner closures are
119
+ processed before their enclosing
120
+ closure *)
121
+ let _, _, enclosing = Var.Hashtbl. find closures g in
122
+ match enclosing with
123
+ | None -> Var.Set. empty
124
+ | Some enclosing -> Var.Set. singleton enclosing
125
+ else Var.Map. find g deps)
126
+ set)
118
127
deps')
119
128
~init: Var.Map. empty
120
129
l
121
130
in
122
- let scc = Var_SCC. connected_components_sorted_from_roots_to_leaf deps' in
123
- Array. fold_left
124
- scc
125
- ~f: (fun acc group ->
126
- match group with
127
- | Var_SCC. No_loop g -> f' true acc g
128
- | Has_loop l -> List. fold_left ~f: (fun acc g -> f' true acc g) ~init: acc l)
129
- ~init: acc)
131
+ visit ~recursive: true deps' acc)
130
132
~init: acc
131
133
in
134
+ let acc = visit ~recursive: false deps acc in
132
135
f
133
136
~recursive: false
134
137
~enclosing_function: None
0 commit comments