-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinlining.sml
36 lines (33 loc) · 1.2 KB
/
inlining.sml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
functor InliningFun (P : sig val threshold : int end) = struct
open P
open Cps
(* inlinings *)
fun termInlining env (t as CONST _) = t
| termInlining env (t as VAR _) = t
| termInlining env (ABS (xs, e)) =
ABS (xs, expInlining env e)
| termInlining env (t as PRIM _) = t
| termInlining env (t as TUPLE _) = t
| termInlining env (t as PROJ _) = t
and expInlining env (t as APP (x, ys)) =
(case Env.find (env, x) of
SOME (ABS (ys', e)) =>
Alpha.alphaConversion (Env.fromList (ListPair.zipEq (ys', ys))) e
| _ => t)
| expInlining env (LET_REC (bindings, e)) =
let
val env' = Env.insertList (env,
List.mapPartial (fn (x, t) =>
if
termSize t <= threshold
andalso not (IdSet.member (termFreeVar t, x))
then SOME (x, t)
else NONE) bindings)
val bindings' = map (fn (x, t) => (x, termInlining env' t)) bindings
in
LET_REC (bindings', expInlining env' e)
end
| expInlining env (IF (x, e1, e2)) =
IF (x, expInlining env e1, expInlining env e2)
val inlining = expInlining Env.empty
end