summaryrefslogtreecommitdiff
path: root/compiler/coreSyn
diff options
context:
space:
mode:
authorSimon Peyton Jones <simonpj@microsoft.com>2013-01-25 13:26:18 +0000
committerSimon Peyton Jones <simonpj@microsoft.com>2013-01-25 13:26:18 +0000
commit0ab8cc19bc73f19cc91daea2b649faa7960bcf73 (patch)
treeec5495074a9c3869e364135869b06e9a754db06b /compiler/coreSyn
parente3426665b056ef9dcaa48722e2e33f260f055727 (diff)
parenta47ee23a82a669808569b3865383bf932b67fa95 (diff)
downloadhaskell-0ab8cc19bc73f19cc91daea2b649faa7960bcf73.tar.gz
Merge branch 'master' of http://darcs.haskell.org/ghc
Conflicts: compiler/basicTypes/DataCon.lhs
Diffstat (limited to 'compiler/coreSyn')
-rw-r--r--compiler/coreSyn/CoreUtils.lhs24
1 files changed, 22 insertions, 2 deletions
diff --git a/compiler/coreSyn/CoreUtils.lhs b/compiler/coreSyn/CoreUtils.lhs
index 7017f709cb..9b527e7fcf 100644
--- a/compiler/coreSyn/CoreUtils.lhs
+++ b/compiler/coreSyn/CoreUtils.lhs
@@ -1712,8 +1712,14 @@ tryEtaReduce bndrs body
---------------
fun_arity fun -- See Note [Arity care]
- | isLocalId fun && isStrongLoopBreaker (idOccInfo fun) = 0
- | otherwise = idArity fun
+ | isLocalId fun
+ , isStrongLoopBreaker (idOccInfo fun) = 0
+ | arity > 0 = arity
+ | isEvaldUnfolding (idUnfolding fun) = 1
+ -- See Note [Eta reduction of an eval'd function]
+ | otherwise = 0
+ where
+ arity = idArity fun
---------------
ok_lam v = isTyVar v || isEvVar v
@@ -1737,6 +1743,20 @@ tryEtaReduce bndrs body
ok_arg _ _ _ = Nothing
\end{code}
+Note [Eta reduction of an eval'd function]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+In Haskell is is not true that f = \x. f x
+because f might be bottom, and 'seq' can distinguish them.
+
+But it *is* true that f = f `seq` \x. f x
+and we'd like to simplify the latter to the former. This amounts
+to the rule that
+ * when there is just *one* value argument,
+ * f is not bottom
+we can eta-reduce \x. f x ===> f
+
+This turned up in Trac #7542.
+
%************************************************************************
%* *