summaryrefslogtreecommitdiff
path: root/src/mono_reduce.sml
diff options
context:
space:
mode:
authorGravatar Adam Chlipala <adam@chlipala.net>2014-01-19 14:31:55 -0500
committerGravatar Adam Chlipala <adam@chlipala.net>2014-01-19 14:31:55 -0500
commit4063d1c5696438d73c0b15d7552e7717327e8ba1 (patch)
treed0e0d675ff55f71f0da9e88d49945c02832296c2 /src/mono_reduce.sml
parent80f6280f9d31faaa780747738d7d5a7c2e702aad (diff)
Make that purity analysis a bit more lax again
Diffstat (limited to 'src/mono_reduce.sml')
-rw-r--r--src/mono_reduce.sml12
1 files changed, 6 insertions, 6 deletions
diff --git a/src/mono_reduce.sml b/src/mono_reduce.sml
index 39894aa5..846a878b 100644
--- a/src/mono_reduce.sml
+++ b/src/mono_reduce.sml
@@ -45,7 +45,7 @@ fun simpleTypeImpure tsyms =
| TDatatype (n, _) => IS.member (tsyms, n)
| _ => false)
-fun simpleImpure (tsyms, syms) =
+fun simpleImpure isGlobal (tsyms, syms) =
U.Exp.existsB {typ = fn _ => false,
exp = fn (env, e) =>
case e of
@@ -65,7 +65,7 @@ fun simpleImpure (tsyms, syms) =
in
simpleTypeImpure tsyms t
end
- | EApp _ => true
+ | EApp _ => not isGlobal
| _ => false,
bind = fn (env, b) =>
case b of
@@ -326,7 +326,7 @@ fun reduce (file : file) =
case #1 e of
ENamed n => IM.find (absCounts, n)
| EApp (e, arg) =>
- if simpleImpure (timpures, impures) env arg then
+ if simpleImpure true (timpures, impures) env arg then
NONE
else
(case remaining e of
@@ -353,14 +353,14 @@ fun reduce (file : file) =
absCounts)
| DVal (_, n, _, e, _) =>
(timpures,
- if simpleImpure (timpures, impures) E.empty e then
+ if simpleImpure true (timpures, impures) E.empty e then
IS.add (impures, n)
else
impures,
IM.insert (absCounts, n, countAbs E.empty e))
| DValRec vis =>
(timpures,
- if List.exists (fn (_, _, _, e, _) => simpleImpure (timpures, impures) E.empty e) vis then
+ if List.exists (fn (_, _, _, e, _) => simpleImpure true (timpures, impures) E.empty e) vis then
foldl (fn ((_, n, _, _, _), impures) =>
IS.add (impures, n)) impures vis
else
@@ -533,7 +533,7 @@ fun reduce (file : file) =
end
val impure = fn env => fn e =>
- simpleImpure (timpures, impures) env e andalso impure e
+ simpleImpure false (timpures, impures) env e andalso impure e
andalso not (List.null (summarize ~1 e))
fun passive (e : exp) =