Skip to content

Commit 7e181e4

Browse files
committed
Rewrite inline pass
- We are a lot more aggressive at inlining functor-like functions, since this may enable further optimizations. - We are more cautious at inlining nested functions, since this can result in memory leaks. - We inline a larger class of small functions
1 parent ba41754 commit 7e181e4

File tree

5 files changed

+577
-274
lines changed

5 files changed

+577
-274
lines changed

compiler/lib/config.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ module Param = struct
135135
p ~name:"switch_size" ~desc:"set the maximum number of case in a switch" (int 60)
136136

137137
let inlining_limit =
138-
p ~name:"inlining-limit" ~desc:"set the size limit for inlining" (int 200)
138+
p ~name:"inlining-limit" ~desc:"set the size limit for inlining" (int 150)
139139

140140
let tailcall_max_depth =
141141
p

compiler/lib/driver.ml

+13-9
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,12 @@ let deadcode p =
5454
let r, live_vars = deadcode' p in
5555
Deadcode.remove_empty_blocks ~live_vars r
5656

57-
let inline p =
57+
let inline aggressive p =
5858
if Config.Flag.inline () && Config.Flag.deadcode ()
5959
then (
6060
let p, live_vars = deadcode' p in
6161
if debug () then Format.eprintf "Inlining...@.";
62-
Inline.f p live_vars)
62+
Inline.f ~aggressive p live_vars)
6363
else p
6464

6565
let specialize_1 (p, info) =
@@ -158,42 +158,44 @@ let identity x = x
158158

159159
(* o1 *)
160160

161-
let o1 : 'a -> 'a =
161+
let round opt : 'a -> 'a =
162162
print
163163
+> tailcall
164164
+> flow_simple (* flow simple to keep information for future tailcall opt *)
165165
+> specialize'
166166
+> eval
167-
+> inline (* inlining may reveal new tailcall opt *)
167+
+> inline opt (* inlining may reveal new tailcall opt *)
168168
+> deadcode
169169
+> tailcall
170170
+> phi
171171
+> flow
172172
+> specialize'
173173
+> eval
174-
+> inline
174+
+> inline opt
175175
+> deadcode
176176
+> print
177177
+> flow
178178
+> specialize'
179179
+> eval
180-
+> inline
180+
+> inline opt
181181
+> deadcode
182182
+> phi
183183
+> flow
184184
+> specialize
185185
+> identity
186186

187+
let o1 = round false
188+
187189
(* o2 *)
188190

189-
let o2 : 'a -> 'a = loop 10 "o1" o1 1 +> print
191+
let o2 : 'a -> 'a = loop 10 "o1" (round true) 1 +> print
190192

191193
(* o3 *)
192194

193195
let round1 : 'a -> 'a =
194196
print
195197
+> tailcall
196-
+> inline (* inlining may reveal new tailcall opt *)
198+
+> inline false (* inlining may reveal new tailcall opt *)
197199
+> deadcode (* deadcode required before flow simple -> provided by constant *)
198200
+> flow_simple (* flow simple to keep information for future tailcall opt *)
199201
+> specialize'
@@ -452,7 +454,9 @@ let check_js js =
452454
Javascript.IdentSet.fold
453455
(fun x acc ->
454456
match x with
455-
| V _ -> assert false
457+
| V y ->
458+
Format.eprintf "ZZZ %a@." Code.Var.print y;
459+
assert false
456460
| S { name = Utf8 x; _ } -> StringSet.add x acc)
457461
free
458462
StringSet.empty

0 commit comments

Comments
 (0)