[GHC] #7542: GHC doesn't optimize (strict) composition with id

GHC cvs-ghc at haskell.org
Fri Jan 25 14:32:30 CET 2013


#7542: GHC doesn't optimize (strict) composition with id
---------------------------------+------------------------------------------
    Reporter:  shachaf           |       Owner:                         
        Type:  bug               |      Status:  new                    
    Priority:  normal            |   Milestone:                         
   Component:  Compiler          |     Version:  7.6.1                  
    Keywords:                    |          Os:  Unknown/Multiple       
Architecture:  Unknown/Multiple  |     Failure:  Runtime performance bug
  Difficulty:  Unknown           |    Testcase:                         
   Blockedby:                    |    Blocking:                         
     Related:                    |  
---------------------------------+------------------------------------------

Comment(by simonpj):

 Also this:
 {{{
 commit 7a1480c7c590d4d2fa7a105a4eebf299e921e056
 Author: Simon Peyton Jones <simonpj at microsoft.com>
 Date:   Tue Jan 22 22:43:22 2013 +0000

     Allow eta-reduction of eval'd functions if of arity 1

     See Note [Eta reduction of an eval'd function] in CoreUtils.
     This doesn't fix Trac #7542, but that was the ticket that
     pointed out this infelicity.

 >---------------------------------------------------------------

  compiler/coreSyn/CoreUtils.lhs |   24 ++++++++++++++++++++++--
  1 files changed, 22 insertions(+), 2 deletions(-)

 diff --git a/compiler/coreSyn/CoreUtils.lhs
 b/compiler/coreSyn/CoreUtils.lhs index 7017f70..9b527e7 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.
 }}}

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/7542#comment:8>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler



More information about the ghc-tickets mailing list