[GHC] #7994: Make foldl into a good consumer

GHC ghc-devs at haskell.org
Mon Jan 27 14:04:30 UTC 2014


#7994: Make foldl into a good consumer
-------------------------------------+------------------------------------
        Reporter:  simonpj           |            Owner:
            Type:  bug               |           Status:  new
        Priority:  normal            |        Milestone:
       Component:  Compiler          |          Version:  7.6.3
      Resolution:                    |         Keywords:
Operating System:  Unknown/Multiple  |     Architecture:  Unknown/Multiple
 Type of failure:  None/Unknown      |       Difficulty:  Unknown
       Test Case:                    |       Blocked By:
        Blocking:                    |  Related Tickets:
-------------------------------------+------------------------------------

Comment (by nomeata):

 Heh, in the previous numbers, I passed the arguments to `nofib-analyze` in
 the wrong order. So please swap signs.

 I now made sure that the `oneShot` makes it into the unfolding for
 `foldl`, which is a clear win. Now, relative to `master` again, I get this
 very nice result:

 {{{
 --------------------------------------------------------------------------------
         Program           Size    Allocs   Runtime   Elapsed  TotalMem
      bernouilli          -0.1%     +1.5%      0.14      0.14     +0.0%
    cryptarithm2          -0.0%     -0.5%      0.01      0.01     +0.0%
             fem          -0.0%     -2.8%      0.02      0.02     +0.0%
            fft2          -0.1%    -55.9%      0.04      0.04     +0.0%
     gen_regexps          -0.0%    -33.6%      0.00      0.00     +0.0%
       integrate          -0.1%    -59.4%      0.13      0.13     -1.0%
         minimax          -0.0%    -15.6%      0.00      0.00     +0.0%
        nucleic2          +0.9%     +1.7%      0.05      0.05     +0.0%
             scs          -0.0%     -0.9%     +1.0%     +0.5%     +0.0%
          simple          -0.1%     -9.4%      0.14      0.14     +0.0%
            x2n1          -0.1%    -74.5%      0.01      0.01     +0.0%
 --------------------------------------------------------------------------------
             Min          -0.2%    -74.5%     -3.0%     -3.0%    -50.0%
             Max          +0.9%     +1.7%     +4.0%     +3.4%    +10.4%
  Geometric Mean          -0.0%     -3.7%     -0.2%     -0.3%     -0.6%
 }}}

 So it seems to be well worth turning `foldl` into a good consumer, even if
 the resulting code is not perfect for complicated cases like `foldl .. ..
 $ concat $ ..`.

 The increase for `bernouilli` comes from this code line:
 {{{
 sum $ zipWith (*) powers (tail $ tail combs)
 }}}
 where originally, because `sum` is not a good consumer, no list fusion
 happens and a `sum` specialized to `Integer` is used, while after the
 change, `sum` is fused with `zipWith`, but not further, so now we have
 {{{
 foldr2 (\x y r eta -> r (eta + (x * y))) id powers (tail $ tail combs) 0.
 }}}
 This means that we are have elimiated one intermediate list, but we are
 allocating PAP ’s on each iteration, which is more expensive (three
 arguments instead of two!). This is verified by looking at ticky numbers.
 Maybe foldr2 should have been inlined here. Or we just live with it.

 Is this (explicit `oneShot`ness-annotations using a magic function) a path
 we want to go?

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


More information about the ghc-tickets mailing list