[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