summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoachim Breitner <mail@joachim-breitner.de>2013-12-04 17:38:25 +0000
committerJoachim Breitner <mail@joachim-breitner.de>2013-12-16 21:30:00 +0100
commit59d4a8eb5fa34bdad8f4fa48f4679cf85a8e4b0d (patch)
tree73cc5f35de83523478b05dd07b0b71ad4f6023ef
parentfbe14a8e8861403c207dddd6c496096924293bef (diff)
downloadhaskell-59d4a8eb5fa34bdad8f4fa48f4679cf85a8e4b0d.tar.gz
Remove dmdAnalArg and replace by easier to understand code
-rw-r--r--compiler/stranal/DmdAnal.lhs16
1 files changed, 8 insertions, 8 deletions
diff --git a/compiler/stranal/DmdAnal.lhs b/compiler/stranal/DmdAnal.lhs
index 3b805d97c0..a377bf5cea 100644
--- a/compiler/stranal/DmdAnal.lhs
+++ b/compiler/stranal/DmdAnal.lhs
@@ -103,13 +103,12 @@ c) The application rule wouldn't be right either
evaluation of f in a C(L) demand!
\begin{code}
-dmdAnalArg :: AnalEnv
- -> Demand -- This one takes a *Demand*
- -> CoreExpr -> (DmdType, CoreExpr)
--- Used for function arguments
-dmdAnalArg env dmd e
- | exprIsTrivial e = dmdAnalStar env dmd e
- | otherwise = dmdAnalStar env (oneifyDmd dmd) e
+-- If e is complicated enough to become a thunk, its contents will be evaluated
+-- at most once, so oneify it.
+dmdTransformThunkDmd :: CoreExpr -> Demand -> Demand
+dmdTransformThunkDmd e
+ | exprIsTrivial e = id
+ | otherwise = oneifyDmd
-- Do not process absent demands
-- Otherwise act like in a normal demand analysis
@@ -177,7 +176,7 @@ dmdAnal env dmd (App fun arg) -- Non-type arguments
call_dmd = mkCallDmd dmd
(fun_ty, fun') = dmdAnal env call_dmd fun
(arg_dmd, res_ty) = splitDmdTy fun_ty
- (arg_ty, arg') = dmdAnalArg env arg_dmd arg
+ (arg_ty, arg') = dmdAnalStar env (dmdTransformThunkDmd arg arg_dmd) arg
in
-- pprTrace "dmdAnal:app" (vcat
-- [ text "dmd =" <+> ppr dmd
@@ -510,6 +509,7 @@ dmdTransform env var dmd
| otherwise -- Local non-letrec-bound thing
= unitVarDmd var (mkOnceUsedDmd dmd)
+
\end{code}
%************************************************************************