[commit: ghc] ghc-7.2: Eta expand partial applications (b982db1)
Ian Lynagh
igloo at earth.li
Sun Jul 24 20:25:22 CEST 2011
Repository : ssh://darcs.haskell.org//srv/darcs/ghc
On branch : ghc-7.2
http://hackage.haskell.org/trac/ghc/changeset/b982db15d2a8e105907f85b30bcb2d87a82c3d86
>---------------------------------------------------------------
commit b982db15d2a8e105907f85b30bcb2d87a82c3d86
Author: Simon Peyton Jones <simonpj at microsoft.com>
Date: Thu Jul 21 12:54:51 2011 +0100
Eta expand partial applications
When we have
x = \v -> map g
we want to eta-expand to
x = \v y -> map g y
We weren't doing so, and that led to worse code and,
perhaps, #5285. I need to check the latter, but I
was certainly seeing one similar error. Anyway
this looks like a definite improvement
>---------------------------------------------------------------
compiler/simplCore/SimplUtils.lhs | 28 ++++++++++++++++++++++++----
1 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/compiler/simplCore/SimplUtils.lhs b/compiler/simplCore/SimplUtils.lhs
index 7d5d764..f01aa56 100644
--- a/compiler/simplCore/SimplUtils.lhs
+++ b/compiler/simplCore/SimplUtils.lhs
@@ -1117,17 +1117,20 @@ tryEtaExpand env bndr rhs
return (new_arity, new_rhs) }
where
try_expand dflags
+ | exprIsTrivial rhs
+ = return (exprArity rhs, rhs)
+
| sm_eta_expand (getMode env) -- Provided eta-expansion is on
- , not (exprIsTrivial rhs)
, let dicts_cheap = dopt Opt_DictsCheap dflags
new_arity = findArity dicts_cheap bndr rhs old_arity
- , new_arity > rhs_arity
+ , new_arity > manifest_arity -- And the curent manifest arity isn't enough
+ -- See Note [Eta expansion to manifes arity]
= do { tick (EtaExpansion bndr)
; return (new_arity, etaExpand new_arity rhs) }
| otherwise
- = return (rhs_arity, rhs)
+ = return (manifest_arity, rhs)
- rhs_arity = exprArity rhs
+ manifest_arity = manifestArity rhs
old_arity = idArity bndr
_dmd_arity = length $ fst $ splitStrictSig $ idStrictness bndr
@@ -1216,6 +1219,23 @@ because then 'genMap' will inline, and it really shouldn't: at least
as far as the programmer is concerned, it's not applied to two
arguments!
+Note [Eta expansion to manifest arity]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Eta expansion does *not* eta-expand trivial RHSs, like
+ x = y
+because these will get substituted out in short order. (Indeed
+we *eta-contract* if that yields a trivial RHS.)
+
+Otherwise we eta-expand to produce enough manifest lambdas.
+This *does* eta-expand partial applications. eg
+ x = map g --> x = \v -> map g v
+ y = \_ -> map g --> y = \_ v -> map g v
+One benefit this is that in the definition of y there was
+a danger that full laziness would transform to
+ lvl = map g
+ y = \_ -> lvl
+which is stupid. This doesn't happen in the eta-expanded form.
+
Note [Arity analysis]
~~~~~~~~~~~~~~~~~~~~~
The motivating example for arity analysis is this:
More information about the Cvs-ghc
mailing list