[GHC] #14037: Fix fusion for GHC's utility functions

GHC ghc-devs at haskell.org
Thu Jul 27 11:42:16 UTC 2017


#14037: Fix fusion for GHC's utility functions
-------------------------------------+-------------------------------------
           Reporter:  goldfire       |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.3
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  Compile-time
  Unknown/Multiple                   |  performance bug
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 In a patchset I'm working on, I encountered a smallish "bytes allocated"
 regression in `perf/compiler/T5631`. After some sleuthing, I discovered
 that the regression is caused by using a `zipWith3M` where previously
 there was a `zipWithM`. Interestingly, it was not the zipped function that
 caused the problem, but the `zipWith3M` itself. Further sleuthing found
 that `zipWithM` is inlined into a combination of `sequenceA` and
 `zipWith`, both of which have been taught to work nicely with fusion.

 I thought of doing the same to GHC's `zipWith3M`, but I discovered that
 `base`'s `zipWith3` has no rules or inlining pragmas, suggesting that it
 does not fuse. I was quite surprised to find this, thinking that all
 functions as basic as `zipWith3` in `base` would play nicely with fusion.
 (Perhaps it does fuse -- I didn't actually check.) I then checked out
 GHC's `MonadUtils`, which defines a bunch of functions, some of which must
 be hammered on, and only one of which has any kind of performance-
 enhancing pragma. (The one is `zipWithAndUnzipM`, whose `INLINABLE` pragma
 was added only after much pain suffered by your dear author.)

 So: this ticket is a request to sweep through `MonadUtils` and `Util` and
 perhaps `ListSetOps`, looking for performance enhancements via fusion,
 tighter definitions, and such. Also, get `zipWith3` (and the other
 `zipWith`s) to fuse in `base`.

 I figure this is all some fairly low-hanging fruit for performance
 improvements in GHC.

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


More information about the ghc-tickets mailing list