[GHC] #13227: Loss of full laziness in mapFB

GHC ghc-devs at haskell.org
Thu Feb 16 23:32:58 UTC 2017


#13227: Loss of full laziness in mapFB
-------------------------------------+-------------------------------------
        Reporter:  simonpj           |                Owner:  nomeata
            Type:  bug               |               Status:  closed
        Priority:  normal            |            Milestone:
       Component:  Compiler          |              Version:  8.0.1
      Resolution:  fixed             |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):  Phab:D3067
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by simonpj):

 I fixed a small bug in the new one-shot stuff, in this patch
 {{{
     commit fc9d152b058f21ab03986ea722d0c94688b9969f
     Author: Simon Peyton Jones <    simonpj at microsoft.com    >
     Date:   Thu Feb 16 09:41:55 2017 +0000

         Comments and tiny refactor only
 }}}
 Here's the critical bit
 {{{
 --- a/compiler/simplCore/OccurAnal.hs
 +++ b/compiler/simplCore/OccurAnal.hs
 @@ -1867,17 +1867,17 @@ occAnalApp env (Var fun, args, ticks)
         -- This is the *whole point* of the isRhsEnv predicate
         -- See Note [Arguments of let-bound constructors]

 -    n_val_args = valArgCount args + length (takeWhile isOneShotInfo
 (occ_one_shots env))
 -        -- See Note [Sources of one-shot information], bullet point A'
 -
 +    n_val_args = valArgCount args
      n_args     = length args
      fun_uds    = mkOneOcc env fun (n_val_args > 0) n_args
      is_exp     = isExpandableApp fun n_val_args
          -- See Note [CONLIKE pragma] in BasicTypes
          -- The definition of is_exp should match that in
 Simplify.prepareRhs

 -    one_shots  = argsOneShots (idStrictness fun) n_val_args
 -        -- See Note [Sources of one-shot information]
 +    one_shots  = argsOneShots (idStrictness fun) guaranteed_val_args
 +    guaranteed_val_args = n_val_args + length (takeWhile isOneShotInfo
 +                                                         (occ_one_shots
 env))
 +        -- See Note [Sources of one-shot information], bullet point A']
 }}}
 Notice that `guaranteed_val_args` should be used only for the call to
 `argOneShots`, not in the calls to `isExpandableApp` or `mkOneOcc`.

 I thoght this was just cleanup.  For example, `is_exp` only matters if
 `isRhsEnv` is true; and in that case I think `occ_one_shots` is empty (see
 `rhsCtxt`); so I doubt the change to `is_exp` makes any difference at all.

 Nevertheless it does: we observed a 7% reduction in allocation for
 `haddock.base` and `haddock.Cabal` after this one patch.  Bonkers!  I have
 no idea why.  But I'm just recording it here.

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


More information about the ghc-tickets mailing list