[commit: ghc] master: Teach DmdAnal that coercions are value arguments! (d5773a4)
git at git.haskell.org
git at git.haskell.org
Tue Apr 21 08:18:19 UTC 2015
Repository : ssh://git@git.haskell.org/ghc
On branch : master
Link : http://ghc.haskell.org/trac/ghc/changeset/d5773a4939b1feea51ec0db6624c9462751e948a/ghc
>---------------------------------------------------------------
commit d5773a4939b1feea51ec0db6624c9462751e948a
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date: Mon Apr 20 15:43:32 2015 +0100
Teach DmdAnal that coercions are value arguments!
The demand analyser was treating coercion args like type args,
which meant that the arguments in a strictness signature got
out of step with the arguments of a call. Result chaos and
disaster. Trac #10288 showed it up.
It's hard to get this bug to show up in practice because
- functions abstracted over coercions are usually abstracted
over *boxed* coercions
- we don't currently unbox a boxed-coercion arg because it's
GADT (I see how to fix this too)
But after floating, optimisation, and so on, Trac #10288 did
get a function abstracted over an unboxed coercion, and then
the -flate-dmd-anal pass went wrong.
I don't think I can come up with a test case, but I don't think
it matters too much.
Still to come
- Fix a second bug, namely that coercion variables are wrongly
marked as absent because DmdAnal doesn't check the the free
variables of casts. I think this never bites in practice
(see the follow-up commit)
- Make GADT products work with strictness analysis
>---------------------------------------------------------------
d5773a4939b1feea51ec0db6624c9462751e948a
compiler/stranal/DmdAnal.hs | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/compiler/stranal/DmdAnal.hs b/compiler/stranal/DmdAnal.hs
index bf6ca7d..2520f2a 100644
--- a/compiler/stranal/DmdAnal.hs
+++ b/compiler/stranal/DmdAnal.hs
@@ -164,15 +164,13 @@ dmdAnal' env dmd (App fun (Type ty))
where
(fun_ty, fun') = dmdAnal env dmd fun
-dmdAnal' sigs dmd (App fun (Coercion co))
- = (fun_ty, App fun' (Coercion co))
- where
- (fun_ty, fun') = dmdAnal sigs dmd fun
-
-- Lots of the other code is there to make this
-- beautiful, compositional, application rule :-)
-dmdAnal' env dmd (App fun arg) -- Non-type arguments
- = let -- [Type arg handled above]
+dmdAnal' env dmd (App fun arg)
+ = -- This case handles value arguments (type args handled above)
+ -- Crucially, coercions /are/ handled here, because they are
+ -- value arguments (Trac #10288)
+ = let
call_dmd = mkCallDmd dmd
(fun_ty, fun') = dmdAnal env call_dmd fun
(arg_dmd, res_ty) = splitDmdTy fun_ty
More information about the ghc-commits
mailing list