summaryrefslogtreecommitdiff
path: root/src/mono_reduce.sml
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adam@chlipala.net>2012-09-19 18:01:22 -0400
committerGravatar Adam Chlipala <adam@chlipala.net>2012-09-19 18:01:22 -0400
commit9f704b8c6e17c96c440fb3168a91c0bdb5cb845f (patch)
tree77bfe5975c8ff044f67ec2c59dd4857883e7d91f /src/mono_reduce.sml
parentceeeb72da04265f1f12ee0e988aaba5dcb1c3060 (diff)
Paranoid inlining prevention for FFI types at the Core level; less paranoid inlining promotion for passive values at the Mono level
Diffstat (limited to 'src/mono_reduce.sml')
-rw-r--r--src/mono_reduce.sml26
1 files changed, 15 insertions, 11 deletions
diff --git a/src/mono_reduce.sml b/src/mono_reduce.sml
index c633bfce..71c87095 100644
--- a/src/mono_reduce.sml
+++ b/src/mono_reduce.sml
@@ -537,16 +537,20 @@ fun reduce file =
fun doLet (x, t, e', b) =
let
- val notValue = U.Exp.exists {typ = fn _ => false,
- exp = fn e =>
- case e of
- EPrim _ => false
- | ECon _ => false
- | ENone _ => false
- | ESome _ => false
- | ERecord _ => false
- | _ => true}
-
+ fun passive (e : exp) =
+ case #1 e of
+ EPrim _ => true
+ | ERel _ => true
+ | ENamed _ => true
+ | ECon (_, _, NONE) => true
+ | ECon (_, _, SOME e) => passive e
+ | ENone _ => true
+ | ESome (_, e) => passive e
+ | EFfi _ => true
+ | EAbs _ => true
+ | ERecord xets => List.all (passive o #2) xets
+ | EField (e, _) => passive e
+ | _ => false
fun doSub () =
let
@@ -626,7 +630,7 @@ fun reduce file =
else
e
end
- else if countFree 0 0 b > 1 andalso notValue e' then
+ else if countFree 0 0 b > 1 andalso not (passive e') then
e
else
trySub ()